2023-10-22
encryption and decryption
0

目录

介绍
SM4加解密样例代码

介绍

SM4是一种对称加密算法,是中国国家密码管理局发布的商用加密算法标准,也被称为"SMS4"。它是一种分组密码,属于分组密码家族,类似于AES、DES等对称加密算法。下面是对SM4对称加密的简要介绍:

1. 对称加密算法: 对称加密算法使用相同的密钥来加密和解密数据。这意味着发送方和接收方都必须共享相同的密钥,这种密钥的管理可能会带来一些挑战。SM4是一种对称加密算法,它适用于保护数据的机密性。

2. SM4算法特点:

  • 分组密码: SM4算法对数据以128位(16字节)为一组进行加密和解密。
  • 密钥长度: SM4算法支持密钥长度为128位(16字节)。
  • 工作模式: SM4支持多种工作模式,如ECB(电子密码本模式)、CBC(密码块链接模式)等,以适应不同的应用需求。
  • 填充方式: SM4支持不同的填充方式,通常使用PKCS7Padding填充方式。

3. 加密和解密流程: SM4算法的加密和解密流程如下:

  • 明文被分成128位的数据块。
  • 初始轮密钥与明文进行轮函数操作。
  • 进行多轮的迭代加密,每轮中包括替代、置换、线性变换等操作。
  • 最后一轮的输出与最后一轮密钥进行异或操作。
  • 密文输出。

解密过程与加密过程相反,使用相同的密钥。

4. 适用领域: SM4对称加密算法在中国以及其他国家的加密领域得到广泛应用,特别是在金融、电子支付、电子政务、物联网(IoT)等领域。它提供了良好的安全性和性能,适用于对数据进行加密和解密以保护隐私和机密信息。

SM4加解密样例代码

java
package com.example.test.util; import cn.hutool.core.util.HexUtil; import org.apache.tomcat.util.codec.binary.Base64; import org.bouncycastle.jce.provider.BouncyCastleProvider; import javax.crypto.Cipher; import java.security.SecureRandom; import java.security.Security; import javax.crypto.spec.IvParameterSpec; import javax.crypto.spec.SecretKeySpec; /** * sm4加解密工具 * <p> * <b>记得重新生成KEY和IV</b> * * @author weizhenwang * @date 2023/10/22 */ public class SM4Util { /** * 密钥 */ private static final String KEY = "207331201bb0efee8778e70ed492225b"; /** * 盐 */ private static final String IV = "3bcf915e49de35c5fe202ed4f370e034"; /** * sm4加密 * * @param plaintext 明文 * @return {@link String} * @throws Exception 例外 */ public static String sm4Encrypt(String plaintext) throws Exception { Security.addProvider(new BouncyCastleProvider()); Cipher cipher = Cipher.getInstance("SM4/CBC/PKCS7Padding", "BC"); SecretKeySpec secretKeySpec = new SecretKeySpec(HexUtil.decodeHex(KEY), "SM4"); IvParameterSpec ivParameterSpec = new IvParameterSpec(HexUtil.decodeHex(IV)); cipher.init(Cipher.ENCRYPT_MODE, secretKeySpec, ivParameterSpec); byte[] encrypted = cipher.doFinal(plaintext.getBytes()); return Base64.encodeBase64String(encrypted); } /** * sm4解密 * * @param ciphertext 密文 * @return {@link String} * @throws Exception 例外 */ public static String sm4Decrypt(String ciphertext) throws Exception { Security.addProvider(new BouncyCastleProvider()); Cipher cipher = Cipher.getInstance("SM4/CBC/PKCS7Padding", "BC"); SecretKeySpec secretKeySpec = new SecretKeySpec(HexUtil.decodeHex(KEY), "SM4"); IvParameterSpec ivParameterSpec = new IvParameterSpec(HexUtil.decodeHex(IV)); cipher.init(Cipher.DECRYPT_MODE, secretKeySpec, ivParameterSpec); byte[] decrypted = cipher.doFinal(Base64.decodeBase64(ciphertext)); return new String(decrypted); } /** * 生成随机16 字节(128位)字节数组 * <p> * 用户生成KEY和IV * * @return {@link byte[]} */ public static byte[] generateRandomByte() { SecureRandom random = new SecureRandom(); byte[] iv = new byte[16]; random.nextBytes(iv); return iv; } public static void main(String[] args) { try { // 十六进制字符数组 System.out.println("16 字节(128位)字符串:" + HexUtil.encodeHexStr(generateRandomByte())); String plaintext = "Hello, World!"; String ciphertext = sm4Encrypt(plaintext); String decryptedText = sm4Decrypt(ciphertext); System.out.println("Original Text:" + plaintext); System.out.println("Encrypted Text:" + ciphertext); System.out.println("Decrypted Text:" + decryptedText); } catch (Exception e) { e.printStackTrace(); } } }