新聞中心

        EEPW首頁 > 嵌入式系統 > 牛人業話 > 一文看懂碼靈半導體CFW32C7UL系列產品應用(三): 國際標準加解密算法

        一文看懂碼靈半導體CFW32C7UL系列產品應用(三): 國際標準加解密算法

        作者: 時間:2020-07-31 來源:EEPW 收藏

        歡迎再次來到“系列產品應用介紹”連載專題。通過前幾期對系列的國密算法介紹,相信大家對系列的國密硬件模塊有了充分的了解。

        本文引用地址:http://www.104case.com/article/202007/416534.htm

        圖片.png

        由于發展歷程原因,目前市場上商用密碼使用仍然以國際標準加解密算法為主,不過隨國家對國密算法的推進,未來國密算法的應用也會越來越廣泛。CFW32C7UL系列的加解密模塊除了之前介紹的國密密碼算法以外,還支持國際標準加解密算法的AES加解密算法和SHA-1、SHA-256哈希算法。本專題聚焦于CFW32C7UL系列所支持的國際標準加解密算法硬件模塊:AES分組加解密算法和SHA哈希算法。以下我們具體介紹下CFW32C7UL系列AES和SHA模塊的使用以及加解密的速度。

        一、AES分組加解密算法

        AES是Advanced Encryption Standard的縮寫,即高級加密標準,在密碼學中又稱Rijndael加密法,是美國聯邦政府采用的一種區塊加密標準。高級加密標準是由美國國家標準與技術研究院(NIST)于2001年11月26日發布于FIPS PUB 197,并在2002年5月26日成為有效的標準。這個標準用來替代原先的DES,已經被多方分析且廣為全世界所使用,至2006年,高級加密標準已然成為對稱密鑰加密中最流行的算法之一。

        1、CFW32C7UL AES分組算法的實現

        CFW32C7UL 系列的AES模塊可完成標準AES加解密運算和AES-CM、AES-F8加密運算。標準AES算法即AES標準(FIPS-197)中規定的算法。AES-CM和AES-F8算法在The Secure Real-time Transport Protocol(SRTP)中有詳細說明,這兩種算法均以標準AES算法為基礎,并對標準AES算法進行迭代運用。

        AES模塊中的標準AES算法除了支持CPU輸入輸出外,還支持DMA輸入和DMA輸出,而AES-CM、AES-F8只支持DMA輸出。

        2、CFW32C7UL AES分組算法的使用

        開發模式一:裸機SDK

        目前CFW32C7UL系列裸機SDK支持AES-CM, AES-F8,以及標準的AES加解密方式。其中AES-CM和AES-F8只支持加密,不支持解密。標準的AES方式支持加密和解密。

        在CFW32C7UL系列 AES的SDK中有個關鍵的CIPHER_AES_Init_TypeDef結構體:

        typedef struct {

                uint32_t mode;

                uint32_t encrypt;

                uint32_t type;

                uint32_t key_len;

                uint32_t blk_num;

                uint32_t key[8];

                uint32_t key_f8_mask[8];

                uint32_t *input_data;

                uint32_t *output_data;

        }CIPHER_AES_Init_TypeDef;

        在使用AES算法之前需要初始化CIPHER_AES_Init_TypeDef結構體,初始化范例:

        cipher_aes_init.encrypt = CIPHER_AES_CTRL_ENCRYPT;

        cipher_aes_init.input_data= (uint32_t *)aes_in_data;

        cipher_aes_init.output_data = (uint32_t *)aes_out_data;

        cipher_aes_init.blk_num= 1; 加解密輪數

        cipher_aes_init.key_len= CIPHER_AES_KEY_LEN_128BIT;

        cipher_aes_init.key[0] = 0x21212121;設置AES 密鑰,可自定義

        cipher_aes_init.key[1] = 0x43434343;

        cipher_aes_init.key[2] = 0x65656565;

        cipher_aes_init.key[3] = 0x87878787;

        配置cipher_aes_init結構體的初始化參數后,便可以進行相對應的AES加密運算。

        AES CM加密算法:

        cipher_aes_init.mode = CIPHER_AES_MODE_AES_CM;

        HAL_CIPHER_CM_AES(&cipher_aes_init);

        AES F8加密算法:

        cipher_aes_init.mode = CIPHER_AES_MODE_AES_F8;

        HAL_CIPHER_F8_AES(&cipher_aes_init);

        標準AES 加解密方式:

        加密范例:

        cipher_aes_init.encrypt = CIPHER_AES_CTRL_ENCRYPT;

        cipher_aes_init.mode  = CIPHER_AES_MODE_AES_STD; 

        HAL_CIPHER_StdAES(&cipher_aes_init);

        解密范例:

        cipher_aes_init.encrypt = CIPHER_AES_CTRL_DECRYPT;

        cipher_aes_init.mode  = CIPHER_AES_MODE_AES_STD; 

        HAL_CIPHER_StdAES(&cipher_aes_init);

        開發模式二:Linux SDK

        通過操作linux系統中/dev/wokoo_aes ,就可以進行標準AES分組加密算法的運算。

        AES算法底層接口

        open:打開設備節點

        read:讀取加密/解密后的數據

        write:寫入加密前/解密前的數據以及密鑰和配置

        接口描述:

        open:

        函數原型:static int uac_open(struct inode *inode, struct file * file)

        參數:file:文件名

        返回值:成功0,其它失敗

        read:

        函數原型:static ssize_t uac_read(struct file * file, char __user *buffer, size_t size , loff_t *p)

        參數:file:文件名,buffer:讀出數據緩存,size:讀出數據長度

        返回值:成功0,其它失敗

        write:

        函數原型:static ssize_t uac_write(struct file *file, const char __user *buf, size_t count, loff_t *ppos)

        參數:file:文件名,buf:寫入數據緩存,count:寫入數據長度

        返回值:成功0,其它失敗

        使用示例:

        fd = open("/dev/wokoo_aes", O_RDWR);                       打開aes節點

        write(fd, &wokoo_aes, sizeof(struct wokoo_aes_t));        寫入明文/密文,密鑰等配置

        read(fd, wokoo_aes.output_data, sizeof(wokoo_aes.output_data));   讀出密文/明文

        注:這里的write寫入的wokoo_aes結構體,如同在裸機中使用一樣,會在調用前初始化一些參數,通過write把密鑰和模式配置寫入。

        3、CFW32C7UL AES算法的效率:

        目前碼靈半導體CFW32C7UL系的可以實現標準AES加密速率是85KB/s。

        二、SHA哈希算法模塊

        1、CFW32C7UL SHA哈希算法的實現

              CFW32C7UL系列的SHA哈希算法支持SHA-1以及SHA-256。SHA1是SHA的較舊版本,可生成160位哈希值,而SHA256是SHA2的一種類型,可生成256位哈希值。

        CFW32C7UL系列的SHA模塊支持DMA輸入和CPU輸入,輸出僅支持CPU輸出。

         

        2、CFW32C7UL SHA算法的使用

        開發模式一:裸機SDK

        目前裸機開發支持SHA-1以及SHA-256兩種哈希算法SDK,兩種算法分別有CPU輸入和DMA輸入的方式。

        在CFW32C7UL系列 SHA的SDK中有個關鍵的CIPHER_SHA_Init_TypeDef結構體,結構體定義如下:

        typedef struct {

        uint32_t mod;

        uint32_t line_num;

        uint32_t *input_data;

        uint32_t *output_data;

        }CIPHER_SHA_Init_TypeDef;

        使用SHA SDK之前,需初始化這個結構體。包括設置數據量和設置數據的輸入輸出流。

        cipher_sha_init.line_num = 0x01;  設置SHA的數據輸入輪數為1

        cipher_sha_init.input_data = (uint32_t *)sha_in_data;   設置SHA 輸入流

        cipher_sha_init.output_data = (uint32_t *)sha_out_data;   設置SHA輸出流

        配置完cipher_sha_init結構體的初始化參數后,便可以進行相對應的SHA哈希運算。

        調用HAL_CIPHER_SHA_DMA()進行DMA輸入方式SHA哈希運算。

        cipher_sha_init.mod = CIPHER_SHA_MOD_SHA1;   配置SHA-1算法

        HAL_CIPHER_SHA_DMA(&cipher_sha_init);                啟動SHA-1算法   (DMA Input)

        cipher_sha_init.mod = CIPHER_SHA_MOD_SHA256;  配置SHA-256算法

        HAL_CIPHER_SHA_DMA(&cipher_sha_init);        啟動SHA-256算法 (DMA Input)

        調用HAL_CIPHER_SHA_CPU ()進行 CPU輸入方式SHA哈希運算。

        cipher_sha_init.mod = CIPHER_SHA_MOD_SHA1;   配置SHA-1算法

        HAL_CIPHER_SHA_CPU (&cipher_sha_init);       啟動SHA-1算法(CPU Input)

        cipher_sha_init.mod = CIPHER_SHA_MOD_SHA256;  配置SHA-256算法

        HAL_CIPHER_SHA_CPU (&cipher_sha_init);        啟動SHA-256算法(CPU Input)

        開發模式二:Linux SDK

        通過操作linux系統中/dev/wokoo_sha ,便可以進行SHA算法的運算。

        SHA算法底層接口

        open:打開設備節點

        read:讀取哈希后的數據

        write:寫入哈希的數據以及配置模式

        接口描述

        open:

        函數原型: static int uac_open(struct inode *inode, struct file * file)

        參數:file:文件名

        返回值:成功0,其它失敗

         read:

        函數原型:static ssize_t uac_read(struct file * file, char __user *buffer, size_t size , loff_t *p)

        參數:file:文件名,buffer:讀出數據緩存,size:讀出數據長度

        返回值:成功0,其它失敗

        write:

        函數原型:static ssize_t uac_write(struct file *file, const char __user *buf, size_t count, loff_t *ppos)

        參數:file:文件名,buf:寫入數據緩存,count:寫入數據長度

        返回值:成功0,其它失敗

        使用范例:

        fd = open("/dev/wokoo_sha", O_RDWR);                         打開sha節點

        write(fd, &wokoo_sha, sizeof(struct wokoo_sha_t));           寫入需要哈希的數據

        read(fd, wokoo_sha.output_data, sizeof(wokoo_sha.output_data)); 讀出哈希后的數據

        類似地,LINUX在初始化wokoo_sha結構體時會根據給定參數選擇不同的算法,輸入數據輪數和輸入方式,根據不同的參數計算不同的結果。如下示例:

        wokoo_sha.bit_mod = CIPHER_SHA_MOD_SHA256;                 選擇SHA-256方式

        wokoo_sha.data_mod = CIPHER_SHA_TYPE_DMA;                      選擇DMA輸入方式

        wokoo_sha.line_num = 1;                                                           設置數據輸入輪數為1

         

        3、CFW32C7UL SHA算法的效率

        目前碼靈半導體CFW32C7UL系列SHA-1以及SHA-256的加密速率可以實現87KB/s。

        通過這幾期對碼靈半導體CFW32C7UL系列的國密及國際標準加解密算法的介紹,相信大家對CFW32C7UL系列的加解密模塊有一個相對全面的了解。國密算法與國際標準加解密算法的對標關系是:國密算法的SM4和國際標準加解密算法AES對標,國密算法的SM3算法與國際標準加解密算法MD5、SHA-256等哈希算法對標,國密算法的SM2算法與國際標準加解密算法RSA、ECC算法對標。其實CFW32C7UL系列在芯片安全機制方面,除了加解密模塊外還有其它的安全特性和功能配置,那它們具體都是什么呢?又有什么特點呢?讓我們帶著這些問題,在下期中繼續探尋吧。

        本期作者:劉悅臻、梁夢雷、陳紹景、謝耀華、謝劍杰



        評論


        相關推薦

        技術專區

        關閉
        主站蜘蛛池模板: 房产| 林州市| 西乌珠穆沁旗| 全州县| 长沙县| 恭城| 望江县| 积石山| 蓬安县| 陇川县| 微博| 顺平县| 扬州市| 怀宁县| 德兴市| 长汀县| 大安市| 青冈县| 城市| 灵寿县| 贵定县| 虞城县| 平阳县| 通道| 平罗县| 新密市| 永和县| 陕西省| 栾川县| 疏勒县| 常山县| 眉山市| 临猗县| 尤溪县| 拉孜县| 邯郸市| 虎林市| 望江县| 樟树市| 重庆市| 宁蒗|