您现在的位置是:首页 > 技术教程 正文

java运用SM4国密算法对文件的加密与解密的实现

admin 阅读: 2024-03-22
后台-插件-广告管理-内容页头部广告(手机)
  1. <dependency>
  2. <groupId>com.hutool</groupId>
  3. <artifactId>all</artifactId>
  4. <version>4.6.17</version>
  5. <scope>system</scope>
  6. <systemPath>${project.basedir}/src/main/webapp/lib/sm4/hutool-all-4.6.17.jar</systemPath>
  7. </dependency>
  8. <dependency>
  9. <groupId>com.bcprov</groupId>
  10. <artifactId>jdk15on</artifactId>
  11. <version>1.59</version>
  12. <scope>system</scope>
  13. <systemPath>${project.basedir}/src/main/webapp/lib/sm4/bcprov-jdk15on-1.59.jar</systemPath>
  14. </dependency>

首先我们在idae开发工具导入导入pom.xml的两个必要依赖

 jar包下载地址:百度网盘 请输入提取码   npn8

 图上systemPath为jar包的文件路径,我们需要使用以下的路径存储jar包。(也可以自己设置)

java包的文件路径如图所示

然后创建所需要加密的文件 ,需要加密的文件内容,并保存文件加密的地址。

以下是代码实现:

使用密钥"0123456789abcdeffedcba9876543210"对文件加解密

  1. import java.io.ByteArrayInputStream;
  2. import java.io.FileInputStream;
  3. import java.io.FileNotFoundException;
  4. import java.io.FileOutputStream;
  5. import java.io.IOException;
  6. import java.io.OutputStream;
  7. import java.security.InvalidKeyException;
  8. import java.security.Key;
  9. import java.security.NoSuchAlgorithmException;
  10. import java.security.NoSuchProviderException;
  11. import java.security.Security;
  12. import javax.crypto.Cipher;
  13. import javax.crypto.CipherOutputStream;
  14. import javax.crypto.NoSuchPaddingException;
  15. import javax.crypto.spec.SecretKeySpec;
  16. import cn.hutool.core.io.FileUtil;
  17. import cn.hutool.core.io.IoUtil;
  18. import org.bouncycastle.jcajce.io.CipherInputStream;
  19. import org.bouncycastle.jce.provider.BouncyCastleProvider;
  20. import org.bouncycastle.pqc.math.linearalgebra.ByteUtils;
  21. public class SM4Tools {
  22. public static void main(String[] args) throws Exception {
  23. String sp = "D:\\sm4jiami\\tt\\tt.txt";//原始文件
  24. String dp = "D:\\sm4jiami\\tt\\tt.txt加密文件";//加密后文件
  25. String dp2 = "D:\\sm4jiami\\tt\\tt.txt解密文件";//解密后文件
  26. // String key = "05d986b1141227cb20d46d0b56202024";
  27. // byte[] keyData = ByteUtils.fromHexString(key);
  28. //加密文件
  29. encryptFile(sp,dp);
  30. System.out.println("加密成功");
  31. //解密文件
  32. decryptFile(dp,dp2);
  33. System.out.println("解密成功");
  34. }
  35. private static String key = "0123456789abcdeffedcba9876543210"; //使用到的密钥对文件加密
  36. private static byte[] keyData = ByteUtils.fromHexString(key);
  37. static{
  38. if (Security.getProvider(BouncyCastleProvider.PROVIDER_NAME) == null){
  39. //No such provider: BC
  40. Security.addProvider(new BouncyCastleProvider());
  41. }
  42. }
  43. //生成 Cipher
  44. public static Cipher generateCipher(int mode,byte[] keyData) throws InvalidKeyException, NoSuchPaddingException, NoSuchAlgorithmException, NoSuchProviderException {
  45. Cipher cipher = Cipher.getInstance("SM4/ECB/PKCS5Padding", BouncyCastleProvider.PROVIDER_NAME);
  46. Key sm4Key = new SecretKeySpec(keyData, "SM4");
  47. cipher.init(mode, sm4Key);
  48. return cipher;
  49. }
  50. //加密文件
  51. public static void encryptFile(String sourcePath,String targetPath){
  52. //加密文件
  53. try {
  54. Cipher cipher = generateCipher(Cipher.ENCRYPT_MODE,keyData);
  55. CipherInputStream cipherInputStream = new CipherInputStream(new FileInputStream(sourcePath), cipher);
  56. FileUtil.writeFromStream(cipherInputStream, targetPath);
  57. IoUtil.close(cipherInputStream);
  58. } catch (InvalidKeyException e) {
  59. e.printStackTrace();
  60. } catch (NoSuchPaddingException e) {
  61. e.printStackTrace();
  62. } catch (NoSuchAlgorithmException e) {
  63. e.printStackTrace();
  64. } catch (NoSuchProviderException e) {
  65. e.printStackTrace();
  66. } catch (FileNotFoundException e) {
  67. e.printStackTrace();
  68. }
  69. }
  70. /**
  71. * 解密文件
  72. * @param sourcePath 待解密的文件路径
  73. * @param targetPath 解密后的文件路径
  74. */
  75. public static void decryptFile(String sourcePath, String targetPath) {
  76. FileInputStream in =null;
  77. ByteArrayInputStream byteArrayInputStream =null;
  78. OutputStream out = null;
  79. CipherOutputStream cipherOutputStream=null;
  80. try {
  81. in = new FileInputStream(sourcePath);
  82. byte[] bytes = IoUtil.readBytes(in);
  83. byteArrayInputStream = IoUtil.toStream(bytes);
  84. Cipher cipher = generateCipher(Cipher.DECRYPT_MODE,keyData);
  85. out = new FileOutputStream(targetPath);
  86. cipherOutputStream = new CipherOutputStream(out, cipher);
  87. IoUtil.copy(byteArrayInputStream, cipherOutputStream);
  88. } catch (IOException e) {
  89. e.printStackTrace();
  90. } catch (NoSuchPaddingException e) {
  91. e.printStackTrace();
  92. } catch (NoSuchAlgorithmException e) {
  93. e.printStackTrace();
  94. } catch (InvalidKeyException e) {
  95. e.printStackTrace();
  96. } catch (NoSuchProviderException e) {
  97. e.printStackTrace();
  98. }finally {
  99. IoUtil.close(cipherOutputStream);
  100. IoUtil.close(out);
  101. IoUtil.close(byteArrayInputStream);
  102. IoUtil.close(in);
  103. }
  104. }
  105. }

运行代码

代码运行成功

我们可以看到文件路径上多了两个文件,分别是加解密后的文件

我们用右键选择打开方式,用文本的方式打开可以看到加密后的信息如下

ok我们加密成功了!同理解密的文件也能解密成功

以上就是java对sm4国密算法的加密解密方式。

标签:
声明

1.本站遵循行业规范,任何转载的稿件都会明确标注作者和来源;2.本站的原创文章,请转载时务必注明文章作者和来源,不尊重原创的行为我们将追究责任;3.作者投稿可能会经我们编辑修改或补充。

在线投稿:投稿 站长QQ:1888636

后台-插件-广告管理-内容页尾部广告(手机)
关注我们

扫一扫关注我们,了解最新精彩内容

搜索