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端的內容,解出缺少\轉義字符,但是後端無法解密,應該是和編碼有關。

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章