c++ - 我的 RSA 加密每次生成 2^64 (C++)

标签 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);
    }
}

最佳答案

您的代码有几个问题。

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

int x = 1;

modExp 中的声明更改为 unsigned long long 会使程序给出看起来更合理的结果。我不知道它是否是正确的 结果,但它至少小于n。我仍然不确定错误的确切机制是什么。我可以看到它会把事情搞砸的方式,但没有一种会导致输出 1844674407188030241。

问题 2:复合“素数”。

对于 RSA,pq 都需要是素数。 pq 在您的代码中都不是素数。

70021 = 7^2 * 1429
80001 = 3^2 * 2963

关于c++ - 我的 RSA 加密每次生成 2^64 (C++),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22282022/

相关文章:

algorithm - 在图中查找连通分量

c++ - 我应该为 dikjstra/A* 算法使用可变优先级队列吗?

java - PHP和JAVA加解密例程

java - 将字节数组加载到内存类加载器中

c++ - 编写抽象函数将整数转换为字符串

c++ - 如何在 C++ 中使用 opencv 拼接 4 张图像

c++ - DrawText 不会在 MFC 中的文本末尾添加省略号

algorithm - 如何以更少的内存使用找到最长的公共(public)子串?

java - 您将 key 存储在 Java Web 应用程序的什么位置?

c++ - EvtSubscribe 拉与推模型