public class SM4Cipher
extends com.supermap.data.InternalHandleDisposable
// 密钥key 长度必须是 16 byte即128 bitString
key = "12345678abcdefgh"; // 初始向量iv 长度必须是 16 byte即128 bitString
iv = "hgfedcba87654321";String
msg = "Hello the world!";SM4Cipher
cipher =SM4Cipher
.getInstance("CTR", key.getBytes(), iv.getBytes()); byte[] encrypted = cipher.encrypt(msg.getBytes()); byte[] result = cipher.decrypt(encrypted);String
resultString = newString
(result);
限定符和类型 | 类和说明 |
---|---|
static class |
SM4Cipher.GCMEncryptResult
GCM模式加密结果
|
构造器和说明 |
---|
SM4Cipher() |
限定符和类型 | 方法和说明 |
---|---|
byte[] |
decrypt(byte[] input)
解密操作
|
byte[] |
decryptGCM(byte[] input,
byte[] aad,
byte[] tag)
GCM解密操作
|
void |
dispose()
释放资源
|
byte[] |
encrypt(byte[] input)
加密操作
|
SM4Cipher.GCMEncryptResult |
encryptGCM(byte[] input,
byte[] aad,
int tagLength)
GCM加密操作
|
static SM4Cipher |
getInstance(String transformation,
byte[] key,
byte[] iv)
创建SM4(国密4)加解密对象,目前支持CTR和CBC模式(使用
SM4Cipher.encrypt(byte[]) 加密、SM4Cipher.decrypt(byte[]) 解密)。 |
public static SM4Cipher getInstance(String transformation, byte[] key, byte[] iv)
SM4Cipher.encrypt(byte[])
加密、SM4Cipher.decrypt(byte[])
解密)。还支持GCM模式使用SM4Cipher.encryptGCM(byte[], byte[], int)
加密和SM4Cipher.decryptGCM(byte[], byte[], byte[])
解密。transformation
- 模式字符串,支持'CTR'、'CBC'和'GCM'key
- 加解密密钥, 长度只能是 16 byte即128 bitiv
- 初始向量, 长度只能是 16 byte即128 bitIllegalArgumentException
- transformation为空或者长度为0IllegalArgumentException
- key为空IllegalArgumentException
- key长度不为16位IllegalArgumentException
- iv为空IllegalArgumentException
- iv长度不为16位public byte[] encrypt(byte[] input)
input
- 输入的缓冲区IllegalStateException
- 对象已经被disposeIllegalArgumentException
- 输入的缓冲区为空IllegalArgumentException
- 输入的缓冲区长度必须为16的倍数查看示例
public SM4Cipher.GCMEncryptResult encryptGCM(byte[] input, byte[] aad, int tagLength)
input
- 输入的缓冲区aad
- 附加消息(AAD,Additional Authenticated Data)附加消息是可选的输入,用于提供额外的上下文信息,最终被包含在消息认证码(MAC)计算中。如果不需要,可以设置为null。tagLength
- 需要传出的认证标签长度。不能超过16字节。如果不需要,可以设置为0。IllegalStateException
- 对象已经被disposeIllegalArgumentException
- 输入的缓冲区为空IllegalArgumentException
- 输入的缓冲区长度必须为16的倍数IllegalArgumentException
- 输入的认证标签长度小于0或者大于16// 密钥key 长度必须是 16 byte即128 bitString
key = "12345678abcdefgh"; // 初始向量iv 长度必须是 16 byte即128 bitString
iv = "hgfedcba87654321"; // aad-附加消息长度和内容任意,这个内容不会被加密,但是会用于计算认证标签,所以需要加解密输入相同内容String
aad = "000111222333444555666777"; // 输入加解密的数据长度必须是16 byte的整数倍String
msg = "Hello the world!";SM4Cipher
cipher =SM4Cipher
.getInstance("GCM", key.getBytes(), iv.getBytes()); int tagLength = 16;SM4Cipher
.GCMEncryptResult gcmEncryptResult = cipher.encryptGCM(msg.getBytes(), aad.getBytes(), tagLength); byte[] encrypted = gcmEncryptResult.getResult(); // 还需要从加密结果中获取到认证标签,传入解密函数中才能正确解密 byte[] tag = gcmEncryptResult.getTag(); byte[] result = cipher.decryptGCM(encrypted, aad.getBytes(), tag);String
resultString = newString
(result);
public byte[] decrypt(byte[] input)
input
- 输入的缓冲区IllegalStateException
- 对象已经被disposeIllegalArgumentException
- 输入的缓冲区为空IllegalArgumentException
- 输入的缓冲区长度必须为16的倍数查看示例
public byte[] decryptGCM(byte[] input, byte[] aad, byte[] tag)
input
- 输入的缓冲区aad
- 附加消息(AAD,Additional Authenticated Data)附加消息是可选的输入,用于提供额外的上下文信息,最终被包含在消息认证码(MAC)计算中。如果不需要,可以设置为null。tag
- GCM模式加密过程计算出的认证标签。用于验证加密数据的完整性和认证数据的真实性。如果不需要,可以设置为null。SM4Cipher.encryptGCM(byte[], byte[], int)
IllegalStateException
- 对象已经被disposeIllegalArgumentException
- 输入的缓冲区为空IllegalArgumentException
- 输入的缓冲区长度必须为16的倍数IllegalArgumentException
- 输入的认证标签长度必须小于16public void dispose()
Copyright © 2021–2024 SuperMap. All rights reserved.