RSA密码算法的原理和编程实现

【实验目的】

1) 学习RSA密码算法的原理

2) 学习RSA密码算法的编程实现

【实验原理】

RSA公钥加密算法是1977年由Ron Rivest、Adi Shamirh和LenAdleman在美国麻省理工学院开发的。RSA算法基于一个十分简单的数论事实:将两个大素数相乘十分容易,但那时想要对其乘积进行因式分解却极其困难,因此可以将乘积公开作为加***。

 

算法原理

RSA密码算法的原理和编程实现

 

解密过程

RSA密码算法的原理和编程实现

 

算法参数

RSA密码算法的原理和编程实现

 

算法流程

(1)RSA**生成部分代码流程图:

RSA密码算法的原理和编程实现

 

(2)RSA加密部分流程图:

RSA密码算法的原理和编程实现

 

(3)RSA解密部分流程图:

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,在计算上是不可行的(基于对大质数进行因式分解过于困难)。