RSA算法的简要实现(其实原理非常简单)

       前面的博文(转载阮一峰)已经讲了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在这个方面就做得非常好。


  


 

评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值