在C ++中对数组的误解

时间:2014-03-01 00:57:50

标签: c++ arrays rsa

首先,这不是“这是我的代码,有什么问题?”题。相反,它是“这是我的代码,这是问题,数组中哪些部分被我误解?”。我希望这些问题之间的区别意味着这篇文章不会惹恼太多人;我希望能够提高我的知识,不让其他人为我工作。

我所遇到的问题我确定是由于我对数组如何工作的基本(希望很容易解释)问题。我是自学成才,我的问题太过具体,我无法从谷歌那里找到任何帮助。

我会快速解释我的代码的每个部分在重要的情况下做了什么,对不起,如果这是无关紧要的(假设是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);
    }
}

2 个答案:

答案 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

请参阅:Positional numeral system

P.S。在实施RSA时,“ab”意味着什么?