// Only allowed for key:
// !"#$%&'()*+,-./0123456789:abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ
// char source[] = "ABCDEFGHIJK/*-+,_/();LMNO.PQRST,UVWX,YZabcpq!SWrstu,vwxyz,01789";
char source[] = "tNM5Rp6q:4nTK0zave.%BN)U(mGeoT-7TIFYhH-2TMlJ+OB0Z'Z'd'G%tTM!#*Z1NMl88m";
// char source[] = "ppgrocy.ddns.info,211,login,Password,/path/";
// const String KEY = "SlEPY1CE";
// const char key[] = "SlEPY1CE";
// const PROGMEM char key[] = "tNM5Rp6q:4nTK0zave.%BN)U(mGeoT-7TIFYhH-2TMlJ+OB0Z'Z'd'G%tTM!#*Z1NMl88m";
const PROGMEM char key[] = "67Uo3BwuJK+9Zm5.v1lSjbVs04M%(e&Y8dDQENX\"L:Cx!Gkp*TczqRiA'2)PnyfIagrWOt";
char compare[100];
void setup() {
Serial.begin(115200);
if (! CheckKey()) {
Serial.print("Can't continue with a key containing not allowed characters!");
while(1) ;
}
/*
GenerateSource(12, 64);
Serial.print("Plain Text: ");
Serial.println(source);
strcpy(compare,source);
vigenere_cipher(source, true);
// String encryption_result = vigenere_cipher(source, true);
Serial.print("Encryption: ");
Serial.println(source);
// Serial.println(encryption_result);
vigenere_cipher(source, false);
// String decryption_result = vigenere_cipher(source, false);
Serial.print("Decryption: ");
Serial.println(source);
// Serial.println(decryption_result);
Serial.println();
if (strcmp(compare, source) != 0) {
Serial.print("Encoding - decoding NOT equal!");
while(1) ;
}
*/
}
void loop() {
GenerateSource(12, 64);
Serial.print("Plain Text: ");
Serial.println(source);
strcpy(compare,source);
vigenere_cipher(source, true);
Serial.print("Encryption: ");
Serial.println(source);
// Serial.println(encryption_result);
vigenere_cipher(source, false);
Serial.print("Decryption: ");
Serial.println(source);
Serial.println();
if (strcmp(compare, source) != 0) {
Serial.print("Encoding - decoding NOT equal!");
while(1) ;
}
// delay(500);
}
void vigenere_cipher(char* text, bool is_encryption) {
uint8_t keylen = strlen(key);
// Serial.print("Key length: ");
// Serial.println(keylen);
uint8_t ascii, text_index, key_index, result_index;
char character;
for (int i = 0; i < strlen(text); i++) {
ascii = text[i];
text_index = (text[i] % 32) ;
key_index = (pgm_read_byte(&key[i % keylen]) % 32) ;
if (is_encryption)
result_index = (text_index + key_index) % 32;
else
result_index = (text_index - key_index + 32) % 32;
if (ascii >= '`' && ascii <= 127) character = result_index + '`';
else if (ascii >= '@' && ascii <= '_') character = result_index + '@';
else if (ascii >= ' ' && ascii <= '?') character = result_index + ' ';
else character = ascii;
text[i] = character;
}
// return;
}
void GenerateSource(uint8_t Minlength, uint8_t Maxlength) {
uint8_t length;
uint8_t i;
randomSeed(analogRead(A0));
length = random(Minlength, Maxlength + 1);
for (i = 0; i < length; i++) {
source[i] = random(32, 128);
}
source[i] = '\0';
}
bool CheckKey() {
char KeyChar;
bool AllClear = true;
for (int i = 0; i < strlen(key); i++) {
KeyChar = pgm_read_byte(&key[i]);
if (!((KeyChar >= 'a' && KeyChar <= 'z') || (KeyChar >= 'A' && KeyChar <= 'Z') || (KeyChar >= '!' && KeyChar <= ':'))){
if(AllClear){
Serial.print("Invalid Character(s) in the Key: ");
AllClear = false;
}
Serial.print(KeyChar);
Serial.print(F(" "));
}
}
if(! AllClear) Serial.println();
return AllClear;
}