前面研究了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端的内容,解出缺少\转义字符,但是后端无法解密,应该是和编码有关。