对于RSA加密算法的理解

来源:互联网 发布:apache服务器下载64位 编辑:程序博客网 时间:2024/05/29 07:17
RSA算法基于一个十分简单的数论事实:将两个大质数相乘十分容易,但是想要对其乘积进行因式分解却极其困难,因此可以将乘积公开作为加密密钥。RSA公开密钥密码体制。所谓的公开密钥密码体制就是使用不同的加密密钥与解密密钥,是一种“由已知加密密钥推导出解密密钥在计算上是不可行的”密码体制。
公开密钥密码体制中,加密密钥(即公开密钥)PK是公开信息,而解密密钥(即秘密密钥)SK是需要保密的。加密算法E和解密算法D也都是公开的。虽然解密密钥SK是由公开密钥PK决定的,但却不能根据PK计算出SK。
RSA算法是一种非对称密码算法,所谓非对称,就是指该算法需要一对密钥,使用其中一个加密,则需要用另一个才能解密。
RSA的算法涉及三个参数,n、e1、e2。
其中,n是两个大质数p、q的积,n的二进制表示时所占用的位数,就是所谓的密钥长度。
e1和e2是一对相关的值,e1可以任意取,但要求e1与(p-1)*(q-1)互质;再选择e2,要求(e2*e1)mod((p-1)*(q-1))=1。
(n,e1),(n,e2)就是密钥对。其中(n,e1)为公钥,(n,e2)为私钥。
RSA加解密的算法完全相同,设A为明文,B为密文,则:A=B^e2 mod n;B=A^e1 mod n;(公钥加密体制中,一般用公钥加密,私钥解密)
e1和e2可以互换使用,即:
A=B^e1 mod n;B=A^e2 mod n;
以上是网上摘录,下面谈谈自己对RSA的理解:
1.RSA加密算法的关键在于质数对(p,q)的选取
2.计算n=p*q,欧拉函数φ(n)=(p-1)(q-1)
3.随机数e的选取,条件是1<e<φ(n),并且e与φ(n)互质,其实e也就是公钥
4.这里给出私钥的求解方法,对于求出的φ(n) 选取可以将其分解,例若p,q选取7,11,则φ(n)=60=2*3*5*2,
求值m=60*(1-1/2)*(1-1/3)*(1-1/5)=16,这里只挑选不同的因子取倒数,因2有两个但只用一个
私钥d=e^(m-1)mod(φ(n)),
对于明文加密:取明文x,y
加密:c1=(x^e)mod(n),n是pq的乘积,
          c2=(y^e)mode(n),
解密:x=(c1^d)mod(n)
          y=(c2^d)mod(n)
这个算法可能与其他的说明有些不同,但是结果都是对的,可以验证。
另外找到了一个程序源码(C语言版的)
#include <stdio.h>
#include<conio.h>
   int candp(int a,int b,int c)

int r=1;
    b=b+1;
    while(b!=1)
{
    r=r*a;
    r=r%c;
    b--;
}
  printf("%d\n",r);
  return r;
}
void main()
{
int p,q,e,d,m,n,t,c,r;
    char s;
printf("please input the p,q: ");
scanf("%d%d",&p,&q);
n=p*q;
printf("the n is %3d\n",n);
t=(p-1)*(q-1);
printf("the t is %3d\n",t);
printf("please input the e: ");
scanf("%d",&e);
if(e<1||e>t)
{
printf("e is error,please input again: ");
scanf("%d",&e);
}
d=1;
while(((e*d)%t)!=1)   d++;
printf("then caculate out that the d is %d\n",d);
printf("the cipher please input 1\n");
printf("the plain please input 2\n");
scanf("%d",&r);
switch(r)
{
case 1: printf("input the m: "); /*输入要加密的明文数字*/
            scanf("%d",&m);
            c=candp(m,e,n);
            printf("the cipher is %d\n",c);
case 2: printf("input the c: "); /*输入要解密的密文数字*/
            scanf("%d",&c);
            m=candp(c,d,n);
            printf("the cipher is %d\n",m);
}
getch();
}
原创粉丝点击