Шифрование кода с помощью AES.ESP32
Я пытаюсь это понять. Почему мои шифрование и дешифрование неверны?
Используемая библиотека для AES:
https://github.com/DanielVukelich/Arduino-AES
Это для тестирования шифрования и дешифрования. //https://www.hanewin.net/encrypt/aes/aes-test.htm
#include "Rij_Consts.h"
#include "Rijndael.h"
void setup() {
Serial.begin(115200);
//mbedtls_aes_context aes;
unsigned char iv[16] = {0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00};
//char * key = "abcdefghijklmnop";
//const unsigned char key[16];
const unsigned char key[16] = {0xE8,0xE9,0xEA,0xEB,0xED,0xEE,0xEF,0xF0,0xF2,0xF3,0xF4,0xF5,0xF7,0xF8,0xF9,0xFA};
//unsigned char key[16] = {0xFA,0xF9,0xF8,0xF7,0xF5,0xF4,0xF3,0xF2,0xF0,0xEF,0xEE,0xED,0xEB,0xEA,0xE9,0xE8};//กลับ
//char *input = "Tech tutorials x";
const unsigned char input[16] ={0x01,0x4B,0xAF,0x22,0x78,0xA6,0x9D,0x33,0x1D,0x51,0x80,0x10,0x36,0x43,0xE9,0x9A};
//unsigned char input[16] ={0x9A,0xE9,0x43,0x36,0x10,0x80,0x51,0x1D,0x33,0x9D,0xA6,0x78,0x22,0xAF,0x4B,0x01};//กลับ
unsigned char output[16]; //6743C3D1519AB4F2CD9A78AB09A511BD ต้องได้ตามนี้
printf("Testing ECB mode:\n");
printf("Original Plaintext:\n");
for(int i = 0; i < 16; i++){
printf("%2.2X ", input[i]);
}
unsigned char keys[176];//for 128
Schedule_Keys(AES_128, key, 16, keys);
printf("\n\nKEYs:\n");
for(int i = 0; i < 16; i++){
printf("%2.2X ", keys[i]);
}
Encrypt(AES_128, input, 16, keys, output);
printf("\n\nCiphertext:\n");
for(int i = 0; i < 16; i++){
char str[16];
sprintf(str, "%2.2X ", output[i]);
Serial.print(str);
}
Decrypt(AES_128, input, 16, keys, output);
printf("\n\nCiphertext:\n");
for(int i = 0; i < 16; i++){
char str[16];
sprintf(str, "%2.2X ", output[i]);
Serial.print(str);
}
}
void loop() {}
Мой выход :
Вы можете видеть, что мое шифрование и дешифрование неверны.
Я попытался восстановить полный код.
#include "Rij_Consts.h"
#include "Rijndael.h"
//https://www.hanewin.net/encrypt/aes/aes-test.htm สำหรับเทสเทียบ
void setup() {
Serial.begin(115200);
unsigned char iv[16] = {0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00};
const unsigned char key[16] = {0xE8,0xE9,0xEA,0xEB,0xED,0xEE,0xEF,0xF0,0xF2,0xF3,0xF4,0xF5,0xF7,0xF8,0xF9,0xFA};
const unsigned char plainText[16] ={0x01,0x4B,0xAF,0x22,0x78,0xA6,0x9D,0x33,0x1D,0x51,0x80,0x10,0x36,0x43,0xE9,0x9A};
unsigned char cipherText[16]; //6743C3D1519AB4F2CD9A78AB09A511BD Answer
printf("Testing ECB mode:\n");
printf("Original Plaintext:\n");
for(int i = 0; i < 16; i++){
Serial.printf("%2.2X ", plainText[i]);
}
unsigned char keys[176];//for 128
Schedule_Keys(AES_128, key, 16, keys);
printf("\n\nKEYs:\n");
for(int i = 0; i < 16; i++){
Serial.printf("%2.2X ", keys[i]);
}
Encrypt(AES_128, plainText, 16, keys,cipherText );
Serial.printf("\n\nCiphertext:\n");
for (int i = 0; i < 16; i++) {
Serial.printf("%2.2X ", cipherText[i]);
}
unsigned char decryptedText[16];
Decrypt(AES_128,cipherText , 16, keys, decryptedText);
Serial.printf("\n\ndecryptedText:\n");
for (int i = 0; i < 16; i++) {
Serial.printf("%2.2X ", decryptedText[i]);
}
}
void loop() {}
@Siripaiboon Flame Janpetch, 👍1
Обсуждение1 ответ
Лучший ответ:
Есть некоторые проблемы с вашим кодом.
Как уже упоминалось в моем комментарии, Decrypt ()
ожидает зашифрованный текст в качестве входных данных и генерирует расшифрованный текст в качестве выходных данных. Однако в своем коде вы используете обычный текст (который вы смущенно назвали "input") в качестве входных данных. Правильным вводом должен быть ваш зашифрованный текст (который является выводом функции Encrypt ()
и который вы назвали "output"). Пожалуйста, ознакомьтесь с документацией библиотеки AES.
Я предлагаю следующие изменения в вашем коде, чтобы заставить его работать:
Замените часть вашего кода, следующую за Decrypt (...)
до конца setup ()
, следующим кодом:
unsigned char decryptedText[16];
Decrypt(AES_128, output, 16, keys, decryptedText);
Serial.printf("\n\ndecryptedText:\n");
for (int i = 0; i < 16; i++) {
Serial.printf("%2.2X ", decryptedText[i]);
}
Я бы также предложил вам назвать свои переменные, чтобы избежать путаницы, например, вы можете заменить input[]
открытым текстом[]
и output[]
зашифрованным текстом []
. Некоторые из ваших шестнадцатеричных выходных кодов также излишне сложны и могут потребовать некоторой реструктуризации.
Я скомпилировал и запустил вышеуказанные изменения с вашим кодом на ESP32, и он производит ожидаемый зашифрованный текст и правильно расшифровывает его. Он выдает следующий вывод:
00:21:01.583 -> Testing ECB mode:
00:21:01.583 -> Original Plaintext:
00:21:01.630 -> 01 4B AF 22 78 A6 9D 33 1D 51 80 10 36 43 E9 9A
00:21:01.630 ->
00:21:01.630 -> KEYs:
00:21:01.630 -> E8 E9 EA EB ED EE EF F0 F2 F3 F4 F5 F7 F8 F9 FA
00:21:01.630 ->
00:21:01.630 -> Ciphertext:
00:21:01.630 -> 67 43 C3 D1 51 9A B4 F2 CD 9A 78 AB 09 A5 11 BD
00:21:01.630 ->
00:21:01.630 -> decryptedText:
00:21:01.630 -> 01 4B AF 22 78 A6 9D 33 1D 51 80 10 36 43 E9 9A
В своем вопросе вы упоминаете, что сгенерированный зашифрованный текст не соответствует ожиданиям. Я не могу вам в этом помочь, так как не могу воспроизвести его.
- esp32, platformio A fatal error occurred: Packet content transfer stopped (received 8 bytes) *** [upload] Error 2
- Как выбрать альтернативные контакты I2C на ESP32?
- Драйверы для чипа последовательного порта CH9102X
- Как преобразовать форматированный оператор print в строковую переменную?
- ESP32 - "Детектор Браунаута был активирован" при запуске Wi-Fi
- Питание esp32cam от аккумулятора
- Контакты RX и TX на esp32
- ESP32: отключить детектор отключения питания
К сожалению, у меня нет времени написать полный ответ, но похоже, что вы пытаетесь “расшифровать” (незашифрованный) открытый текст, а не зашифрованный. Вход
Расшифровать
должен быть выходомЗашифровать
., @StarCatНе могли бы вы, пожалуйста, объяснить немного больше о шифровании и дешифровании? Я немного сбит с толку. Но спасибо за комментарий, @Siripaiboon Flame Janpetch
Сначала я хочу правильно зашифровать код. но я не знаю, что делать. Я продолжаю упускать и ошибаться. Мое шифрование неверно, что делает мое дешифрование тоже неправильным :<<<., @Siripaiboon Flame Janpetch
Это в основном проблема кодирования, а не специфичная для Arduino. Однако смотрите мой ответ., @StarCat
Не могли бы вы отправить мне полный код ответа на мой Gmail? Я хочу сравнить со своим, что я сделал не так. [email protected], @Siripaiboon Flame Janpetch
С моим ответом вы должны быть в состоянии восстановить полный код., @StarCat
Я на улице, но еще не вернулся домой. И ценю вас за то, что вы мне помогли. Ты только что вошел в сцепление., @Siripaiboon Flame Janpetch
Сегодня я попытался восстановить код. но мой шифр все равно неверен. Неужели я действительно что-то пропустил в своем новом коде? Я действительно изменился, как вы сказали о вводе, выходе. Мой новый код в почте., @Siripaiboon Flame Janpetch
Ваш восстановленный код, опубликованный в вашем вопросе, работает точно так же, как и на ESP32, а также на ESP8266. Кажется, вы переименовали *"Rijndael_Consts.h"* в *"Rij_Consts.h"*, так что мне пришлось это исправить, но это не могло вызвать вашу проблему. В моем случае получился правильный Зашифрованный текст и расшифрованный текст. Как вы установили библиотеку?, @StarCat
Хм, интересно. Я не устанавливал его сам. Я получил эту библиотеку как WIN.RAR от моего друга. Я попробую установить его снова. Я дам тебе знать. После того, как я установлю новую библиотеку., @Siripaiboon Flame Janpetch
У меня есть вопрос. Почему мое шифрование/дешифрование не соответствует веб-сайту, который мы используем для сравнения ? Даже я использую тот же AES128-ECB :< https://www.hanewin.net/encrypt/aes/aes-test.htm, @Siripaiboon Flame Janpetch
- Не знаю. Вы можете попробовать повторно загрузить и переустановить библиотеку с Github., @StarCat
Наконец-то я могу правильно зашифровать код. Спасибо за совет. Я попробовал переустановить из библиотеки. Это действительно сработало., @Siripaiboon Flame Janpetch
Я попытался загрузить библиотеку с Github, но там не хватает файла. Не могли бы вы дать другую ссылку?, @Yathrib Elsiddig
@YathribElsiddig Есть Rjindael.c, Rjindael.h, Rjindael_Consts. в библиотеке нет ни одного файла. но вы должны сначала внимательно прочитать «README», прежде чем использовать его библиотеку в своем проекте, и я боюсь, что у меня нет этой ссылки. Это было как 2 года назад, @Siripaiboon Flame Janpetch
Может быть, вы попытаетесь повторно загрузить его, как я. Раньше у меня была проблема с загрузкой библиотеки. вы можете увидеть мой пост там., @Siripaiboon Flame Janpetch