我写的RSA简易算法,为啥结果错误?

zwdnet 2009-10-26 12:02:22
为了理解RSA算法,我按照网上的资料(http://www.winu.cn/space-14160-do-blog-id-11182.html)用C++写了个RSA加密解密的程序,为了理解算法本身,我没有用大整数。编译通过后加密解密测试出现错误结果,加密整数20结果密文和明文都是0,麻烦大家帮忙看看是我哪里理解有误。谢谢。

#include <iostream>
#include <cmath>
#include <cstdlib>
#include <ctime>

using namespace std;

//判断数字是否为素数
bool IsPrime(long N)
{
if (N == 2 || N == 3 ||
N == 5 || N == 7)
{
return true;
}
if (N % 2 == 0 || N % 3 == 0 ||
N % 5 == 0 || N % 7 == 0)
{
return false;
}
long sqrtN = long(sqrt(N)) + 1;
for (long i = 3; i < sqrtN; i += 2)
{
if (N % i == 0)
{
return false;
}
}
return true;
}

//查找大于a,小于b范围内的一个随机素数
long FindPrime(long a, long b)
{
long N = -1;
long n = b - a + 1;
srand(time(NULL));
do
{
N = rand() % n + a;
}while (!IsPrime(N));
return N;
}


//求m,n的最大公约数
long gcd(long m, long n)
{
if (m < n)
{
long tmp = m;
m = n;
n = tmp;
}
if (n == 0)
return m;
else
return gcd(n, m%n);
}

//求a的n次方
long mypow(long a, long n)
{
long tmp = a;
for (int i = 2; i <= n; i++)
{
tmp = tmp * a;
}
return tmp;
}

int main()
{
long a = 10, b = 20;
long p = FindPrime(a, b);
long q = FindPrime(a, b);
while (p == q)
{
q = FindPrime(a, b);
}
long R = (p-1)*(q-1);
//查找公钥r
long r = 2;
do
{
r++;
}while (gcd(r, R) != 1);
cout<<"p = "<<p<<endl
<<"q = "<<q<<endl
<<"r = "<<r<<endl;
//查找密钥m
long m = 2;
for (m = 2; m <= R; m++)
{
if ((r*m) % R == 1)
{
break;
}
}
cout<<"R = "<<R<<endl;
cout<<"m = "<<m<<endl;
long n = p*q;
cout<<"n = "<<n<<endl;
//加密解密测试
long M = 20; //要加密的内容
cout<<"明文 = "<<M<<endl;
long Mm = mypow(M, m)%n;
cout<<"密文 = "<<Mm<<endl;
long Dm = mypow(Mm, r)%n;
cout<<"解密 = "<<Dm<<endl;
return 0;
}


程序的一个输出为:
p = 17
q = 11
r = 3
R = 160
m = 107
n = 187
明文 = 20
密文 = 0
解密 = 0

Process returned 0 (0x0) execution time : 2.656 s
Press any key to continue.
...全文
99 2 打赏 收藏 转发到动态 举报
写回复
用AI写文章
2 条回复
切换为时间正序
请发表友善的回复…
发表回复
zwdnet 2009-10-26
  • 打赏
  • 举报
回复
谢谢,是数据溢出的问题。我把p,q的范围改成[5,10],再把待加密数据改成2,就测试成功了。
butwang 2009-10-26
  • 打赏
  • 举报
回复
long Mm = mypow(M, m)%n;

Mm = (20的107次方)%187,数据很大溢出了,数据被截断为0了

3,881

社区成员

发帖
与我相关
我的任务
社区描述
C/C++ 其它技术问题
社区管理员
  • 其它技术问题社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