首页 > 编程语言 >【实战】国密4(SM4)使用 .NET 和 Java 相互加解密

【实战】国密4(SM4)使用 .NET 和 Java 相互加解密

时间:2023-05-05 20:58:40浏览次数:57  
标签:Base64 Java SM4 加解密 var 加密 NET

需求:由于朋友项目上需要和第三方对接,数据在传输过程中使用国密4(SM4)算法进行了加密,需要双方对数据进行加密和解密操作,第三方使用的是 Java 开发的项目,朋友使用的是 .NET 开发的项目。

SM4.0(原名SMS4.0)是中华人民共和国政府采用的一种分组密码标准,由国家密码管理局于2012年3月21日发布。相关标准为“GM/T 0002-2012《SM4分组密码算法》(原SMS4分组密码算法)”。

信息安全技术 SM4分组密码算法:https://openstd.samr.gov.cn/bzgk/gb/newGbInfo?hcno=7803DE42D3BC5E80B0C3E5D8E873D56A

Java 项目

新建了一个 maven 项目,引入了 hutool 工具,使用 hutool 中封装好的 SM4 算法,pom 文件引入如下:

  1.     <dependencies>
  2.         <dependency>
  3.             <groupId>cn.hutool</groupId>
  4.             <artifactId>hutool-all</artifactId>
  5.             <version>5.8.5</version>
  6.         </dependency>
  7.         <dependency>
  8.             <groupId>org.bouncycastle</groupId>
  9.             <artifactId>bcpkix-jdk15on</artifactId>
  10.             <version>1.60</version>
  11.         </dependency>
  12.     </dependencies>
复制代码

文档:https://hutool.cn/docs/#/crypto/%E5%AF%B9%E7%A7%B0%E5%8A%A0%E5%AF%86-SymmetricCrypto

.NET 项目

.NET 项目需要引入我封装好的 Sw.ChinaEncryptSM 包,支持 .NET Framework 和 .NET Core 项目,使用 nuget 命令如下:

  1. Install-Package Sw.ChinaEncryptSM -Version 1.0.0
复制代码


地址:https://www.nuget.org/packages/Sw.ChinaEncryptSM/

测试 .NET 和 Java 加密结果

.NET 代码:

  1. using Sw.ChinaEncryptSM;
  2.  
  3. var key = "xG1BWyO9jGmehXTFkhiNSQ==";
  4. var iv = "v3mVmxORBMedfZWsIRRloQ==";
  5. SM4Utils sM4Utils = new SM4Utils()
  6. {
  7.     secretKey = key,
  8.     iv = iv
  9. };
  10. var result1 = sM4Utils.Encrypt_CBC_Base64("小渣渣 itsvse.com");
  11. Console.WriteLine("加密结果如下:");
  12. Console.WriteLine(result1);
  13.  
复制代码

Java 代码:

  1.   SymmetricCrypto sm4 = new SymmetricCrypto("SM4/CBC/PKCS5Padding",Base64.decode("xG1BWyO9jGmehXTFkhiNSQ=="));
  2.                 sm4.setIv(Base64.decode("v3mVmxORBMedfZWsIRRloQ=="));
  3.                 byte[] result= sm4.encrypt("小渣渣 itsvse.com");
  4.                 System.out.println("加密后: " + Base64.encode(result));
复制代码

可以看到在 key 和 iv 相同的情况下,加密后的结果是一样的,如下图:



.NET 加解密和 Java 解密

此处略去使用 Java 加密 .NET 加密的代码,大家举一反三即可。

.NET 代码:

  1. using Sw.ChinaEncryptSM;
  2.  
  3. var key = "xG1BWyO9jGmehXTFkhiNSQ==";
  4. var iv = "v3mVmxORBMedfZWsIRRloQ==";
  5. SM4Utils sM4Utils = new SM4Utils()
  6. {
  7.     secretKey = key,
  8.     iv = iv
  9. };
  10. var result1 = sM4Utils.Encrypt_CBC_Base64("Test 小渣渣 itsvse.com");
  11. Console.WriteLine("加密结果如下:");
  12. Console.WriteLine(result1);
  13. Console.WriteLine("解密结果如下:");
  14. var result2 = sM4Utils.Decrypt_CBC_Base64(result1);
  15. Console.WriteLine(result2);
  16.  
复制代码

