信息安全课设第二周学习总结

一、任务列表

  1. 本周计划完成的任务:调通两个算法库、尽可能学java库
  2. 本周实际完成情况(代码,文档,程序运行截图...),未完成计划的原因?如何改进?
  3. 本周遇到的问题与解决过程(要详细)

二、任务完成情况

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对于国密算法的调试
  1. 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

  • 得到结果

  1. sm3(哈希算法)
  • 使用命令echo -n "20201307lcy" | ./apps/openssl dgst -SM3可以在命令行中实现sm3加解密

  1. 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

参考链接:https://www.jianshu.com/p/578dc82b06cc

posted @ 2022-11-20 19:24  20201307梁辰鱼  阅读(58)  评论(0编辑  收藏  举报