前面的博文(转载阮一峰)已经讲了RSA算法的基本原理。很久以前的博文曾涉及过模幂算法,今天终于可以登台亮相了,先回顾一下模幂算法的程序吧:
#include<iostream>
using namespace std;
// 返回值: a的b次方,然后对n求模
int getMod(int a, int b, int n)
{
int i, r = 1;
for(i = 1; i <= b; i++)
{
r = ( (r % n) * (a % n) ) % n;
}
return r;
}
int main()
{
int a = 3;
int b = 4;
int n = 5;
cout << getMod(a, b, n) << endl; // 3 * 3 * 3 * 3 % 5 = 1
a = 103;
b = 104;
n = 105;
cout << getMod(a, b, n) << endl; // 103 * 103 *...* 103 % 105 = 46, 与Windows自带计算器算出的结果完全一致
return 0;
}
好,现在假设Bob要与Alice进行通信, Alice首先来产生秘钥对,产生方式如下:
Alice选择满足条件的 p = 61, q = 53, 计算出n = 61 * 53 = 3233, f(n) = (p - 1) * (q - 1) = 60 * 52 = 3120, Alice选择满足条件的e为17, 计算出e对于f(n)的模反元素d = 2753,
到此为止,Alice拥有了RSA加密的公钥(n, e)和私钥(n, d), Alice把公钥(n, e)告诉给Bob, Bob便可以利用公钥(n, e)来对信息进行加密了,不妨设:Bob想发送给Alice的信息是65, 那么Bob的加密方法为:
#include<iostream>
using namespace std;
// 返回值: a的b次方,然后对n求模
int getMod(int a, int b, int n)
{
int i, r = 1;
for(i = 1; i <= b; i++)
{
r = ( (r % n) * (a % n) ) % n;
}
return r;
}
int RSA_encrypt(int m, int n, int e)
{
int c = getMod(m, e, n);
return c;
}
int main()
{
int m = 65;
int n = 3233;
int e = 17;
cout << RSA_encrypt(m, n, e) << endl; // 2790
return 0;
}
Bob把2790发给Alice, Alice收到2790后,利用私钥对2790进行解密, 解密过程为:
#include<iostream>
using namespace std;
// 返回值: a的b次方,然后对n求模
int getMod(int a, int b, int n)
{
int i, r = 1;
for(i = 1; i <= b; i++)
{
r = ( (r % n) * (a % n) ) % n;
}
return r;
}
int RSA_decrypt(int c, int n, int d)
{
int m = getMod(c, d, n);
return m;
}
int main()
{
int c = 2790;
int n = 3233;
int d = 2753;
cout << RSA_decrypt(c, n, d) << endl; // 65
return 0;
}
可见, Alice正确解密了Bob发送的信息。
当然,在真正的实际应用中,数据远远大于上述例子中的数据,此时,上述程序就失效了,需要采用新的大数映射和运算方法,openssl在这个方面就做得非常好。