文章目录
前言一、使用步骤1.引入库2.创建maven测试工程2.开始编写对称加密SM4测试方法3.测试结果
二、如何定制自己的密钥?如下面的代码所示:
总结
前言
上次总结了一下加密算法的分类(加密算法有几种形式,各有什么不同?),现在我们用java语言实现一下SM4:无线局域网标准的分组数据算法。对称加密,密钥长度和分组长度均为128位。
ps:我们既可以基于Java 原生实现加密和解密,又可以基于第三方的工具包实现。下面我们首先介绍基于第三方工具包 hutool,如果是项目的话建议直接使用第三方的工具。
一、使用步骤
1.引入库
在项目的pom.xml的dependencies中加入以下内容:
<dependency>
<groupId>cn.hutool
</groupId>
<artifactId>hutool-all
</artifactId>
<version>5.4.5
</version>
</dependency>
<dependency>
<groupId>org.bouncycastle
</groupId>
<artifactId>bcprov-jdk15to18
</artifactId>
<version>1.66
</version>
</dependency>
说明: bcprov-jdk15to18的版本请前往Maven中央库搜索,查找对应JDK的最新版本。
2.创建maven测试工程
2.开始编写对称加密SM4测试方法
package org
.xiangbiao
;
import cn
.hutool
.core
.util
.CharsetUtil
;
import cn
.hutool
.crypto
.SmUtil
;
import cn
.hutool
.crypto
.symmetric
.SymmetricCrypto
;
public class SM4Test
{
public static void main( String
[] args
)
{
String content
= "fisco bcos";
SymmetricCrypto sm4
= SmUtil
.sm4();
String encryptHex
= sm4
.encryptHex(content
);
String decryptStr
= sm4
.decryptStr(encryptHex
, CharsetUtil
.CHARSET_UTF_8
);
System
.out
.println(encryptHex
+"\r\n"+decryptStr
);
}
}
3.测试结果
二、如何定制自己的密钥?
如下面的代码所示:
package org
.xiangbiao
;
import cn
.hutool
.core
.util
.CharsetUtil
;
import cn
.hutool
.crypto
.SmUtil
;
import cn
.hutool
.crypto
.symmetric
.SymmetricCrypto
;
public class SM4Test
{
public static void main( String
[] args
)
{
String content
= "fisco bcos";
String key
="1234567890123456";
SymmetricCrypto sm4
= SmUtil
.sm4(key
.getBytes());
String encryptHex
= sm4
.encryptHex(content
);
String decryptStr
= sm4
.decryptStr(encryptHex
, CharsetUtil
.CHARSET_UTF_8
);
System
.out
.println(encryptHex
+"\r\n"+decryptStr
);
}
}
总结
有小伙伴在使用自己自定义的密钥报错如下:
Exception in thread
"main" cn
.hutool
.crypto
.CryptoException
: InvalidKeyException
: SM4 requires a
128 bit key
at cn
.hutool
.crypto
.symmetric
.SymmetricCrypto
.encrypt(SymmetricCrypto
.java
:209)
at cn
.hutool
.crypto
.symmetric
.SymmetricCrypto
.encrypt(SymmetricCrypto
.java
:312)
at cn
.hutool
.crypto
.symmetric
.SymmetricCrypto
.encryptHex(SymmetricCrypto
.java
:322)
at org
.xiangbiao
.SM4Test
.main(SM4Test
.java
:20)
Caused by
: java
.security
.InvalidKeyException
: SM4 requires a
128 bit key
at org
.bouncycastle
.jcajce
.provider
.symmetric
.util
.BaseBlockCipher
.engineInit(Unknown Source
)
at javax
.crypto
.Cipher
.init(Cipher
.java
:1245)
at javax
.crypto
.Cipher
.init(Cipher
.java
:1185)
at cn
.hutool
.crypto
.symmetric
.SymmetricCrypto
.encrypt(SymmetricCrypto
.java
:203)
... 3 more
注意:128 bit = 128 / 8 = 16 byte