Я пытаюсь объединить вывод шифрования AES-256 в строку (чтобы сравнить эту строку с зашифрованной строкой, отправленной с телефона Android).
По сути, конкатенация работает, но после нескольких запусков возникают ошибки (нечитаемые символы, строка становится короче, а не длиннее) или происходит сбой. Воспроизводимый, вылетает в той же точке после перезапуска.
Я извлек несколько строк кода Arduino, которые демонстрируют проблему. Это делает следующее:
- Создать случайное число и записать его в массив (работает)
- AES- кодировать этот массив (работает)
- Построить HEX-представление каждого индекса массива (работает)
- Конкатенация индексов со строкой (сбой)
#include <SPI.h>
#include "aes256.h" //include this lib
uint8_t key[] = {9,2,3,4,5,6,7,8,1,2,3,4,5,6,7,8,
1,2,3,4,5,6,7,8,1,2,3,4,5,6,7,8 }; //the encryption key
aes256_context ctxt; //context needed for aes library
void setup() {
Serial.begin(9600);
}
void loop() {
uint8_t data[] = {
0x53, 0x73, 0x64, 0x66, 0x61, 0x73, 0x64, 0x66,
0x61, 0x73, 0x64, 0x66, 0x61, 0x73, 0x64, 0x65, }; //the message to be encoded
long InitialRandom = random(2147483647); //0 to highest possible long
String RandomString = "" ;
RandomString+=InitialRandom; //random number to String
Serial.println(RandomString); //for debugging
//update data array: Random String into data array
for (int x=0; x<RandomString.length(); x++){
data[x] = RandomString[x];
}
//this encrypts data array, which changes
aes256_init(&ctxt, key); //initialize the lib
aes256_encrypt_ecb(&ctxt, data); //do the encryption
aes256_done(&ctxt);
//Here the problem starts.............................................
String encrypted=""; //the string I need finally
for (int x=0; x<sizeof(data); x++){ //data array is 16 in size
int a = data[x];
String b = String (a, HEX);
if(b.length()==1) b="0"+b; //if result is e.g "a" it should be "0a"
encrypted.concat(b); //this line causes the problem!!!
//Serial.println(b); //works perfect if above line commented out
Serial.println(encrypted); //see the string geting longer until problems occur
}
//Here the problem ends.............................................
Serial.println(); //go for next round, until crashing
}
Я искал форумы, пробовал разные способы объединения (+ оператор, strcat). У всех были похожие эффекты. Я читал, что в библиотеке String была ошибка, обновил Arduino IDE до 1.0.
Это занимало меня несколько дней, любая помощь очень ценится,
Большое спасибо!