Здравствуйте!
Есть код на C++ (реализация идеи симметричного шифрования Гилберта Вернама), компилируется без ошибок, в принципе - даже работает, если бы не одно но:
Корректная работа программы возможна только при следующих условиях:
- в сообщении допустимо использовать только заглавные латинские буквы (без пробелов);
- в ключе допустимо использовать только цифры и заглавные латинские буквы;
При соблюдении этих условий, код работает корректно.
Но хотелось бы всё-таки научить его кириллице, знакам пунктуации, регистру.
Возможно ли без изменения всей логики в целом? Если да, то как?
Программа алгоритма шифрования:
#include<bits/stdc++.h>
using namespace std;
int main(){
int t,n,i,j,k,sum=0;
string m;
cout<<"Enter the message"<<'\n';
cin>>m;
string key;
cout<<"Enter the key"<<'\n';
cin>>key;
int mod = key.size();
j=0;
for(i=key.size();i<m.size();i++){
key+=key[j%mod];
j++;
}
string ans="";
for(i=0;i<m.size();i++){
ans += (key[i]-'A'+m[i]-'A')%26+'A';
}
cout<<"Encrypted message: "<<ans<<'\n';
return 0;
}
Пример работы:
$ ./en
Enter the message
LINUX
Enter the key
LORORGRU
Encrypted message: WWEIO
Программа алгоритма дешифрования:
#include<bits/stdc++.h>
using namespace std;
int main(){
int t,n,i,j,k,sum=0;
string m;
cout<<"Enter the message"<<'\n';
cin>>m;
string key;
cout<<"Enter the key"<<'\n';
cin>>key;
int mod = key.size();
j=0;
for(i=key.size();i<m.size();i++){
key+=key[j%mod];
j++;
}
string ans="";
for(i=0;i<m.size();i++){
ans += (m[i]-key[i]+26)%26+'A';
}
cout<<"Decrypted message: "<<ans<<'\n';
return 0;
}
Пример:
$ ./de
Enter the message
WWEIO
Enter the key
LORORGRU
Decrypted message: LINUX
Источник: https://japp.io/cryptography/vernam-cipher-algorithm-program-in-c-c/
Компиляцию выполнял следующим образом (debian 11):
$ g++ en.cpp -o en
$ g++ de.cpp -o de
Запуск в терминале:
$ ./en
$ ./de
Также интересует мнение относительно криптостойкости данной реализации.