RSA的实现原理

来源:互联网 发布:极度干燥 知乎 编辑:程序博客网 时间:2024/05/16 19:32

1、RSA算法概述
RSA公开密钥密码体制。所谓的公开密钥密码体制就是使用不同的加密密钥与解密密钥,是一种“由已知加密密钥推导出解密密钥在计算上是不可行的”密码体制。
RSA的安全性依赖于大数分解,但是否等同于大数分解一直未能得到理论上的证明,因为没有证明破解RSA就一定需要作大数分解。假设存在一种无须分解大数的算法,那它肯定可以修改成为大数分解算法。 RSA 的一些变种算法已被证明等价于大数分解。不管怎样,分解n是最显然的攻击方法。人们已能分解多个十进制位的大素数。因此,模数n必须选大一些,因具体适用情况而定。
2、RSA原理
假设有消息发送方A和消息接收方B,通过下面的几个步骤,就可以完成消息的加密传递:
消息发送方A在本地构建密钥对,公钥和私钥;
消息发送方A将产生的公钥发送给消息接收方B;
B向A发送数据时,通过公钥进行加密,A接收到数据后通过私钥进行解密,完成一次通信;反之,A向B发送数据时,通过私钥对数据进行加密,B接收到数据后通过公钥进行解密。由于公钥是消息发送方A暴露给消息接收方B的,所以这种方式也存在一定的安全隐患,如果公钥在数据传输过程中泄漏,则A通过私钥加密的数据就可能被解密。
如果要建立更安全的加密消息传递模型,需要消息发送方和消息接收方各构建一套密钥对,并分别将各自的公钥暴露给对方,在进行消息传递时,A通过B的公钥对数据加密,B接收到消息通过B的私钥进行解密,反之,B通过A的公钥进行加密,A接收到消息后通过A的私钥进行解密。
3、RSA算法实现
找两素数p和q
取n=p*q
取Φ(n)=(p-1)*(q-1)
取任何一个数e,要求满足e<Φ(n)并且e与Φ(n)互素(就是最大公因数为1)
取d*e=1modΦ(n) ;(K’*Φ(n)+ed=1)利用辗转相除法求d
这样最终得到三个数: n d e
设明文为M(M< n)
设c=(M**e)%n就得到了加密后的消息c //**表示次方
设m=(c**d)%n则 m == M,从而完成对c的解密。
在对称加密中:
n d两个数构成公钥,可以告诉别人;
n e两个数构成私钥,e自己保留,不让任何人知道。
给别人发送的信息使用e加密,只要别人能用d解开就证明信息是由你发送的,构成了签名机制。别人给你发送信息时使用d加密,这样只有拥有e的你能够对其解密。
部分主要算法的实现如下:
//欧几里得算法求最大公约数
int gcd(int a, int b) {
order(a,b);
if(b == 0)
return a;
else
return gcd(b,a%b);
}
// 快速模幂算法 加密解密用
int modular_multiplication(int a, int b, int n) {
int f = 1;
int bin[32];
switch_to_bit(b,bin);
for(int i=31; i>=0; i–) {
f = (f * f) % n;
if(bin[i] == 1) {
f = (f * a) % n;
}
}
return f;
}

//扩展欧几里得算法
int ex_gcd(int a,int b, int &x,int &y)
{
if(a==0&&b==0)return -1;
if(b==0)
{ x=1;
y=0;
return a;
}
else
{
ex_gcd(b, a % b, x, y);
int t = x;
x = y;
y = t-(a/b)*y;
}
}
//乘法逆元
int mod_inverse(int a,int n)
{
int x,y;
int b=ex_gcd(a,n,x,y);
if(b==1){
return (y+a)%a;
}
}

原创粉丝点击