const unsigned char key[32] = "UmaChaveMuitoMaiorQueAntesParaMaiorSeguranca"; // Chave de 32 caracteres
// Função para realizar um shift circular em um byte
unsigned char circularShift(unsigned char byte, int shifts) {
return (byte << shifts) | (byte >> (8 - shifts));
}
// Gera um IV aleatório a partir de uma entrada analógica ou random()
unsigned long generateRandomIV() {
int sensorValue = analogRead(A0); // Lê a entrada analógica A0
return (unsigned long)sensorValue ^ millis(); // Combina o valor analógico com o tempo em milissegundos
}
void setup() {
Serial.begin(9600);
unsigned char message[] = "Texto a ser criptografado";
Serial.print("Texto original: ");
Serial.println((char*)message);
unsigned long iv = generateRandomIV(); // Gera um IV aleatório
unsigned long iv_copy = iv; // Usar uma cópia do IV para não alterar o original
// Criptografar a mensagem
for (int i = 0; i < sizeof(message) - 1; i++) { // Subtrai 1 para evitar o terminador nulo
unsigned char iv_byte = (iv_copy >> (8 * (i % 4))) & 0xFF; // Extrai um byte do IV
message[i] = message[i] ^ key[i % 32]; // XOR com a chave
message[i] = circularShift(message[i], i % 8); // Shift circular para confusão
message[i] = message[i] ^ iv_byte; // XOR com o byte do IV
iv_copy = (iv_copy << 1) | (iv_copy >> 31); // Shift circular no IV para a próxima iteração
}
Serial.print("Texto criptografado: ");
for (int i = 0; i < sizeof(message) - 1; i++) { // Subtrai 1 para evitar o terminador nulo
if (message[i] < 0x10) {
Serial.print("0");
}
Serial.print(message[i], HEX);
Serial.print(" ");
}
Serial.println();
// Descriptografar a mensagem (invertendo as operações)
iv_copy = iv; // Resetando o IV para o valor inicial antes da descriptografia
for (int i = 0; i < sizeof(message) - 1; i++) { // Subtrai 1 para evitar o terminador nulo
unsigned char iv_byte = (iv_copy >> (8 * (i % 4))) & 0xFF; // Extrai um byte do IV
message[i] = message[i] ^ iv_byte; // XOR com o byte do IV
message[i] = circularShift(message[i], 8 - (i % 8)); // Desfazer o shift circular
message[i] = message[i] ^ key[i % 32]; // XOR com a chave
iv_copy = (iv_copy << 1) | (iv_copy >> 31); // Shift circular no IV para a próxima iteração
}
Serial.print("Texto descriptografado: ");
Serial.println((char*)message);
}
void loop() {}