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()判断文件是否存在
    */
    



    参考: 文件操作(C语言) -- 判断一个文件是否存在

  • 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.根证书的拓展

参考:
openssl采用sm2进行自签名的方法

2.SM2特性

加解密、签名验证都使用了随机数,每次结果都不一样(参考)

3.gdb调试命令

LINUX下GDB的使用方法(简单说说)

二、遇到的问题及解决

sm4加解密拆开出问题,按照前面做过的SM4加解密,然后拆开为加密和解密两个函数,运行后出段错误,反复更改,然后下载cgdb开始调试。开始发现是EVP_EncryptUpdate()函数出错,后面查看内存发现密钥参数传入出错,密钥16字节只传入8字节。修改后,密钥传入字节后,发现还是报错,还是EVP_EncryptUpdate()运行后报段错误(走了弯路,浪费了不少时间),暂未解决!!!

三、下周计划

1.解决SM4加解密拆开的问题

2.继续模拟协商步骤

3.开始通信包和函数编程尝试

posted @ 2022-02-11 13:50  20181324  阅读(109)  评论(0编辑  收藏  举报