密码学实验4

  • 格式:doc
  • 大小:94.03 KB
  • 文档页数:11

实验4 非对称密码算法RSA

一、 实验目的

二、 通过实际编程了解非对称密码算法RSA的加密和解密过程, 加深对非对称密码算法的认识。

三、 实验原理

1、算法原理

步骤如下(这里设B为是实现者)

(1)B寻找出两个大素数p和q。

(2)B计算出n=p*q和(n)=)(p-1)*(q-1)。

(3)B选择一个随机数e(0

(4)B使用欧几里得算法计算e的模余(n)的乘法逆元素d。

B在目录中公开n和e作为他的公开密钥, 保密p、q和d。

加密时, 对每一明文m计算密文

cΞme(modn)

解密时, 对每一密文c计算明文

mΞcd(modn)

四、 实验环境

五、 运行Windows或者Linux操作系统的PC机, 具有gcc(Linux)、VC(Windows)等C语言编译环境。

六、 实验内容

1.为了加深对 算法的了解, 根据输入的参数p, q, M, 手工计算公私钥, 并对明文进行加密, 然后对密文进行解密。

2.编写 程序, 加密一段文字, 了解 算法原理。尝试加密一大段文字, 记录程序的运行时间。使用DES算法加密相同的文字, 比较两种算法加密的速度。

3.编写一个程序, 随机选择3个 较大的数 , 计算 , 记录 程序运行时间。

查阅资料给出简单说明大数在计算机上是如何表示, 如何进行运算。 4、查阅资料, 找出目前实际可行的素数判定法则, 并比较各自的优缺点。

五、实验步骤

1.主要函数说明

(1)判断一个数是否为素数函数

bool prime(int n)

{

int m=sqrt(n);

for(int i=2;i

{

if(n%i==0)

break;

}

if(i>=m)

return 1;

else return 0;

}

(2)模幂算法 (这里以明文m为一个为例)

①令f=1;

②用for循环遍历从i=1到i=b, 令f=(f*a)%n

③输出f, f的值即为模幂的结果。

int multiplication(int a,int b,int n)

{

int f=1;

for(int i=1;i<=b;i++)

{

f=(f*a)%n;

}

return f;

}

(3)扩展欧几里得算法

由扩展欧几里得算法可以计算整数s和t , 使得s*e+t*N=(e,N)=1,则e的乘法逆元等价于s

mod N。

①定义变量 x1,x2,x3,y1,y2,y3,t1,t2,t3,q;

②令 x1 = y2 = 1; x2 = y1 = 0;

③计算q = x3/y3; t1 = x1 - q*y1;

t2 = x2 - q*y2; t3 = x3 - q*y3; ④ x1 = y1; x2 = y2; x3 = y3; y1 = t1; y2 = t2; y3 = t3;

⑤当 y3 =1时, *result = y2; result 的结果即为所求乘法逆元;如果y3 ! =1, 则返回顺序执行③、④步直到满足 y3 =1

int ExtendedEuclid( int f,int d ,int *result)

{

int x1,x2,x3,y1,y2,y3,t1,t2,t3,q;

x1 = y2 = 1;

x2 = y1 = 0;

if(f>=d)

{

x3=f;

y3=d;

}

else

{

x3=d;

y3=f;

}

while( 1 )

{

if ( y3 == 1 )

{

*result = y2; /* 两个数互素则resutl为其乘法逆元, 此时返回值为1 */

return 1;

}

q = x3/y3;

t1 = x1 - q*y1;

t2 = x2 - q*y2;

t3 = x3 - q*y3;

x1 = y1;

x2 = y2;

x3 = y3;

y1 = t1;

y2 = t2;

y3 = t3;

}

}

(4)主函数

①输入两个数字判断是否为素数, 当不为素数时重新输入。如输入 17 11

②输入e, 得到公钥。如输入e为7

③调用ExtendedEuclid(e,N,&d)函数, 得到d, 和私钥。如d=23 ④输入明文长度。如输入 5 如输入明文为 56 88 78 12 23

⑤开始加密, 调用加密函数 Encryption()。 则输入密文为 78 11 56 177 133

⑥开始解密, 调用解密函数 Decipher()。 则解密后明文为 56 88 78 12 23

2、打开VC++, 编写程序如下:

#include

#include

int p,q,n,e,d,N,m1[100],m2[100],len;

//判断一个数是否为素数, 为素数返回1, 否则返回0

bool prime(int n)

{

int m=sqrt(n);

for(int i=2;i

{

if(n%i==0)

break;

}

if(i>=m)

return 1;

else return 0;

}

//扩展欧几里得算法求乘法逆元,两数互素返回1

int ExtendedEuclid( int f,int d ,int *result)

{

int x1,x2,x3,y1,y2,y3,t1,t2,t3,q;

x1 = y2 = 1;

x2 = y1 = 0;

if(f>=d)

{

x3=f;

y3=d;

}

else

{

x3=d;

y3=f;

}

while( 1 )

{

if ( y3 == 1 )

{

*result = y2; /* 两个数互素则resutl为其乘法逆元, 此时返回值为1 */ return 1;

}

q = x3/y3;

t1 = x1 - q*y1;

t2 = x2 - q*y2;

t3 = x3 - q*y3;

x1 = y1;

x2 = y2;

x3 = y3;

y1 = t1;

y2 = t2;

y3 = t3;

}

}

//将十进制数据转化为二进制数组

void to_bit(int b,int bit[32])

{

int n=0;

while(b>0)

{

bit[n]=b%2;

n++;

b/=2;

}

}

//模幂算法

int multiplication(int a,int b,int n)

{

int f=1;

for(int i=1;i<=b;i++)

{

f=(f*a)%n;

}

return f;

}

//加密函数

void Encryption()

{ cout<<"******************开始加密*****************"<

int i;

cout<<"请输入明文: ";

for(i=0;i

cin>>m1[i];

for(i=0;i

m2[i]=multiplication(m1[i],e,n);

cout<<"加密后的密文为: ";

for(i=0;i

cout<

cout<

}

//解密函数

void Decipher()

{

int i;

cout<<"*************开始解密*************"<

for(i=0;i

m2[i]=multiplication(m2[i],d,n);

cout<<"解密后的明文为: ";

for(i=0;i

cout<

cout<

}

void main()

{

cout<<"输入两个素数p和q:\n";

while(1)

{

cin>>p;

if(prime(p))

{

cout<

break;

}

else

{

cout<

continue;

}

}