我的RSA加密每次产生2 ^ 64(C ++)

时间:2014-03-09 12:12:27

标签: c++ algorithm encryption rsa

我已经尝试过我自己的RSA算法,但是当我使用相当大的数字(没有像RSA应该使用的大小那样)时,加密部分并不是很有用,我不知道为什么。

它的工作方式如下:

输入是一个字符列表,例如“abc”

将其转换为数组:[10,11,12]。 (我选择10 - 35作为小写字母,这样它们都是2位数字,只是为了让它更容易)

数字组合形成121110(使用12 * 100 ^ 2 + 11 * 100 ^ 1 + 10 * 100 ^ 0)

应用算法:m ^ e(mod n) 使用a ^ b(mod n)= a ^ c(mod n)* a ^ d(mod n)

进行简化

这适用于小值,因为它可以使用我编写的解密程序进行解密。

当使用较大的值时,输出总是1844674407188030241,经过一些研究我发现这大约是2 ^ 64(有10个有效数字,有人指出奇数不能是2的幂,哎呀)。我确信有些东西是我忽略的,我为什么(我真的希望)将是一个简单的问题并且答案很简单而道歉。为什么输出值总是2 ^ 64,我可以更改什么来修复它?非常感谢您的帮助,这是我的代码:

#include <iostream>
#include <string>
#include <math.h>

int returnVal (char x)
{
    return (int) x;
}

unsigned long long modExp(unsigned long long b, unsigned long long e, unsigned long long m)
{
unsigned long long remainder;
int x = 1;

while (e != 0)
{
remainder = e % 2;
e= e/2;

if (remainder == 1)
x = (x * b) % m;
b= (b * b) % m;
}
return x;
}

unsigned mysteryFunction(const std::string& input)
{
  unsigned result = 0;
  unsigned factor = 1;

  for (size_t i = 0; i < input.size(); ++i)
  {
    result += factor * (input[i] - 87);
    factor *= 100;
  }

  return result;
}

int main()
{
    unsigned long long p = 70021;
    unsigned long long q = 80001;
    int e = 7;
    unsigned long long n = p * q;
    std::string foo = "ab";
    for (int i = 0; i < foo.length(); i++);

    {
        std::cout << modExp (mysteryFunction(foo), e, n);
    }
}

2 个答案:

答案 0 :(得分:2)

您的代码有几个问题。

问题1:unsigned long long的使用不一致。

int x = 1;

modExp中的此声明更改为unsigned long long会导致程序提供更合理的结果。我不知道它是否是正确的结果,但它至少小于n。我仍然不确定错误的确切机制是什么。我可以看到它会搞砸的方法,但没有一个可能导致输出1844674407188030241。

问题2:复合“素数”。

对于RSA,pq都需要为素数。 <{1}}和p都不是代码中的主要内容。

q

答案 1 :(得分:0)

mysteryFunction中,从输入字符中减去89,对应于'W'。你可能想要减去'97',它对应于'a'。