模量不返回数字的余数

时间:2018-10-04 03:03:22

标签: c++

我正在尝试使用加性密码来模拟暴力攻击,我需要在一些数字上使用模数,但是当我尝试使用模数运算符“%”时,这似乎从来都不是我的代码

#include <cstdlib>
#include <iostream>
using namespace std;



int main() 
{
    char cipherText [15] = "UOISCXEWLOBDOX";
    char guess [] = " ";
    int numArray [15];
    int modArray [15];
    int finalArray[15];
    char alpha [26] = {'A','B','C','D','E','F','G','H','I','J','K',
                'L','M','N','O','P','Q','R','S','T','U','V','W','X','Y','Z'};

    //Get Number for each letter
    for(int x = 0; x < sizeof(cipherText); x++)
    {    
        char c = cipherText[x];
        int num = 0;
        for(int i = 0; i<sizeof(alpha);i++)
        {
            if(c == alpha[i])
            {
                num = num + 0;
                break;
            } 
            else
            {
                num = num + 1;
            }    
        }
        numArray[x] = num;
        //cout<<" "<<numArray[x];
    }


    for(int i = 0; i < 26; i++)
    {  

        cout<<endl;

        for(int x = 0; x < 15; x++)
        {
            int j;
            if(i == 0)
            {
                j = numArray[x];
            }
            else
            {    
                j = numArray[x]-i;
            } 
            modArray[x] = j;
            //cout<<modArray[x]<<" ";
        }

        for(int x = 0; x < 15; x++)
        {    

            int y = (modArray[x])%26;
            cout<<modArray[x]<<" ";
        }




        cout<<endl;
    }    
}

输出保持为数字数组减去i。我不知道为什么这种方法无法奏效。

2 个答案:

答案 0 :(得分:1)

您的中间数组解决方案非常复杂,您不必要使用低级基元。该代码可以变得非常简单:

#include <iostream>
#include <string>
#include <algorithm>

int main() {
    const std::string cipherText = "UOISCXEWLOBDOX";
    constexpr int alphabetSize = 'Z' - 'A' + 1;

    for(int i = 0; i < alphabetSize; i++) {  
        std::string encryptedText(cipherText.size(), ' ');
        std::transform(cipherText.begin(), cipherText.end(), encryptedText.begin(),
            [=](char c){
                return ((c + i - 'A') % alphabetSize) + 'A';
            }
        );
        std::cout << encryptedText << std::endl;
    }
}

有一个关于'A' - 'Z'范围的线性度的假设,但是很难找到不这样做的机器。

这种假设允许代码的逻辑本质上浓缩为这一行:

return ((c + i - 'A') % alphabetSize) + 'A';

乍一看似乎有些怪异,但是一旦意识到-'A'+'A'部分在那里只是将字符映射到0-26范围,它就会变得更加容易。可以利用模运算。您显然可以将其拆分为多个转换,以更多的步骤进行(例如,减去'A',添加i,取模,添加'A')。

答案 1 :(得分:0)

取模运算符工作正常。

由于

,您得到的是负值

j = numArray[x]-i

我刚刚打印了您的 numArray ,对于一个实例,结果为20 14 8 18 2 23 4 22 11 14 1 3 14 23 26。现在,您要从numArray中的每个元素中减去i,因此,结果数组将具有负值。