JS版SM2国密算法的签名验证

2024-02-14 22:08
文章标签 算法 js 验证 签名 国密 sm2

本文主要是介绍JS版SM2国密算法的签名验证,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

前段时间因工作需要,了解到在Github上已经有人实现了用JavaScript来写签名和验签,支持RSA、ECC、DSA等算法,还能解析X.509证书,一时觉得JavaScript是无比强大。后面就研究了下JavaScript版的ECC算法签名验证,自己再扩展实现了SM2国密算法的签名验证。

基于现有已实现的C#版SM2国密算法的签名验证,再结合原来JavaScript的ECC算法,使用JavaScript实现SM2国密算法的签名验证相对简单,只需要将C#语言翻译成JavaScript语言实现。不过中间还是遇到了些问题,主要是在JavaScript计算SM3摘要值大数的运算上还是有些不同。

1)JS计算SM3摘要

在做SM2签名之前,需要先计算出原始数据的SM3摘要值,需要计算出z值,这其中就用到了大量的移位运算。JavaScript本身支持移位异或运算,但在C#中数字有int、long等多种类型,而在JavaScript中都用Number类型,这些不同类型运算要分别处理。C#的long类型表示64位有符号的整数,为区分32位整数在值后面加L显示定义。而在JavaScript就要把整数转成64位长度来计算。

C#中默认不检查运算上溢\下溢,除开使用常量编译器会提示,或显示使用了checked关键字检查溢出。原来在C#中使用int类型运算的,并在计算后可能会超出Int32.MinValue~Int32.MaxValue范围的,在JavaScript中就需要截取超出32位长度的高位。并且要按优先顺序计算,即a+b+c必须先计算出(a+b)结果是否溢出再加c,不能直接先计算(a+b+c)总结果再计算溢出后32位的值。因此我用JavaScript写了个C#中的unchecked情况下Int32位数字溢出后转换的值。

而C#中原来的byte[]在JavaScript里变成了Array数组,原来C#中使用的BigInteger大数计算类也原封不动移到了JavaScript中来,还有ECC曲线的Curve、ECPoint对象等等,这样只需要注册SM3、SM2算法再实现就可以了,原来C#中SM2算法就不在此叙述了。

2)SM2签名用的随机数

原来在SM2测试曲线的示例中,有人提出每次签名的结果是一样的。后面发现那里签名时用的k是固定值,所以只要签名密钥和原始数据没变,每次签名后的结果都是一样的。SM2国密标准里用的k值是随机生成的,所以SM2国密算法的签名结果每次都不一样。而SM2国密算法的加密中也生成了随机数,因此每次SM2加密结果也都不一样。

3)JS的SM2算法应用

JavaScript实现SM2国密算法的签名和验证现在应用得比较少,一般来说签名使用的私钥都封在UKey安全设备中了,为保证安全性硬件本身提供了算法接口,很少使用软算法实现。不过JavaScript作为客户端的脚本语言,可以在提交到服务器端前对数据进行加密,这个还是非常有意义的,比如可以在客户端使用公钥加密账号信息,然后在服务器端用私钥进行解密。

最后,提供一个SM2国密算法的SM2证书验签功能的Demo,完整的SM2的密钥对生成、签名、验证点这里下载。

SM2签名验证
  • (Base64)
  • (Base64)

若IE浏览器下验证签名时提示停止运行此脚本,请选择否(N)继续运行。

                    

参考资料:Github jsrsasign

这篇关于JS版SM2国密算法的签名验证的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/709687

相关文章

使用Python获取JS加载的数据的多种实现方法

《使用Python获取JS加载的数据的多种实现方法》在当今的互联网时代,网页数据的动态加载已经成为一种常见的技术手段,许多现代网站通过JavaScript(JS)动态加载内容,这使得传统的静态网页爬取... 目录引言一、动态 网页与js加载数据的原理二、python爬取JS加载数据的方法(一)分析网络请求1

使用雪花算法产生id导致前端精度缺失问题解决方案

《使用雪花算法产生id导致前端精度缺失问题解决方案》雪花算法由Twitter提出,设计目的是生成唯一的、递增的ID,下面:本文主要介绍使用雪花算法产生id导致前端精度缺失问题的解决方案,文中通过代... 目录一、问题根源二、解决方案1. 全局配置Jackson序列化规则2. 实体类必须使用Long封装类3.

VSCode中配置node.js的实现示例

《VSCode中配置node.js的实现示例》本文主要介绍了VSCode中配置node.js的实现示例,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着... 目录一.node.js下载安装教程二.配置npm三.配置环境变量四.VSCode配置五.心得一.no

Springboot实现推荐系统的协同过滤算法

《Springboot实现推荐系统的协同过滤算法》协同过滤算法是一种在推荐系统中广泛使用的算法,用于预测用户对物品(如商品、电影、音乐等)的偏好,从而实现个性化推荐,下面给大家介绍Springboot... 目录前言基本原理 算法分类 计算方法应用场景 代码实现 前言协同过滤算法(Collaborativ

Linux内核参数配置与验证详细指南

《Linux内核参数配置与验证详细指南》在Linux系统运维和性能优化中,内核参数(sysctl)的配置至关重要,本文主要来聊聊如何配置与验证这些Linux内核参数,希望对大家有一定的帮助... 目录1. 引言2. 内核参数的作用3. 如何设置内核参数3.1 临时设置(重启失效)3.2 永久设置(重启仍生效

JS+HTML实现在线图片水印添加工具

《JS+HTML实现在线图片水印添加工具》在社交媒体和内容创作日益频繁的今天,如何保护原创内容、展示品牌身份成了一个不得不面对的问题,本文将实现一个完全基于HTML+CSS构建的现代化图片水印在线工具... 目录概述功能亮点使用方法技术解析延伸思考运行效果项目源码下载总结概述在社交媒体和内容创作日益频繁的

Node.js 数据库 CRUD 项目示例详解(完美解决方案)

《Node.js数据库CRUD项目示例详解(完美解决方案)》:本文主要介绍Node.js数据库CRUD项目示例详解(完美解决方案),本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考... 目录项目结构1. 初始化项目2. 配置数据库连接 (config/db.js)3. 创建模型 (models/

使用Node.js制作图片上传服务的详细教程

《使用Node.js制作图片上传服务的详细教程》在现代Web应用开发中,图片上传是一项常见且重要的功能,借助Node.js强大的生态系统,我们可以轻松搭建高效的图片上传服务,本文将深入探讨如何使用No... 目录准备工作搭建 Express 服务器配置 multer 进行图片上传处理图片上传请求完整代码示例

openCV中KNN算法的实现

《openCV中KNN算法的实现》KNN算法是一种简单且常用的分类算法,本文主要介绍了openCV中KNN算法的实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的... 目录KNN算法流程使用OpenCV实现KNNOpenCV 是一个开源的跨平台计算机视觉库,它提供了各

springboot+dubbo实现时间轮算法

《springboot+dubbo实现时间轮算法》时间轮是一种高效利用线程资源进行批量化调度的算法,本文主要介绍了springboot+dubbo实现时间轮算法,文中通过示例代码介绍的非常详细,对大家... 目录前言一、参数说明二、具体实现1、HashedwheelTimer2、createWheel3、n