我正在尝试使用加性密码来模拟暴力攻击,我需要在一些数字上使用模数,但是当我尝试使用模数运算符“%”时,这似乎从来都不是我的代码
#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。我不知道为什么这种方法无法奏效。
答案 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
,因此,结果数组将具有负值。