java中使用国密SM4算法详解

it2024-03-31  48

文章目录

前言一、使用步骤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; /** *SM4Test * @author larry.xiang * */ 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; /** *SM4Test * @author larry.xiang * */ public class SM4Test { public static void main( String[] args ) { String content = "fisco bcos"; // key必须是16位 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

最新回复(0)