Idęą szyfrowania one time pad jest to, że do każdej wiadomości generujemy jednorazowy klucz długości tej wiadomości. Jest to sposób na szyfrowanie bardzo bezpieczne krótkich wiadomości.
Jedynym mankamentem samej metody jest fakt że przed przesłaniem zaszyfrowanej wiadomości musimy przesłać również klucz.
Implementacja
#include <cstdlib>
#include <iostream>
#include <string>
using namespace std;
void print_string(char string[], int len) {
int i=0;
while(i<len){
cout<<string[i];
i++;
}
}
int main(int argc, char *){
char key[20], msg[50], crypt[50], decrypt[50];
cout<<"podaj dlugosc klucza(0 to dl. wiadomosci): ";
int key_len;
cin>>key_len;
cout<<"podaj wiadomosc: ";
cin>>msg;
if(key_len==0) {
key_len=strlen(msg);
}
int msg_len = strlen(msg);
srand((unsigned)time(0));
for(int i=0; i<key_len; i++){
key[i]=(char)(rand()%256);
}
cout<<"\n\n\nklucz: ";
print_string(key, key_len);
cout<<"\tdlugosc klucza: "<<strlen(key)-1<<"\tdlugosc wiadomosci: "<<strlen(msg)<<endl;
int i=0;
while(i<msg_len){
int cur_key_char=0;
if(i>strlen(key))
cur_key_char = i % key_len ;
crypt[i] = msg[i]^ key[cur_key_char];
i++;
}
cout<<"\n\ncrypted:\n";
print_string(crypt, msg_len);
print_string(decrypt, msg_len);
int crypt_len = strlen(crypt);
cout<<"\n\nshould be:\n";
print_string(msg, msg_len);
i=0;
while(i<msg_len){
int cur_key_char=0;
if(i>strlen(key))
cur_key_char = i % key_len ;
decrypt[i] = crypt[i] ^ key[cur_key_char];
i++;
}
cout<<"\n\ndecrypted:\n";
print_string(decrypt, msg_len);
cout<<"\n\n\n\n";
system("PAUSE");
return EXIT_SUCCESS;
}
Do pobrania również wersja skompilowana plus źródło: Onetimepad XOR