1. 程式人生 > >終於把JAVA的SM2演算法搞出來了!!!!!!!!!!!!!!!!!!!!!

終於把JAVA的SM2演算法搞出來了!!!!!!!!!!!!!!!!!!!!!

在前面文章我們已經可以製作SM2證書了,主要應用了SM2簽名驗證演算法和SM3摘要演算法,在本文中主要介紹SM2公鑰加密演算法。這裡我們使用SM2數字證書來做SM2非對稱加密,然後使用硬體加密裝置做解密,比如加密檔案只能由指定的智慧密碼鑰匙UKey才能解開。

SM2加密演算法

SM2加密同樣使用接收方公鑰加密,公鑰由一個曲線座標點組成,在X.509證書中的共鑰表示為04標記開始的2個32byte的BigInteger,即曲線點P(x,y)。SM2公鑰加密演算法比RSA相對複雜,加密結果由3個部分組成,SM2加密過程中使用了隨機數,因此同樣的明文資料每一次加密結果都不一樣。SM2加密演算法流程如下圖所示。

根據國密推薦的SM2橢圓曲線公鑰密碼演算法,首先產生隨機數計算出曲線點C1,2個32byte的BigInteger大數,即為SM2加密結果的第1部分。第2部分則是真正的密文,是對明文的加密結果,長度和明文一樣。第3部分是雜湊值,用來效驗資料。按國密推薦的256位橢圓曲線,明文加密結果比原長度會大96byte。

SM2加密演算法同樣也可以基於使用BouncyCastle庫實現。一般使用數字證書來標識身份,同時使用證書中公鑰加密資料。如下SM2Cipher類是C#下SM2軟演算法實現。

SM2Cipher.cs

SM2解密演算法

SM2解密演算法是加密逆運算。首先需要從密文中取出加密結果的3部分值,然後通過私鑰計算出 M'明文值,最後效驗資料。SM2解密演算法流程如下圖所示。 

 SM2解密同樣也可以使用軟演算法實現。但因為涉及到私鑰運算,為保護私鑰安全,建議在硬體裝置中執行,例如UKey等儲存介質這樣可以更好的保護金鑰安全。拿檔案加密來說,首先拿UKey裡面的加密證書加密,這部分可在應用系統內完成。解密的話則需要加密證書對應UKey才能做解密,由應用系統呼叫UKey解密介面,在物理硬體內完成資料解密,同時可以受裝置Ping碼保護

以上是參考、JAVA的部分



System.out.println("p = " + sm2.ecc_p.toString(16));
System.out.println("a = " + sm2.ecc_a.toString(16));
System.out.println("b = " + sm2.ecc_b.toString(16));
System.out.println("n = " + sm2.ecc_n.toString(16));
System.out.println("gx= " + sm2.ecc_gx.toString(16));
System.out.println("gy= " + sm2.ecc_gy.toString(16));
System.out.println("h = " + sm2.ecc_bc_spec.getH().toString(16));