信息安全课设第二周学习总结
一、任务列表
- 本周计划完成的任务:调通两个算法库、尽可能学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