源码获取:https://gitee.com/Flytortoise/Project/tree/C/
如果你有什么好的项目,欢迎私信公众号:Rocker的创意工坊
01
项目简介
设计一个密钥管理系统
功能要求:
1)生成随机数
2)生成最大素数
3)生成密钥对,并使用密钥对签名和验签
4)对数据进行加密和解密
02
项目总结
功能1:生成随机数,使用 rand()函数即可
功能2:需要用户输入阀值,降序依次判断是否为素数即可
判断素数时,仅判断到num^(1/2)即可
判断代码如下:
// 判断素数
bool judge(unsigned int num) {
unsigned int flag = (unsigned int)sqrt((double)(num));
int i = 0;
for (i = 2; i < flag; i++) {
if (num % i == 0)
return false;
}
return true;
}
功能3:生成密钥对,并使用密钥对签名和验签
密钥对:即非对称加密,使用算法通常为RSA,本次项目使用RSA2048
签名是在hash值的基础上加密,即:签名=hash+RSA2048
(hash算法使用:SHA256,作用:标识数据的唯一性)
签名的作用:表示这段数据是本人制作的,没有被篡改
因此签名本身没有秘密的属性,任何人都可以对其进行验证
加签名的过程如下:(私钥仅自己拥有,所以仅自己加签)
解签验证的过程如下:(公钥任何人都可以持有,所有别人可以验证,这段数据是否被篡改)
功能4:对数据进行加密和解密
加密使用对称密钥,该项目采用AES256 ECB
03
注意事项
1. 为何加密不使用RSA算法?
答:可以使用公钥进行加密(这样持有私钥的人才能解开,保密性得到保证)
但是RSA算法速度比AES慢
2. RSA2048,SHA256,AES256,其中 2048,256指的是位,不是字节
3. RSA 公钥解签后,hash1的长度为256字节
对数据SHA256之后,hash2的长度为32字节
只需要对比前32个字节即可
04
经验教训
问题:
在使用 PEM_read_RSAPrivateKey 后,返回值非NULL,但一直段错误
原因:
没有使用头文件#include <openssl/pem.h>,导致gcc自动替换成了别的函数