2017-2018-2 20179204《網絡攻防實踐》第十三周學習總結 python實現國密算法


國密商用算法是指國密SM系列算法,包括基於橢圓曲線的非對稱公鑰密碼SM2算法、密碼雜湊SM3算法、分組密碼SM4算法,還有只以IP核形式提供的非公開算法流程的對稱密碼SM1算法等。

第1節 SM2非對稱密碼算法原理

國密SM2算法是商用的ECC橢圓曲線公鑰密碼算法,其具有公鑰加密、密鑰交換以及數字簽名的功能。橢圓曲線參數並沒有給出推薦的曲線,曲線參數的產生需要利用一定的算法產生。但在實際使用中,國密局推薦使用素數域256 位橢圓曲線,其曲線方程為y^2= x^3+ax+b。參數如下:

其中p是大於3的一個大素數,n是基點G的階,Gx、Gy 分別是基點G的x與y值,a、b是隨圓曲線方程y^2= x^3+ax+b的系數。

第2節 SM3密碼雜湊算法原理

雜湊密碼算法又稱為哈希密碼算法或散列密碼算法,其可以將任意長度的字符串作為算法輸入,並輸出固定長度的字符串。當算法的結構設計足夠精妙復雜時,基本上可以做到對於任意輸入都有唯一確定的輸出與之對應,相反該輸出也可以唯一標識該輸入。

一般可以從兩個角度對雜湊算法安全性能進行評估:

  1.計算不可逆性:即給定一輸入消息A的雜湊值H(A),要得到原消息A在計算上是不可行的;
  2.抗碰撞性:即給定一消息B,找到消息B?使H(B)=H(B')在計算上是困難的。

網絡安全領域中,較為常用的雜湊算法主要有MD5、SHA-1以及SHA-256等,都具有良好的計算不可逆性以及抗碰撞性。但在2004年,由王小雲教授提出的雜湊碰撞算法,極大地降低了對MD5以及SHA-1算法實施碰撞攻擊的時間復雜度。

經過多年的研究,由王小雲教授主導設計的SM3雜湊密碼算法正式推出,該算法可以用於各類密碼應用中的數字簽名和驗證、消息認證碼的生成與驗證以及隨機數的生成,可滿足多種密碼應用的安全需求。

國密SM3商用密碼雜湊算法應用於數字簽名和驗證、消息認證碼的生成與驗證以及隨機數的生成,可滿足多種密碼應用的安全需求。對於長度為l(l<264)比特的信息,SM3雜湊算法經過填充和迭代壓縮,生成雜湊值,其雜湊值長度為256比特(32字節),其安全性與SHA256相當。

第3節 SM4分組密碼算法原理

國密SM4算法是一個對稱分組密碼算法,該算法的分組長度為16字節,密鑰長度也為16字節。加密算法與密鑰擴展算法都采用32輪非線性迭代過程,解密算法與加密算法的過程相同,只是輪密鑰的使用順序相反,解密輪密鑰是加密輪密鑰的逆序。SM4算法支持的四種加密模式如下表所示:

SM4 分組算法4種模式及安全MAC的算法標識如下表所示:

第4節 PYTHON實現

python實現代碼已上傳碼雲。

4.1 SM2測試截圖

python3實現的國密SM2+SM3,SM3包括KDF功能,可配合SM2加解密(SM2調用了SM3模塊)。SM2實現了各種素域下的簽名、驗簽和加解密功能。

截圖體現了SM2對“你好”的加解密過程。

4.2 SM3測試截圖

python編寫的SM3密碼雜湊算法代碼。

對字符串abc、 abcd*16進行測試,結果如圖:

4.3 SM4測試截圖

python實現的國產加密sm4算法。

測試了ecb和cbc兩種模式:

第5節 遇到的問題與解決過程

5.1 問題一


python中出現Non-ASCII character '\xe7' in file sm2.py on line 6, but no encoding declare的錯誤。

可按照錯誤建議網址查看http://www.python.org/peps/pep-0263.html,發現是因為Python在默認狀態下不支持源文件中的編碼所致。解決方案有如下三種:

  1)在文件頭部添加如下注釋碼:
  # coding=<encoding name> 
  例如,可添加# coding=utf-8
  2)在文件頭部添加如下兩行注釋碼:
  #!/usr/bin/python
  # -*- coding: <encoding name> -*- 		例如,可添加# -*- coding: utf-8 -*-
  3)在文件頭部添加如下兩行注釋碼:
  #!/usr/bin/python
  # vim: set fileencoding=<encoding name> :
  例如,可添加# vim: set fileencoding=utf-8 :

參考博客:cnblogs csdn

5.2 問題二


UnicodeDecodeError: 'ascii' codec can't decode byte 0xe9 in position 0: ordinal not in range(128) 產生原因:

因為默認情況下,Python采用的是ascii編碼方式,而Python在進行編碼方式之間的轉換時,會將unicode 作為“中間編碼”,但unicode最大只有128那么長,所以這里當嘗試將ascii編碼字符串轉換成"中間編碼" unicode時由於超出了其范圍,就報出了如上錯誤。

有的解決辦法參見cnblogscsdn。但具體我是換了python3.7版本直接運行通過的。

5.3 問題三

python模塊以及導入出現ImportError: No module named ‘xxx‘問題。

具體參見mamicode

python中,每個py文件被稱之為模塊,每個具有_init_.py文件的目錄被稱為包。只要模塊或者包所在的目錄在sys.path中,就可以使用import 模塊或import包來使用。

如果你要使用的模塊(py文件)和當前模塊在同一目錄,只要import相應的文件名就好,比如在a.py中使用b.py:

  import b


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM