javascript sm2 sm3 sm4 国密库

前面研究了iOS端的sm2,sm3,sm4,sm9,zuc国密。前端后期也会接入国密库,所以研究了下JavaScript的国密。如果需要知道算法原理的可以查看我之前的博客,或者看我的github上也有

github地址:https://github.com/yazhouZhang/SM2-SM3-SM4-SM9

博客地址:https://blog.csdn.net/Asia_ZhangQQ/article/details/84876111

github上有国密的相关库,但是每个公司的业务不一样,前后端接入方式不一样。所以需要定制化封装。这里提供几个sm2,sm3,sm4的demo。各位看官可以根据自己公司业务自行封装。

js sm2 sm3 sm4 github地址:https://github.com/yazhouZhang/js-sm2-sm3-sm4-sm9-zuc

因为我们后端使用的是java bc库,然后你懂的。我只能自己一个人坑下了iOS的国密。然后js的国密呢,后端的个性你懂的。然后我只能js结合iOS的国密来联调。自己加密自己解密是很容易的,但是和其他端对接的时候,就会出现各种问题。因为这涉及到国密算法的写法。比如js本地sm2加解密能通,和iOS端不能通;js本地sm4加解密能通,iOS解密崩溃等等问题,这里一一概述。

1.加解密或者签名前,请确认你的公钥,私钥的格式。iOS,android,web,后端可能因为使用的国密库不一样,需要的格式也不一样。相关格式转换可以看我这篇博客:

https://blog.csdn.net/Asia_ZhangQQ/article/details/96854514

2.格式问题

2.1 各个端的数据传输,很容易用到base64。但是base64存在很多变种。

比如sm2的加解密本地你用js-base64库没问题,但是和iOS端联调发现加密后base64的编码不同,导致无法解密。

2.2 还有很多需要注意的格式和算法的有关这里列举下:

    parseUtf8StringToHex, 解析utf8字符串到16进制

    parseArrayBufferToHex,解析arrayBuffer到16进制字符串

    arrayBufferToBase64,arrayBuffer转成base64

    base64ToArrayBuffer,base64转成arrayBuffer

    leftPad,补全16进制字符串 sm4需要注意

    arrayToHex,byte数组转成16进制串

    arrayToUtf8, byte数组转成utf8串

    hexToArray,转成ascii码数组

    byteArrayToIntArray,byte数组转成int数组,每四个字节转成一个int数值

    intToByte,int数转成byte数组 事实上只不过转成byte大小的数,实际占用空间还是4字节 返回:字节数组

    intArrayToByteArray,int数组转成byte数组,一个int数值转成四个byte

    byteToInt,byte数组转成int数值

    encode,ASN1 DER编码 对rs 这个要和后端约定好

    decode,ASN1 DER解码 对rs

3.算法问题

3.1 js sm4 加密后发现密文长度不够,后面没有补充位。iOS和后端有。这和它算法实现有关

3.2 js sm4 加密后密文不一致,这也和算法有关,可能原因有base64加密格式不对,sm4 算法32轮轮询不对。我们出现了iOS和js密文输出最后hex 224位后32位不同,前面都一摸一样。然后iOS端可以解密js端的内容,解出缺少\转义字符,但是后端无法解密,应该是和编码有关。

发布了30 篇原创文章 · 获赞 16 · 访问量 5万+

猜你喜欢

转载自blog.csdn.net/Asia_ZhangQQ/article/details/100734512
今日推荐