Шифрование кода с помощью 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() {}

, 👍1

Обсуждение

К сожалению, у меня нет времени написать полный ответ, но похоже, что вы пытаетесь “расшифровать” (незашифрованный) открытый текст, а не зашифрованный. Вход Расшифровать должен быть выходом Зашифровать., @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


1 ответ


Лучший ответ:

2

Есть некоторые проблемы с вашим кодом.

Как уже упоминалось в моем комментарии, 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 

В своем вопросе вы упоминаете, что сгенерированный зашифрованный текст не соответствует ожиданиям. Я не могу вам в этом помочь, так как не могу воспроизвести его.

,