LSY0710 2015-05-21 08:55 采纳率: 0%
浏览 5242

关于JavaScript 国密算法

谁有研究国密算法,JavaScript写的SM4算法 最近在看这个 实在没有头绪 不知道怎么写 谁能给一些建议或者一些模块的代码

  • 写回答

3条回答 默认 最新

  • qq_28381497 2015-05-21 10:58
    关注

    基于现有已实现的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作为客户端的脚本语言,可以在提交到服务器端前对数据进行加密,这个还是非常有意义的,比如可以在客户端使用公钥加密账号信息,然后在服务器端用私钥进行解密。

    评论

报告相同问题?

悬赏问题

  • ¥15 程序不包含适用于入口点的静态Main方法
  • ¥15 素材场景中光线烘焙后灯光失效
  • ¥15 请教一下各位,为什么我这个没有实现模拟点击
  • ¥15 执行 virtuoso 命令后,界面没有,cadence 启动不起来
  • ¥50 comfyui下连接animatediff节点生成视频质量非常差的原因
  • ¥20 有关区间dp的问题求解
  • ¥15 多电路系统共用电源的串扰问题
  • ¥15 slam rangenet++配置
  • ¥15 有没有研究水声通信方面的帮我改俩matlab代码
  • ¥15 ubuntu子系统密码忘记