Цезарь Шифр ​​Брутфорс

Это мое учебное упражнение, мы должны грубо заставить следовать «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

Решение

Каждый цикл модифицирует ввод, как упомянуто Александром О’Мара — рефакторингом, чтобы отделить изменение ключа от теста.

Объявите функцию для тестирования (отдельно от грубой силы)

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 является новой копией нетронутой строки. Каждый последующий ключ шифрового шифра сдвигается на один символ, что должно было предупредить вас о повторном использовании строки.

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-программа для реализации алгоритма Цезаря Шифра

0

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector