基于GMSSL的SM4测试过程及源码
1.SM4介绍
SM4算法,是由国家密码管理局于2012年发布,又名GMS4.0 。
相关标准为GM/T 0002-2012《SM4分组密码算法》。关于sm4的源码在github上有很多,但好多都不全,只有SM4的ECB模式,目前找到的比较全的SM4源码就是GMSSL中所实现的。
2.GMSSL介绍
GmSSL是一个开源的密码工具箱,支持SM2/SM3/SM4/SM9/ZUC等国密(国家商用密码)算法。项目由北京大学关志副研究员的密码学研究组开发维护,项目源码托管于github。
GMSSL不仅实现了所有的国密算法,还实现了国密的ssl版本---GMTLS。同时由于GMSSL是基于openssl的,还保持了openssl的基本功能,包括各种国际算法和ssl/TLS版本。
3.GMSSL裁剪
使用GMSSL的话就涉及到了裁剪,需要如下操作:
(1)在在config中添加 no-选项 ,有编译不过的,就添加,直到编译完成。例如:
./config --prefix=/usr/local/openssl no-pic no-poly1305 no-rsa no-aes no-rfc3779
(2)同时修改 Configure 中
307 $config{sdirs} = [ 317 ];
把没用到的删掉,在config ,make 可以编译出加密库libcrypto.so (3)其实如果使用 静态库编译我们的程序的话,就没必要裁剪了,因为使用静态库在编译的过程中只会把用到的接口链接到我们的程序中,不会额外增加我们程序的大小。
4.GMSSL SM4 接口使用
GMSSL中实现了SM4的所有模式下的源码,包括ECB、CBC、CFB、OFB和CTR。这篇文章主要讲解ECB、CBC和CTR这三种常用模式的接口测试。
4.1 ECB模式。
对称分组加密算法ECB模式的原理如下:
在GMSSL源码中SM4-ECB模式的源码实现是: crypto/sms4/sms4_ecb.c
主要涉及的接口为:
void sms4_set_encrypt_key(sms4_key_t *key, const unsigned char user_key[16]) void sms4_set_decrypt_key(sms4_key_t *key, const unsigned char user_key[16]) void sms4_ecb_encrypt(const unsigned char *in, unsigned char *out, const sms4_key_t *key, int enc) 加解密接口测试如下:
int sm4_ecb_enc_128bit(unsigned char *key, unsigned char *in_data, unsigned char *out_data) {
sms4_key_t enc_key;
sms4_set_encrypt_key(&enc_key, key);
sms4_encrypt(in_data, out_data, &enc_key);
return 0; }
int sm4_ecb_dec_128bit(unsigned char *key, unsigned char *in_data, unsigned char *out_data) {
sms4_key_t dec_key;
sms4_set_decrypt_key(&dec_key, key);
sms4_encrypt(in_data, out_data, &dec_key);
return 0; }
相关推荐: