CS模式下的sm4加解密用Java实现
时间: 2024-03-28 14:39:43 浏览: 85
以下是CS模式下的SM4加解密的Java实现代码,其中采用了BouncyCastle库:
```java
import org.bouncycastle.crypto.BlockCipher;
import org.bouncycastle.crypto.CipherParameters;
import org.bouncycastle.crypto.engines.SM4Engine;
import org.bouncycastle.crypto.params.KeyParameter;
public class SM4Utils {
private static final String ALGORITHM_NAME = "SM4";
private static final int ENCRYPT_MODE = 1;
private static final int DECRYPT_MODE = 0;
/**
* SM4加密
*
* @param plainText 明文
* @param key 密钥
* @param iv 向量
* @return 密文
*/
public static byte[] encrypt(byte[] plainText, byte[] key, byte[] iv) {
return sm4(plainText, key, iv, ENCRYPT_MODE);
}
/**
* SM4解密
*
* @param cipherText 密文
* @param key 密钥
* @param iv 向量
* @return 明文
*/
public static byte[] decrypt(byte[] cipherText, byte[] key, byte[] iv) {
return sm4(cipherText, key, iv, DECRYPT_MODE);
}
private static byte[] sm4(byte[] data, byte[] key, byte[] iv, int mode) {
BlockCipher engine = new SM4Engine();
CipherParameters params = new KeyParameter(key);
engine.init(mode == ENCRYPT_MODE, params);
byte[] buf = new byte[engine.getOutputSize(data.length)];
int len = engine.processBytes(data, 0, data.length, buf, 0);
try {
engine.doFinal(buf, len);
} catch (Exception e) {
e.printStackTrace();
}
return buf;
}
}
```
其中,`ENCRYPT_MODE`和`DECRYPT_MODE`是加解密模式的常量,`sm4()`方法中的`engine.init()`用于初始化加解密引擎,`engine.processBytes()`用于加解密数据,`engine.doFinal()`用于完成加解密操作并返回结果。
阅读全文