【原創】SM4password算法源代碼接口具體解釋


【原創】SM4password算法源代碼接口具體解釋
近期幾天想把cryptdb的加密算法換成國產的sm4加密算法。所以花了時間研究了一下sm4的源代碼和基本原理,避免忘記,寫下這篇博客以作記錄。

先介紹一下SM4算法,SM4是我們自己國家的一個分組password算法。是國家password管理局於2012年公布的。

網址戳→_→:http://www.cnnic.net.cn/jscx/mixbz/sm4/

詳細的password標准和算法官方有很詳盡的PDF文檔以供查閱,戳→_→:http://218.241.108.63/wiki/images/2/22/SM4%E5%88%86%E7%BB%84%E5%AF%86%E7%A0%81%E7%AE%97%E6%B3%95.pdf

算法的源代碼實現官方也有對應的演示樣例源代碼,戳→_→:

http://218.241.108.63/wiki/index.php/File:Sm2_sm3_sm4_c%E8%AF%AD%E8%A8%80%E5%AE%9E%E7%8E%B0.zip

先說說啥是分組password算法:

分組password算法——國際DES、國產SM4

分組password就是將明文數據按固定長度進行分組,然后在同一密鑰控制下逐組進行加密,從而將各個明文分組變換成一個等長的密文分組的password。當中二進制明文分組的長度稱為該分組password的分組規模。

SM4password算法的總體結構圖例如以下:


SM4的源碼中存在例如以下幾個函數:

void sm4_setkey_enc(sm4_context *ctxunsigned char key[16])

void sm4_setkey_dec(sm4_context *ctxunsigned char key[16])

void sm4_crypt_ecb( sm4_context *ctx,int mode,int length, unsigned char *input,unsigned char *output)

void sm4_crypt_cbc( sm4_context *ctx,int mode,int length,unsigned char iv[16],unsigned char *input,unsigned char *output )

static void sm4_setkey( unsigned long SK[32], unsigned char key[16] )

另一個很重要的結構體:sm4_context

typedef struct

{

    int mode;                   /*!<  encrypt/decrypt   */

    unsigned long sk[32];       /*!<  SM4 subkeys       */

}

sm4_context;

先說結構體:

sm4_context結構體中的Mode控制是加密還是解密,sk則表示子密鑰。也稱作輪密鑰。

 

第一個函數: void sm4_setkey_enc(sm4_context *ctxunsigned char key[16])

這個函數是用來設置加密密鑰的。一個參數分別為sm4_context *ctx和一個key。

其內部會調用static void sm4_setkey( unsigned long SK[32], unsigned char key[16] )函數

這個函數是用來設置密鑰的。這個函數內部會對當前傳入的主密鑰進行32輪的迭代,每次迭代的輪密鑰都被存放到ctx結構中的sk數組中。

void sm4_setkey_dec(sm4_context *ctxunsigned char key[16])函數就是解密函數,過程為上述過程的逆序過程。

第二個函數:void sm4_crypt_ecb( sm4_context *ctx,int mode,int length, unsigned char 

這個函數的作用是使用ecb模式(ECB(Electronic Codebook,電碼本)模式是分組password的一種最主要的工作模式。

相同。sm4_crypt_cbc函數則是使用的CBC模式,也就是分組鏈接模式)來對內容進行加密,內部也是一個循環,依據length的長度來進行循環,每次循環都調用sm4_one_round進行加密或者解密,究竟是加密還是解密,主要是依據第二個參數Mode來進行決定。

以上就是整個SM4算法的函數簡單介紹,運用這些函數接口,我們不須要知道內部的詳細實現,就能夠使用sm4加密算法來對我們的數據進行加解密,十分的方便。

請尊重原作者,原文鏈接→_→:http://blog.csdn.net/sandaojushi/article/details/46925541


免責聲明!

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



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