java国密 C#国密 golang国密 NodeJS国密汇总(三)

  • 2023/05/02更新说明
  • 前言
  • 4、SM3计算摘要
    • (1)java
    • (2)c#
    • (3)nodejs
    • (4)golang
  • 总结

2023/05/02更新说明

1、修复明文中包含中文或者标点符号等特殊字符时,摘要计算结果不一致的问题,修复方法是先加明文做base64处理,因为base64的结果都是一致的。具体看下方注释和新增代码。


前言

  不知不觉已经2023年了,最近工作比较忙,各种问题和项目改造,这篇博客就一直拖延到现在,希望各位读者见谅。
  闲话就说到这,让我们一起回顾下之前两期的内容,第一期博主主要演示了java、C#、nodejs、golang4种开发语言的sm2密钥对生成的代码,传送门:java国密 C#国密 golang国密 NodeJS国密汇总(一),第二期博主主要演示了java、C#、nodejs、golang4种开发语言的sm2加签验签、加密解密的代码,传送门:java国密 C#国密 golang国密 NodeJS国密汇总(二)。回顾完后博主就开始本期的内容演示,本期主要把四种开发语言的SM3杂凑算法整上,希望对各位观众大佬有所帮助。


4、SM3计算摘要

由于sm3比较简单,所以这边也不做过多篇幅说明,~~**但是中文需要转码才可以,并且对特殊字符无法处理 **,这两个注意点在演示代码中的注释里有说明。

(1)java

代码示例(中文或者特殊字符遗留问题已解决):

package sm3;import org.bouncycastle.crypto.digests.SM3Digest;
import org.bouncycastle.util.encoders.Hex;import java.io.UnsupportedEncodingException;
import java.net.URLEncoder;
import java.nio.charset.StandardCharsets;/*** @Author: 系统异常* @CreateTime: 2022/12/26 14:45* @Description: sm3测试类* @Version: 1.0*/
public class SM3Test {public static void main(String[] args) throws UnsupportedEncodingException {// 定义数组byte[] sm3Byte = new byte[32];// 初始化sm3SM3Digest sm3 = new SM3Digest();// 待摘要字符串、数字String unSm3Str = "12345678";sm3.update(unSm3Str.getBytes(StandardCharsets.UTF_8), 0, unSm3Str.length());sm3.doFinal(sm3Byte, 0);String sm3StrHex = new String(Hex.encode(sm3Byte));System.out.println("java sm3StrHex 数字     -->" + sm3StrHex);// 待摘要字符串、字母unSm3Str = "abcdefg";sm3.update(unSm3Str.getBytes(StandardCharsets.UTF_8), 0, unSm3Str.length());sm3.doFinal(sm3Byte, 0);sm3StrHex = new String(Hex.encode(sm3Byte));System.out.println("java sm3StrHex 字母     -->" + sm3StrHex);// 2023/05/02 修复明文中包含中文或者标点符号等特殊字符时,摘要计算结果不一致的问题,修复方法是先加明文做base64处理,因为base64的结果都是一致的。// 待摘要字符串、中文unSm3Str = "你好,世界";String changeCodeStr = Base64.toBase64String(unSm3Str.getBytes(StandardCharsets.UTF_8));System.out.println("java 中文base64后       -->" + changeCodeStr);sm3.update(changeCodeStr.getBytes(StandardCharsets.UTF_8), 0, changeCodeStr.length());sm3.doFinal(sm3Byte, 0);sm3StrHex = new String(Hex.encode(sm3Byte));System.out.println("java sm3StrHex 中文     -->" + sm3StrHex);// 特殊字符、unSm3Str = ",./;'<>?:\"!@#$%^&*()_+-=`";changeCodeStr = Base64.toBase64String(unSm3Str.getBytes(StandardCharsets.UTF_8));System.out.println("java 特殊字符base64后   -->" + changeCodeStr);sm3.update(changeCodeStr.getBytes(StandardCharsets.UTF_8), 0, changeCodeStr.length());sm3.doFinal(sm3Byte, 0);sm3StrHex = new String(Hex.encode(sm3Byte));System.out.println("java sm3StrHex 特殊字符 -->" + sm3StrHex);}
}

演示结果(各种语言的结果中特殊字符不一致、暂未解决,其他情况均测试一致 ):

java sm3StrHex 数字     -->0fffff81e971fa3f09107abf77931463fc0710bfb8962efeae3d5654b073bb0c
java sm3StrHex 字母     -->08b7ee8f741bfb63907fcd0029ae3fd6403e6927b50ed9f04665b22eab81e9b7
java 中文base64后       -->5L2g5aW977yM5LiW55WM
java sm3StrHex 中文     -->3d22faa1b58113903211b22bfd7c119f9b70d9993abb8239ac382b41a315ce3a
java 特殊字符base64后   -->LC4vOyc8Pj86IiFAIyQlXiYqKClfKy09YA==
java sm3StrHex 特殊字符 -->95cbbf02e028fbe9e4514e60c321a0329559e60c2e1b6ddc52124706b2147e90

(2)c#

代码示例(中文或者特殊字符遗留问题已解决):

using Org.BouncyCastle.Crypto.Digests;
using Org.BouncyCastle.Utilities.Encoders;
using System;
using System.Collections.Generic;
using System.Text;/// <summary>
/// 九二战歌
/// sm3摘要计算演示
/// </summary>
namespace sm
{class Sm3Test{public void Sm3Calculate(){// 定义数组byte[] sm3Byte = new byte[32];// 初始化sm3SM3Digest sm3 = new SM3Digest();// 待摘要字符串、数字string unSm3Str = "12345678";sm3.BlockUpdate(Encoding.UTF8.GetBytes(unSm3Str), 0, unSm3Str.Length);sm3.DoFinal(sm3Byte, 0);String sm3StrHex = new String(Hex.ToHexString(sm3Byte));Console.WriteLine("csharp sm3StrHex 数字     -->" + sm3StrHex);// 待摘要字符串、字母unSm3Str = "abcdefg";sm3.BlockUpdate(Encoding.UTF8.GetBytes(unSm3Str), 0, unSm3Str.Length);sm3.DoFinal(sm3Byte, 0);sm3StrHex = new String(Hex.ToHexString(sm3Byte));Console.WriteLine("csharp sm3StrHex 字母     -->" + sm3StrHex);// 2023/05/02 修复明文中包含中文或者标点符号等特殊字符时,摘要计算结果不一致的问题,修复方法是先加明文做base64处理,因为base64的结果都是一致的。// 待摘要字符串、中文unSm3Str = "你好,世界";String changeCodeStr = Base64.ToBase64String(Encoding.UTF8.GetBytes(unSm3Str));Console.WriteLine("csharp 中文base64后       -->" + changeCodeStr);sm3.BlockUpdate(Encoding.UTF8.GetBytes(changeCodeStr), 0, changeCodeStr.Length);sm3.DoFinal(sm3Byte, 0);sm3StrHex = new String(Hex.ToHexString(sm3Byte));Console.WriteLine("csharp sm3StrHex 中文     -->" + sm3StrHex);// 待摘要字符串、特殊字符unSm3Str = ",./;'<>?:\"!@#$%^&*()_+-=`";changeCodeStr = Base64.ToBase64String(Encoding.UTF8.GetBytes(unSm3Str));Console.WriteLine("csharp 特殊字符base64后   -->" + changeCodeStr);sm3.BlockUpdate(Encoding.UTF8.GetBytes(changeCodeStr), 0, changeCodeStr.Length);sm3.DoFinal(sm3Byte, 0);sm3StrHex = new String(Hex.ToHexString(sm3Byte));Console.WriteLine("csharp sm3StrHex 特殊字符 -->" + sm3StrHex);}}
}

演示结果(各种语言的结果中特殊字符不一致、暂未解决,其他情况均测试一致 ):

csharp sm3StrHex 数字     -->0fffff81e971fa3f09107abf77931463fc0710bfb8962efeae3d5654b073bb0c
csharp sm3StrHex 字母     -->08b7ee8f741bfb63907fcd0029ae3fd6403e6927b50ed9f04665b22eab81e9b7
csharp 中文base64后       -->5L2g5aW977yM5LiW55WM
csharp sm3StrHex 中文     -->3d22faa1b58113903211b22bfd7c119f9b70d9993abb8239ac382b41a315ce3a
csharp 特殊字符base64后   -->LC4vOyc8Pj86IiFAIyQlXiYqKClfKy09YA==
csharp sm3StrHex 特殊字符 -->95cbbf02e028fbe9e4514e60c321a0329559e60c2e1b6ddc52124706b2147e90

(3)nodejs

代码示例:

const sm3 = require('sm-crypto').sm3;function sm3Test() {// 待摘要字符串、数字let unSm3Str = "12345678";let sm3StrHex = sm3(unSm3Str);console.log("nodejs sm3StrHex 数字     -->" + sm3StrHex);// 待摘要字符串、字母unSm3Str = "abcdefg";sm3StrHex = sm3(unSm3Str);console.log("nodejs sm3StrHex 字母     -->" + sm3StrHex);// 2023/05/02 修复明文中包含中文或者标点符号等特殊字符时,摘要计算结果不一致的问题,修复方法是先加明文做base64处理,因为base64的结果都是一致的。// 待摘要字符串、中文unSm3Str = "你好,世界";let changeCodeStr = Buffer.from(unSm3Str).toString('base64');console.log("nodejs 中文base64后       -->" + changeCodeStr);sm3StrHex = sm3(changeCodeStr);console.log("nodejs sm3StrHex 中文     -->" + sm3StrHex);// 特殊字符unSm3Str = ",./;'<>?:\"!@#$%^&*()_+-=`";changeCodeStr = Buffer.from(unSm3Str).toString('base64');console.log("nodejs 特殊字符base64后   -->" + changeCodeStr);sm3StrHex = sm3(changeCodeStr);console.log("nodejs sm3StrHex 特殊字符 -->" + sm3StrHex);
}sm3Test()

演示结果(各种语言的结果中特殊字符不一致、暂未解决,其他情况均测试一致 ):

nodejs sm3StrHex 数字     -->0fffff81e971fa3f09107abf77931463fc0710bfb8962efeae3d5654b073bb0c
nodejs sm3StrHex 字母     -->08b7ee8f741bfb63907fcd0029ae3fd6403e6927b50ed9f04665b22eab81e9b7
nodejs 中文base64后       -->5L2g5aW977yM5LiW55WM
nodejs sm3StrHex 中文     -->3d22faa1b58113903211b22bfd7c119f9b70d9993abb8239ac382b41a315ce3a
nodejs 特殊字符base64后   -->LC4vOyc8Pj86IiFAIyQlXiYqKClfKy09YA==
nodejs sm3StrHex 特殊字符 -->95cbbf02e028fbe9e4514e60c321a0329559e60c2e1b6ddc52124706b2147e90

(4)golang

代码示例:

package testimport ("encoding/hex""fmt""github.com/tjfoc/gmsm/sm3""net/url""testing"
)func TestSm3(t *testing.T) {// 待摘要字符串、数字unsignStr := "12345678"sm3Byte := sm3.Sm3Sum([]byte(unsignStr))sm3StrHex := hex.EncodeToString(sm3Byte)fmt.Println("golang sm3StrHex 数字     -->" + sm3StrHex)// 待摘要字符串、字母unsignStr = "abcdefg"sm3Byte = sm3.Sm3Sum([]byte(unsignStr))sm3StrHex = hex.EncodeToString(sm3Byte)fmt.Println("golang sm3StrHex 字母     -->", sm3StrHex)// 2023/05/02 修复明文中包含中文或者标点符号等特殊字符时,摘要计算结果不一致的问题,修复方法是先加明文做base64处理,因为base64的结果都是一致的。// 待摘要字符串、中文unsignStr = "你好,世界"encodedStr := base64.StdEncoding.EncodeToString([]byte(unsignStr))fmt.Println("golang 中文base64后       -->", encodedStr)sm3Byte = sm3.Sm3Sum([]byte(encodedStr))sm3StrHex = hex.EncodeToString(sm3Byte)fmt.Println("golang sm3StrHex 中文     -->", sm3StrHex)// 待摘要字符串、特殊字符、unsignStr = ",./;'<>?:\"!@#$%^&*()_+-=`"encodedStr = base64.StdEncoding.EncodeToString([]byte(unsignStr))fmt.Println("golang 特殊字符base64后   -->", encodedStr)sm3Byte = sm3.Sm3Sum([]byte(encodedStr))sm3StrHex = hex.EncodeToString(sm3Byte)fmt.Println("golang sm3StrHex 特殊字符 -->", sm3StrHex)
}

演示结果(各种语言的结果中特殊字符不一致、暂未解决,其他情况均测试一致 ):

golang sm3StrHex 数字     -->0fffff81e971fa3f09107abf77931463fc0710bfb8962efeae3d5654b073bb0c
golang sm3StrHex 字母     -->08b7ee8f741bfb63907fcd0029ae3fd6403e6927b50ed9f04665b22eab81e9b7
golang 中文base64后       -->5L2g5aW977yM5LiW55WM
golang sm3StrHex 中文     -->3d22faa1b58113903211b22bfd7c119f9b70d9993abb8239ac382b41a315ce3a
golang 特殊字符base64后   -->LC4vOyc8Pj86IiFAIyQlXiYqKClfKy09YA==
golang sm3StrHex 特殊字符 -->95cbbf02e028fbe9e4514e60c321a0329559e60c2e1b6ddc52124706b2147e90

总结

以上就是博主对四种语言的SM3杂凑算法的演示,这篇博客拖了很久,其一是最近工作比较忙,其二是特殊字符的问题研究了很久一直找不到有效的解决办法,如果有哪位大佬知道特殊字符的解决方案,可以联系我活着在评论区发表,由衷感谢 ,其二的问题已经在五一节中解决,各位可放心参考,最好是给博主一键三连。

java国密 C#国密 golang国密 NodeJS国密汇总(三)相关推荐

  1. 商密圈大咖齐聚北京 共商国密开源未来发展方向

    2019年7月26日,星期五,北京已经连续被骄阳炙烤了一周,最高温度甚至超过 了40摄氏度.但是相比室外的高温,商密圈精英们参与"基于国密算法的OpenSSL技术沙龙"的热情更高, ...

  2. ip动态分配痕迹会保留多久_段王爷《新国潮七剑》为你解剖新国潮还能潮多久?...

    从外国潮到中国潮 在文化潮流中,中国的年轻人曾受到欧美潮.日潮.韩潮等潮流的影响.如今,中国越来越多的年轻人正在热议"国潮""国风",穿国货.用国货-- 所以, ...

  3. 剑灵最新服务器2017,剑灵南天国速递 1.10西洛版本南天国更新重点简介

    导 读 2017.1.10下午南天国服务器又进行了一次更新维护,坏消息是之前不能进行的主线(包括西洛主线和50级大漠的主线)并没有修复,好消息是放出了新神功牌以及新戒指和手套的一些情报. 首先是神功牌 ...

  4. swift golang java,解决两数之和 (Javascript, Java, C#, Swift, Kotlin, Python,C++, Golang)

    解决两数之和(Javascript, Java, C#, Swift, Kotlin, Python,C++, Golang) 给定一个整数数组,返回两个数字的索引,以便它们加起来成为一个特定的目标. ...

  5. wpspbc按钮是什么意思_抖音私密账号什么意思 抖音热评私密账号什么梗怎么设置?...

    日前,抖音热评里,又出现了一个叫私密账号的新梗,这是什么意思呢?抖音私密账号什么意思引发关注,抖音做为时下年轻人最喜爱的热门小视频软件,拥有上亿用户,有时候抖音里的一条热门评论,或是热门微博,都能引起 ...

  6. 涉密计算机软件安装登记表,6-1-1《哈尔滨工业大学涉密计算机审批表》

    1.- 1 -611哈尔滨工业大学涉密计算机审批表612哈尔滨工业大学中间机审批表613哈尔滨工业大学涉密移动存储介质.办公自动化设备审批表614哈尔滨工业大学涉密设备变更审批表631哈尔滨工业大学涉 ...

  7. 蓝桥杯 Java B组 省赛决赛模拟赛 详解及小结汇总+题目下载【2013年(第4届)~2021年(第12届)】

    蓝桥杯 Java B组 省赛决赛模拟赛 详解及小结汇总+题目下载[2013年(第4届)~2021年(第12届)] 百度网盘-CSDN蓝桥杯资料(真题PDF+其它资料)   提取码:6666 2013年 ...

  8. java函数式编程归约reduce概念原理 stream reduce方法详解 reduce三个参数的reduce方法如何使用

    java函数式编程归约reduce概念原理 stream reduce方法详解 reduce三个参数的reduce方法如何使用

  9. java信息安全性_java-信息安全(二十)国密算法 SM1,SM2,SM3,SM4

    一.概述 国密即国家密码局认定的国产密码算法.主要有SM1,SM2,SM3,SM4.密钥长度和分组长度均为128位.目前主要使用公开的SM2.SM3.SM4三类算法,分别是非对称算法.哈希算法和对称算 ...

最新文章

  1. SQL游标(cursor)详细说明及内部循环使用示例
  2. 实战postfix邮件发送
  3. Lab_2 OSPF
  4. yum之如何手动创建本地yum仓库
  5. axure rp 8.0
  6. PHP之factory
  7. pd.get_dummies()
  8. PHP设计模式——享元模式
  9. oracle全角字符转半角,Oracle 表字段全角字符轉換半角字符辦法
  10. hashmap containsvalue时间复杂度_Java-HashMap面试问答
  11. [转]2020年2月份Github上最热门的开源项目,速来围观
  12. 我的firefox插件开发历程
  13. IDEA→编码设置、JDK设置、快捷方式、运行项目、debug、关联git、关联maven、mybatis跳转plugin
  14. 兄弟HL-1118加粉清零
  15. 软考高项(信息系统项目管理师)论文范文分享
  16. Vue SSR 学习
  17. go html桌面,用 Go 开发桌面应用程序(GUI):Webview、Lorca 与 Electron
  18. 快递鸟电⼦⾯单批量打印流程与注意事项
  19. 批量处理ios破解后的资源文件为android所用
  20. 滤波笔记三:无迹卡尔曼滤波(UKF)

热门文章

  1. Spring Boot 工程启动报错“org.springframework.context.ApplicationContextException: Unable to start ...“解决方案
  2. android菜单软件,悬浮菜单软件-悬浮菜单栏app下载1.0安卓最新版-西西软件下载
  3. spec服务器性能测评,SPEC CPU 2006测试运算性能_服务器评测与技术-中关村在线
  4. 关于Berkeley DB打开创建数据库文件
  5. P1546 [USACO3.1]最短网络 Agri-Net
  6. Java朗致集团面试题
  7. el+vue实战 ② 在el-table中的每一行加上头像/图片;去掉div标签自动换行问题;el-table表格中实现字数限制,只显示一行
  8. 还搞不懂RS485?18个问答彻底讲明白RS485
  9. WebCollector 爬虫解析
  10. 局域网使用kubeadm安装高可用k8s集群