注意:
我使用的是linux系统,虚拟机kali,相关的安装博客大家在社区里找一下就有,我就不赘述了
RSA实验原理:
加密基础过程
1) 调用OpenSSL库生成秘钥(非必要步骤,如果已经有秘钥对了,就不需要进行这步了)
2) 调用OpenSSL库对明文进行加密
2) 对加密后密文进行BASE64转码(非必要步骤,一般开发过程中,为了传输or存贮方便,都会对密文进行BASE64编码)
注意:OpenSSL的RSA加密接口,每次加密数据的最大长度是有限制的,所以对“较大数据”进行加密,需要循环对“较大数据”分段加密
解密基础过程
1)对BASE64内容进行BASE64解码
2) 调用OpenSSL库对密文进行解密
注意:OpenSSL的RSA解密接口,每次解密数据的最大长度是有限制的,所以对“较大数据”进行解密,需要循环对“较大数据”分段解密
实验要求:
使用OPENSSL提供的功能实现大数运算,完成RSA的加密,明文为 姓名+学号
搭建环境
首先使用linux环境安装虚拟机(这里我使用的是kali)
输入如下命令,注意在使用之前要先提权,将权限提升至管理员级别
$ sudo apt-get update
$ sudo apt-get install libssl-dev
Openssl作用举例:
打印出一个大数。
无效printBN(char *msg, BIGNUM * a)
{ //将BIGNUM转换为数字字符串
char * number_str = BN_bn2dec(a);
//打印出数字字符串
Printf ("%s %s\n", msg, number_str);
//释放动态分配内存
OPENSSL_free (number_str); }
实验源码:
#include<stdio.h>
#include <string.h>
#include<openssl/bn.h> //引入openssl库
#define NBITS 256
void str_2_hex_str(char *dest, char *src)
{
int size = strlen(src);
int i,j;
for (i = 0, j = 0; i < size; i++) {
sprintf(&dest[j], "%02X", src[i]);
j+=2;
}
dest[j] = '\0';
}
void printBN(char *msg,BIGNUM *a)
{
char *number_str=BN_bn2hex(a);
printf("%s %s\n",msg,number_str);
OPENSSL_free(number_str);
}
int main(){
char p1[33]="F7E75FDC469067FFDC4E847C51F452DF";
char res[32];
char data[64];
char p2[33]="F7E75FDC469067FFDC4E847C51F452DE";
char q1[33]="E85CED54AF57E53E092113E62F436F4F";
char q2[33]="E85CED54AF57E53E092113E62F436F4E";
char e1[33]="0D88C3";
scanf("%s",data);
str_2_hex_str(res,data);
BN_CTX *ctx =BN_CTX_new();
BIGNUM *p=BN_new();
BN_hex2bn(&p,p1);
BIGNUM *q=BN_new();
BN_hex2bn(&q,q1);
BIGNUM *P=BN_new();
BN_hex2bn(&P,p2);
BIGNUM *Q=BN_new();
BN_hex2bn(&Q,q2);
BIGNUM *n=BN_new();
BN_mul(n,p,q,ctx);
BIGNUM *fn=BN_new();
BN_mul(fn,P,Q,ctx);
BIGNUM *e=BN_new();
BN_hex2bn(&e,e1);
BIGNUM *d=BN_new();
BN_mod_inverse(d,e,fn,ctx);
BIGNUM *M=BN_new();
BN_hex2bn(&M,res);
BIGNUM *c=BN_new();
BN_mod_exp(c,M,e,n,ctx);
BIGNUM *m=BN_new();
BN_mod_exp(m,c,d,n,ctx);
printBN("p:",p);
printBN("q:",q);
printBN("N:",n);
printBN("fai(n):",fn);
printBN("e:",e);
printBN("d:",d);
printBN("M:",M);
printBN("m^e mod n = \n",c);
printBN("c^d mod n = \n",m);
}
实验结果:
我们将姓名和学号当做明文,验证程序,发现程序运行良好且结果正确
(这里需要再最后./rsa之后输入你要加密的内容,为了隐私我就不展示了)
OpenSSL是一个开源的软件库,实现了密码学算法,包括RSA加密算法。OpenSSL提供了丰富的API,使得开发者可以方便地在应用程序中实现RSA加密、解密、签名和验证等功能。
OpenSSL库对RSA运算的帮助:
跨平台:OpenSSL支持多种操作系统,包括Windows、Linux和macOS,这使得开发者可以在不同平台上使用相同的代码实现RSA运算。
性能优化:OpenSSL的实现经过了优化,可以高效地处理RSA运算,尤其是在处理大数运算时。
功能丰富:除了基本的RSA运算,OpenSSL还提供了密钥生成、证书管理、SSL/TLS协议实现等高级功能。
实验感悟:
易用性:在使用OpenSSL进行RSA实验时,我深刻体会到了其API的易用性。通过简单的函数调用,我能够快速实现RSA加密和解密,而无需深入了解背后的数学原理。
性能体验:在实验中,我注意到OpenSSL在处理大数运算时的性能表现。通过比较不同实现,我认识到了优化算法和数据结构在提高性能方面的重要性。
安全性意识:使用OpenSSL让我意识到了安全性的重要性。在实验过程中,我学习了如何安全地生成密钥、存储密钥以及如何避免常见的安全漏洞。
通过OpenSSL库的使用,我不仅提高了在密码学领域的实践能力,也加深了对RSA算法及其在现代加密技术中作用的理解。
Openssl是一个大数处理库,对于1024比特的数据而言,普通的高级语言没有办法完成,比如C语言,可能64位就已经是极限了,而对于OPENSSL来说,1024比特也可以很容易的运算。