Java 代码:

  1.   SymmetricCrypto sm4 = new SymmetricCrypto("SM4/CBC/PKCS5Padding",Base64.decode("xG1BWyO9jGmehXTFkhiNSQ=="));
  2.                 sm4.setIv(Base64.decode("v3mVmxORBMedfZWsIRRloQ=="));
  3.                 byte[] result = sm4.decrypt(Base64.decode("rG50B+Ah6k0FqvvKItc2TDJnt9HcDIG9OyjBqkiiAlI="));
  4.                 System.out.println("明文: " + new String(result, StandardCharsets.UTF_8));
复制代码

如下图:

加密结果如下:
rG50B+Ah6k0FqvvKItc2TDJnt9HcDIG9OyjBqkiiAlI=
解密结果如下:
Test 小渣渣 itsvse.com




(完)

标签:Base64,Java,SM4,加解密,var,加密,NET
From: https://www.cnblogs.com/itsvse/p/17375322.html

相关文章

  • java基础-什么是方法,方法的定义和调用,方法的重载,方法的内存
    一、什么是方法方法method是程序中最小的执行单元。在实际开发中,可以将重复的代码、具有独立功能的代码抽取到方法中,这样可以提高代码的复用性和可维护性。二、方法的定义(打包)和调用注意:方法要写在main主方法的外面(在main方法外面定义)。1、最简单的方法定义和调用//最简单......
  • javaNIO多线程worker实现
    boss线程负责接收连接,worker线程负责处理IO事件。packagenet.yury.nio;importjava.io.IOException;importjava.net.InetSocketAddress;importjava.nio.ByteBuffer;importjava.nio.channels.*;importjava.nio.charset.StandardCharsets;importjava.util.ArrayList;......
  • java安全
    java——sql注入:防御sql注入,其实就是session,参数绑定,存储过程这样的注入。//利用session防御,session内容正常情况下是用户无法修改的select*fromuserswhereuser=“'”+session.getAttribute("UserID")+"'";//参数绑定方式,利用了sq1的预编译技术Stringquery="SELECT......
  • Java的反射用途及其获取反射的三种方法
    (1)反射的用途有多种:①框架设计:在框架设计中,我们通常需要使用反射技术来解耦,使框架可扩展和灵活。②单元测试:在单元测试中,我们可以使用反射技术来访问私有或受保护的类成员,使测试更加全面。③动态代理:使用反射技术可以创建动态代理对象,从而可以在运行时期代理任意的......
  • Java--抽象
    Java--抽象抽象的概念如果父类当中的方法不确定如何进行{}方法体的实现,那么这就应该是一个抽象方法抽象方法和抽象类的格式抽象方法:就是加上abstract关键字,然后去掉大括号,直接分号结束.抽象类:抽象方法所在的类,必须是抽象类才行,在class之前写上abstract即可.代码示......
  • java基于springboot+vue的垃圾分类管理系统,附源码+文档+PPT+数据库
    1、项目介绍垃圾分类网站的主要使用者分为管理员和用户、垃圾分类管理员,实现功能包括管理员:首页、个人中心、用户管理、垃圾分类管理员管理、垃圾分类管理、垃圾类型管理、垃圾图谱管理、系统管理,垃圾分类管理员;首页、个人中心、用户管理、垃圾分类管理员管理、垃圾分类管理、垃......
  • 22基于java的电影院售票管理系统
    项目背景随着互联网和电子商务的快速发展,开发一个电影院订票系统来帮助电影院对电影信息,售票信息进行统一化的信息管理;遇到的问题在设计的过程中,需要解决以下的几个问题:电影院会有多个播放厅,从而在同一时间播放不同的电影来满足客户需求每个厅的大小可能不同,即容纳的人数不......
  • java 手动校验dto
    1在Java中进行手动校验DTO的方法有很多种,这里提供一种常用的校验方法,使用HibernateValidator实现:231.添加依赖45首先需要在Maven或Gradle中添加HibernateValidator的依赖:67Maven:89```xml10<dependency>11<groupId>......
  • java获取jdk、系统、服务器等信息
    1、获取jdk信息System.out.println(System.getProperty("java.version"));System.out.println(System.getProperty("java.vendor"));System.out.println(System.getProperty("java.vendor.url"));System.......
  • 关于java反射机制基础资料
    Java的反射机制允许在程序运行期间,借助反射API获取类的内部信息,并能直接操作对象的内部属性及方法。Java反射机制提供的功能:在运行时,使用反射分析类的能力,获取有关类的一切信息(类所在的包、类实现的接口、标注的注解、类的数据域、类的构造器、类的方法等)在运行时,使用反......