2022_2_11_周汇报
目录
一、进度
1.OpenSSL DH接口测试
指定系统参数,DH-p长度:3072
参考:
参考
openssl 编程之DH
使用 openssl 进行 DH 密钥交换
openssl DH密钥协商
2.重学Makefile
最后找到一个Makefile模本
3.完成SM2签名,加解密
添加的函数
-
EC_KEY* ReadPem_ECPrikey(char *filenmae); /* 函数功能:读取PEM格式文件中SM2私钥 */
-
DH *ReadPem_DH_p(char *filename); /* 函数功能:读取PEM格式文件中DH参数中的p */
-
int SavetoPem_X509Req(X509_REQ *certReq, char* filename); /* 函数功能:将X509_REQ结构体保存到PEM格式文件 */
-
BIGNUM *get_dh_p(int len); /* 函数功能:根据长度获取DH参数中p */
-
EVP_PKEY_CTX *SM2_sign_set_id(); /* 函数功能:签名函数需要设置一个id,这个id可以用签名证书里的ID,保证统一性(未实现) */
-
unsigned char *SM2_do_sign(unsigned char *message, EVP_PKEY_CTX* pkeyctx, EVP_PKEY *evpkey, int *sig_len); /* 函数功能:进行SM2签名 参数:message: 签名信息 pkeyctx: SM2签名中间值保存结构体 evpkey: SM2私钥 sig_len: 返回的签名长度 返回值:签名结果 更新: 后面会将签名设置的ID进行指定为证书ID */
-
int SM2_do_verify(unsigned char *message, unsigned char *sig, int sig_len, EVP_PKEY_CTX* pkeyctx, EVP_PKEY *evpkey); /* 函数功能:验证SM2签名 参数: message: 签名信息 sig: 验证的签名值 sig_len: 验证的签名值长度 pkeyctx: SM2签名中间值保存结构体 evpkey: 验证的公钥 返回值:1,验证成功;0,验证失败。 */
-
unsigned char *SM2_encrypt(EVP_PKEY_CTX *pkeyctx, unsigned char *message, int in_len,int *en_len); /* 函数功能:进行SM2加密 参数:pkeyctx: SM2加密中间值保存结构体 message: 加密信息 in_len: 加密信息长度 en_len: 返回的加密长度 返回值: 加密结果 */
-
unsigned char *SM2_decrypt(EVP_PKEY_CTX *pkeyctx, unsigned char *cipher,int *de_len, int in_len); /* 函数功能:SM2解密 参数:pkeyctx: SM2解密中间值保存结构体 cipher: 密文 de_len: 返回的明文长度 in_len: 密文长度 返回值:解密结果 */
-
unsigned char *SM4_encrypt(unsigned char message[], unsigned char key[16], unsigned char *iv, const EVP_CIPHER *mode, int in_len, int *out_len); /* 函数功能:SM4加密(未成功) */
-
unsigned char *SM4_decrypt(unsigned char *cipher, unsigned char *key, unsigned char *iv, const EVP_CIPHER *mode, int in_len, int *out_len); /* 函数功能: SM4解密(未成功) */
-
unsigned char *SM3_compute(); /* 函数功能:SM3-hash(未实现) */
-
void print_bn_hex(BIGNUM *bn); /* 函数功能:打印BIGNUM的16进制 */
-
void test5(); /* 函数功能:测试<unistd.h>中access()判断文件是否存在 */
-
void test6(); /* 函数功能:与读证书指定文件路径或不指定情况下,利用strcpy()、strcat(),测试ReadPem_ECPrikey() */
-
void test7(); /* 函数功能:测试DH参数、共享密钥生成过程 */
-
void test8(); /* 函数功能:测试get_dh_P()、SM2_do_sign()、SM2_do_verity()、SM2_encrypt()、SM2_decrypt()(本意还想测试SM4加解密和SM3的) */
图片说明: 指定的p的长度为3072位,但是生成的一般会少4位或8位,所以里面有个p长度不等于安全参数 -
void test9(); /* 函数功能:测试SM4_encrypt()、SM4_decrypt()(失败) */
-
void testA(); /* 函数功能:测试单个函数同时SM4加解密,测试OpenSSL SM4加解密接口是否可用 */
图片说明: 这是将test9()注释后,把testA()改成test9(),编译运行,仍然是原先test9()还在时的testA()运行结果,受原先test9()影响,本来可以正常运行的testA()无法正常运行
4.暂时阻碍,SM4加解密报错
参考:
EVP_EncryptInit
基于openssl的sm4对称加密算法
5.杂
1.根证书的拓展
2.SM2特性
加解密、签名验证都使用了随机数,每次结果都不一样(参考)
3.gdb调试命令
二、遇到的问题及解决
sm4加解密拆开出问题,按照前面做过的SM4加解密,然后拆开为加密和解密两个函数,运行后出段错误,反复更改,然后下载cgdb开始调试。开始发现是EVP_EncryptUpdate()函数出错,后面查看内存发现密钥参数传入出错,密钥16字节只传入8字节。修改后,密钥传入字节后,发现还是报错,还是EVP_EncryptUpdate()运行后报段错误(走了弯路,浪费了不少时间),暂未解决!!!