凯撒密码暴力

时间:2016-01-03 07:26:14

标签: c++ encryption cryptography brute-force caesar-cipher

这是我的课堂练习,我们必须强行遵循“hdvb wr euhdn”并找到有效的密钥,但是我的代码打破了它(我认为正确)但是两个不同的密钥产生相同的结果。这是正常的还是我做错了?

键2和11工作,以及其他一些不起作用仍然重复相同的字符。我们刚刚介绍了基本的凯撒移位密码,我认为这种方法是最好的蛮力。 enter image description here

#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;

    }

}

2 个答案:

答案 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);
}}

加密功能来源:C program to implement Caesar Cipher Algorithm