信息安全课设第二周学习总结
一、任务列表
- 本周计划完成的任务:调通两个算法库、尽可能学java库
- 本周实际完成情况(代码,文档,程序运行截图...),未完成计划的原因?如何改进?
- 本周遇到的问题与解决过程(要详细)
二、任务完成情况
1 openssl的配置与使用
openssl作为我们课上所学的密码算法库,是我们课设的首选目标
1.1 openssl在openeuler下的环境配置
下载Openssl
wget https://www.openssl.org/source/openssl-1.1.1b.tar.gz
解压
tar -xvf openssl-1.1.1b.tar.gz
cd openssl-1.1.1b
配置
./config --prefix=/usr/local --openssldir=/usr/local/openssl
安装make
apt install build-essential -y
编译
make && make install
配置环境变量
vim /etc/profile
export OPENSSL=/usr/local/openssl/bin
export PATH=$OPENSSL:$PATH:$HOME/bin
此时我们可以使用openssl version来查看汇配置情况,如果显示找不到的话,我们可以使用source /etc/profile命令进行更新
当然,如果我们对openssl版本没有特殊要求,我们可以使用yum进行安装
yum install openssl
yum update openssl
1.2 openssl对于国密算法的调试
- sm2(公钥算法)
 使用openssl ecparam -list_curves | grep SM2查看是否支持SM2
  
创建EC参数和原始私钥文件
openssl ecparam -out rocsm2kp.pem -name SM2 -param_enc explicit -genkey

- 
查看EC私钥信息 openssl ecparam -in rocsm2kp.pem -text
- 
 
- 
验证参数: openssl ecparam -in rocsm2kp.pem -check
- 
 
- 
查看公私钥: openssl ec -in rocsm2kp.pem -text -noout
- 
 
- 
导出私钥: 
 openssl pkcs8 -topk8 -inform PEM -in rocsm2kp.pem -outform pem -nocrypt -out rocsm2pri.pem
- 
 
- 
查看私钥: cat rocsm2pri.pem
- 
 
- 
导出公钥: openssl ec -in rocsm2kp.pem -pubout -out rocsm2pub.pem
- 
 
- 
查看公钥: cat rocsm2pub.pem
- 
 
- 
签名 openssl dgst -sha512 -sign rocsm2kp.pem -out hellosm2.sig lcy.txt
- 
 
- 
验签 openssl dgst -sha512 -verify rocsm2pub.pem -signature hellosm2.sig lcy.txt
- 
 
以上便是老师所给示例代码的全部实现,但没有包括sm2算法的加密和解密,于是根据参考链接进行配置:在openssl中对SM2的公私钥进行加解密的验证
- 
首先需要找到ecparam.c文件,由于我选用的openssl安装方式是下载压缩包并配置,在寻找后,发现ecparam.c文件在主目录的apps目录下, 
- 
 
- 
在配置前,先拍摄快照,养成好习惯 
  
- 
添加代码进行sm2加密解密验证,在文件的432行 
- 
 
            i = PEM_write_bio_ECPrivateKey(out, eckey, NULL,
                                           NULL, 0, NULL, NULL);//生成私钥
            //以下为添加代码
            i = PEM_write_bio_EC_PUBKEY(out, eckey);//生成公钥
 
            const char *message = "encryption test data";//测试数据
            const size_t msg_len = strlen(message);
            printf("%s\n",message);
 
            uint8_t *ctext = NULL;
            size_t ctext_len = 0;
            const EVP_MD *digest=EVP_sm3();//摘要方法是sm3
            sm2_ciphertext_size(eckey, digest, msg_len, &ctext_len);
            ctext = OPENSSL_zalloc(ctext_len);
            sm2_encrypt(eckey, digest, (const uint8_t *)message, msg_len,
                               ctext, &ctext_len);//加密
            printf("%s\n",ctext);//加密后数据
 
            uint8_t *recovered = NULL;
            size_t recovered_len = msg_len;
            size_t ptext_len = 0;
            sm2_plaintext_size(eckey, digest, ctext_len, &ptext_len);
            recovered = OPENSSL_zalloc(ptext_len);
            sm2_decrypt(eckey, digest, ctext, ctext_len, recovered, &recovered_len);//解密
            printf("%s\n",recovered);//解密后的数据
- 
添加头文件 #include "internal/sm2.h"
- 
 
- 
在apps下面的build.info中添加crypto的依赖 
INCLUDE[openssl]=.. ../include ../crypto/include
DEPEND[openssl]=libapps.a ../libcrypto.a ../libssl
- 
 
- 
很不幸,发生了报错 
- 
 
- 
缺少sm2.h库,于是下载对应库,添加到/include/internal目录下 
- 
 
- 
重新make,果然没有报错 
- 
 
- 
再次到apps目录下执行 ./openssl ecparam -name SM2 -genkey
- 
得到结果 
- 
 
- sm3(哈希算法)
- 
使用命令 echo -n "20201307lcy" | ./apps/openssl dgst -SM3可以在命令行中实现sm3加解密
- 
 
- sm4(对称加密算法)
- 
使用命令 openssl enc -in lcy.txt -out enlcy.txt -e -sm4-ctr -pbkdf2 -k 123456进行加密,输入文件为lcy.txt,输出加密文件为enlcy.txt,加密密钥为123456
- 
 
- 
使用命令 openssl enc -in enlcy.txt -out delcy.txt -d -sm4-ctr -pbkdf2 -k 123456进行解密,输入文件为enlcy.txt
 
                     
                    
                 
                    
                
 
                
            
         
         浙公网安备 33010602011771号
浙公网安备 33010602011771号