这是我的课堂练习,我们必须强行遵循“hdvb wr euhdn”并找到有效的密钥,但是我的代码打破了它(我认为正确)但是两个不同的密钥产生相同的结果。这是正常的还是我做错了?
键2和11工作,以及其他一些不起作用仍然重复相同的字符。我们刚刚介绍了基本的凯撒移位密码,我认为这种方法是最好的蛮力。
#include<iostream>
#include<String>
using std::string;
using std::endl;
void bruteForce(string x);
void bruteForce(string x)
{
int key = 0;
int length = (int)x.length();
for (int i = 0; i < 25; i++)
{
key++;
std::cout << "The key is " << key << endl;
std::cout << endl;
for (int j = 0; j < length; j++)
{
if (x[j] == ' ')
{
x[j] = ' ';
std::cout << x[j];
j++;
}
x[j] = tolower(x[j]);
x[j] -= 97;
x[j] -= key;
if (x[j] < 0)
{
x[j] += 26;
}
x[j] += 97;
std::cout << x[j];
}
std:: cout << endl;
}
}
答案 0 :(得分:0)
每个循环都在修改输入,正如Alexander O&#39; Mara - refactor所提到的那样,将密钥更改与测试分开。
声明测试功能(与暴力分开)
void Test(std::string x, int key);
从bruteForce调用它。
void bruteForce(string x)
{
int key = 0;
for (int i = 0; i < 25; i++)
{
key++;
Test( x, key );
}
}
实施
void Test(std::string x, int key)
{
int length = (int)x.length();
std::cout << "The key is " << key << endl;
std::cout << endl;
for (int j = 0; j < length; j++)
{
if (x[j] == ' ')
{
x[j] = ' ';
std::cout << x[j];
}
else {
x[j] = tolower(x[j]);
x[j] -= 97;
x[j] -= key;
if (x[j] < 0)
{
x[j] += 26;
}
x[j] += 97;
}
std::cout << x[j];
}
std::cout << endl;
}
我略微改变了你的空间,以便连续2个空格,不会混淆它。
代码有效,因为每次调用Test
都是原始字符串的新副本。 cesear cypher的每个连续密钥都会移动一个字符,因此应该提醒您重新使用该字符串。
答案 1 :(得分:0)
您只需使用以下功能解密凯撒密码
即可void decrypt(char arr[],int key){
int i,j;
for(i=0;i<strlen(arr);i++){
if(arr[i]==' ')
continue;
for(j=0;j<key;j++){
arr[i]--;
if(arr[i]<97 && arr[i] > 90)
arr[i] = 122;
if(arr[i] < 65)
arr[i] = 90;
}
}}
对于暴力,您可以简单地将上述函数放入for循环中,该循环将从1到26迭代,为解密函数提供所有26个可能的键。以下是示例
int main(){
int i;
char arr[100],copy[100];
printf("Enter a string: ");
scanf ("%[^\n]s", arr);
strcpy(copy,arr);
for(i=1;i<=26;i++){
encrypt(arr,i);
printf("Bute Force key : %d ---> %s\n",i,arr);
strcpy(arr,copy);
}}