首先,这不是“这是我的代码,有什么问题?”题。相反,它是“这是我的代码,这是问题,数组中哪些部分被我误解?”。我希望这些问题之间的区别意味着这篇文章不会惹恼太多人;我希望能够提高我的知识,不让其他人为我工作。
我所遇到的问题我确定是由于我对数组如何工作的基本(希望很容易解释)问题。我是自学成才,我的问题太过具体,我无法从谷歌那里找到任何帮助。
我会快速解释我的代码的每个部分在重要的情况下做了什么,对不起,如果这是无关紧要的(假设是RSA算法的加密部分):< / p>
int returnVal (char x)
{
return (int) x - 87;
}
这会将字母转换为数字,a = 10,b = 11,... z = 35。
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;
}
本节只是我自己的模幂运算和简化的函数,根据:a ^ b(mod n)= a ^ c(mod n)* a ^ d(mod n)其中c + d = b。它允许快速使用大值(并且还避免浮点错误)。这个函数本身工作正常(使用wolfram alpha检查了很多答案)但我已经包含它以防万一与我的数组结合时出现某种错误。
int main()
{
unsigned long long p = 101;
unsigned long long q = 103;
int e = 7;
unsigned long long n = p * q;
std::string s = "ab";
for (unsigned long long i = 0; i < s.length(); i++)
{
std::cout << modExp (returnVal(s[i]), e, n);
}
}
这是我遇到问题的地方,我正在尝试使用数组来组合“ab”以形成“1011”然后执行RSA算法。 目前正在执行10 ^ 7(mod 10403)= 2717 和11 ^ 7(mod 10403)= 2352 < / em> 并输出“ 27172352 ”。我想要发生的是它执行1011 ^ 7(mod 10403)= 2122 并将其作为输出(我将那部分以粗体显示给那些直接跳过问题的人)。
显然,我尝试使用数组将“ab”组合到“1011”是错误的。我的问题是为什么这是错的?有没有办法调整它以使其正确?如果不是,我应该采用什么新方法将数字组合在一起?
我很抱歉,如果这个问题有点长,但我宁愿过于具体而不是过于模糊,感谢任何反馈,我将在下面粘贴我的代码,以便将它们集中在一个地方。 (另外,我使用无符号长整数,因为通常p和q会大得多)
#include <iostream>
#include <sstream>
#include <string>
#include <math.h>
int returnVal (char x)
{
return (int) x - 87;
}
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;
}
int main()
{
unsigned long long p = 101;
unsigned long long q = 103;
int e = 7;
unsigned long long n = p * q;
std::string s = "ab";
for (unsigned long long i = 0; i < s.length(); i++)
{
std::cout << modExp (returnVal(s[i]), e, n);
}
}
答案 0 :(得分:0)
如果我理解正确:
您需要做的就是让returnVal
接受char *
或std::string
,然后将整个字符串传递给您。然后它应该逐个转换字符并添加(在将out变量乘以100之后,假设您要坚持使用十进制数)到(可能是巨大的)整数输出。虽然,我建议使用十六进制,因为它应该更快(按位移与乘以100)。
编辑:
该功能看起来与此类似:
unsigned long long returnVal(char *str, size_t length){
unsigned long long result = 0;
for(unsigned int i=0;i<length;++i){
// Do stuff :D
}
return result;
}
我将int更改为unsigned long long
因为值会变得非常快。在现实世界的实施中,它无论如何都会太小。
答案 1 :(得分:0)
“显然我尝试使用数组将”ab“与”1011“结合起来是错误的。”
当然,字符串数组中的每个元素都是一个单独的字母,s [0] =='a',s [1] =='b'。 数组元素无法“组合”。
您可以组合使用2位十进制数字:
int left = returnVal('a'); // decimal 10
int right = returnVal('b'); // decimal 11
int result = (left *= 100) + right; // 1000 + 11 = 1011
P.S。在实施RSA时,“ab”意味着什么?