RSA密码算法的原理和编程实现
【实验目的】
1) 学习RSA密码算法的原理
2) 学习RSA密码算法的编程实现
【实验原理】
RSA公钥加密算法是1977年由Ron Rivest、Adi Shamirh和LenAdleman在美国麻省理工学院开发的。RSA算法基于一个十分简单的数论事实:将两个大素数相乘十分容易,但那时想要对其乘积进行因式分解却极其困难,因此可以将乘积公开作为加***。
算法原理
解密过程
算法参数
算法流程
(1)RSA**生成部分代码流程图:
(2)RSA加密部分流程图:
(3)RSA解密部分流程图:
源代码如下所示
大数的数据结构:
class BigNum`
{`
public:`
int length; //大数长度`
int signal; //大数符号`
unsigned long array[len1]; //大数绝对值`
BigNum(); //构造函数`
BigNum(unsigned __int64); //构造函数用于赋初始值`
BigNum::BigNum(string s); //读入字符串`
BigNum(BigNum const& A); //复制大数,const保护了原对象的属性`
BigNum(); //析构函数`
BigNum operator+(BigNum & A); //运算符+重载`
BigNum operator-(BigNum & A); //运算符-重载`
BigNum operator*(BigNum & A); //运算符*重载
BigNum operator/(BigNum & A); //运算符/重载
BigNum operator%(BigNum & A); //运算符%重载
BigNum operator-(void); //负号重载
int operator==(BigNum& A); //等于号重载
int operator!=(BigNum& A); //不等号重载
int Compare(BigNum const& A); //比较两大数绝对值大小
void GeneratePrime(void); //产生素数
int Rabin_Miller(void); //拉宾米勒算法用于素数测试
void Random(int a); //随机产生一个大数
void Random(BigNum A); //随机产生一个小于A的大数
void print(void); //输出大数
void printS(void); //输出字符串
BigNum power_mod(BigNum& A, BigNum& B); //模幂算法计算X^A mod B
BigNum ex_euclid(BigNum a,BigNum b); //扩展欧几里德算法
}
RSA系统初始化部分代码:
RSA::RSA_Generated_Parameter (){
q.GeneratePrime();
while(p==q) //判断两个素数不等
q.GeneratePrime();
temp=p-I;
t=q-I;
t=t*temp;
cout<<"素数p为:"<<endl; //输出素数
p.print();
cout<<endl;
cout<<"素数q为:"<<endl;
q.print();
cout<<endl;
cout<<"公钥n为:"<<endl;
n=p*q;
n.print();
cout<<endl;
cout<<"公钥e为:"<<endl;
e.print();
cout<<endl;
d.ex_euclid(e,t); //计算私钥d
cout<<"私钥d为:"<<endl;
d.print();
cout<<endl;
}
RSA加解密部分代码:
RSA::RSA_Decrypt_Crypt (char s)
{
a=BigNum(A);
cout<<endl;
b=a.power_mod(e,n); //产生密文b
cout<<"加密结果为:"<<endl;
b.print();
cout<<endl;
c=b.power_mod(d,n); //解密
cout<<"解密后的结果为:"<<endl<<endl;
c.printS();
}
【实验思考】
RSA密码算法的安全性在于什么?
RSA算法的安全在于,e、p、N,是随机生成的。
知道e和N,想寻找p,在计算上是不可行的(基于对大质数进行因式分解过于困难)。