我已经尝试过我自己的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);
}
}
答案 0 :(得分:2)
您的代码有几个问题。
问题1:unsigned long long
的使用不一致。
int x = 1;
将modExp
中的此声明更改为unsigned long long
会导致程序提供更合理的结果。我不知道它是否是正确的结果,但它至少小于n
。我仍然不确定错误的确切机制是什么。我可以看到它会搞砸的方法,但没有一个可能导致输出1844674407188030241。
问题2:复合“素数”。
对于RSA,p
和q
都需要为素数。 <{1}}和p
都不是代码中的主要内容。
q
答案 1 :(得分:0)
在mysteryFunction
中,从输入字符中减去89,对应于'W'。你可能想要减去'97',它对应于'a'。