Wi-FiネットワークのSSIDを暗号化し、TIのCC3200 MCUのフラッシュメモリ上のファイルに保存するコードを記述しています。このプログラムはArduino IDEと同じIDEであるEnergiaで書かれています。ArduinoでのCBC暗号化
(hereを記載)暗号化機能は、uint8_t配列に取り、それは次のようになります。ここでは
void AES128_CBC_encrypt_buffer(uint8_t* output, uint8_t* input, uint32_t length, const uint8_t* key, const uint8_t* iv);
void AES128_CBC_decrypt_buffer(uint8_t* output, uint8_t* input, uint32_t length, const uint8_t* key, const uint8_t* iv);
は、一連のイベントです:
SSID>は暗号化されるchar配列に格納されており、 enc_ssid
バッファに保存されています>既存のファイルを削除して新しいファイルを作成してファイル操作を開始>ファイルにenc_ssid
を書き込む>ファイルから読み込み後、別の文字配列に復号化します。
問題は、ファイルから読み戻されたときにシリアルモニタに奇妙な文字が表示されることです(出力もこのQの最後に表示されます)。私は間違って何をしていますか?
コード:ここで
Serial.begin(115200);
SerFlash.begin(); // Begin the file system library. This also calls WiFi.init().
uint8_t keys[] = {0x18, 0x92, 0xe5, 0xfe, 0x5e, 0x02, 0x92, 0x23, 0x23, 0x9c, 0x9a, 0xfd, 0x59, 0xaf, 0x55, 0x23};
uint8_t iv[] = {0xfe, 0x0d, 0x44, 0x18, 0xb3, 0xea, 0xc5, 0x0d, 0xfe, 0xe5, 0xa3, 0x6a, 0x25, 0x72, 0xf1, 0x71};
char ssid[] = "ABCDEFGH";
len_ssid = (sizeof(ssid)/sizeof(ssid[0]));
Serial.print("SSID length: "); Serial.println(len_ssid);
Serial.println();
uint8_t enc_ssid[len_ssid];
char dec_ssid[len_ssid];
uint8_t str_ssid[len_ssid];
// Encrypt the SSID buffer.
AES128_CBC_encrypt_buffer(enc_ssid, (uint8_t*)ssid, len_ssid, keys, iv);
for (int i=0; i<len_ssid; i++)
{
Serial.print("enc_ssid["); Serial.print(i); Serial.print("]: "); Serial.println(enc_ssid[i]);
}
Serial.println();
// Delete the old SSID file and create a new one.
SerFlash.del("/user/ssid2.txt");
Serial.print("\nDeleting /user/ssid2.txt, return code: "); Serial.println(SerFlash.lastErrorString());
Serial.flush();
// Creates a 32 byte file called ssid2.txt. Returns 0 if successful or a negative number if unsuccessful.
retVal = SerFlash.open("/user/ssid2.txt", FS_MODE_OPEN_CREATE(32, _FS_FILE_OPEN_FLAG_COMMIT));
if (retVal >= 0)
{
Serial.println("Success creating new ssid file!");
SerFlash.open("/user/ssid2.txt", FS_MODE_OPEN_WRITE);
SerFlash.write(enc_ssid, len_ssid);
SerFlash.close();
// Verify that the file has indeed been written.
SerFlash.open("/user/ssid2.txt", FS_MODE_OPEN_READ);
str_ssid[0] = '\0'; // Init str_ssid in case readBytes doesn't actually do anything (and returns 0)
size_t read_length = SerFlash.readBytes(str_ssid, len_ssid);
Serial.print("Read ");
Serial.print(read_length);
Serial.println(" bytes from /user/ssid2.txt - contents: ");
//Serial.println(str_ssid);
for (int i=0; i<len_ssid; i++)
{
Serial.print("file["); Serial.print(i); Serial.print("]: "); Serial.println(str_ssid[i], DEC);
}
SerFlash.close();
}
else
{
Serial.print("Error creating SSID2 file. Error code: "); Serial.println(SerFlash.lastErrorString());
}
// Decrypt the SSID buffer.
AES128_CBC_decrypt_buffer((uint8_t*)dec_ssid, str_ssid, len_ssid, keys, iv);
Serial.println();
for (int i=0; i<len_ssid; i++)
{
Serial.print("decrypted["); Serial.print(i); Serial.print("]: "); Serial.println(dec_ssid[i]);
}
は、私が見シリアル出力されます。表示されているとおり、decrypted
はABCDEFGH
と表示されますが、奇妙な文字が表示されます。あなたの問題は、おそらくあなたが唯一の8つのバイトを暗号化しようとしているという事実から生じる
SSID length: 9
enc_ssid[0]: 243
enc_ssid[1]: 97
enc_ssid[2]: 109
enc_ssid[3]: 34
enc_ssid[4]: 188
enc_ssid[5]: 209
enc_ssid[6]: 8
enc_ssid[7]: 136
enc_ssid[8]: 34
Deleting /user/ssid2.txt, return code: SL_FS_OK
Success creating new ssid file!
Read 9 bytes from /user/ssid2.txt - contents:
file[0]: 243
file[1]: 97
file[2]: 109
file[3]: 34
file[4]: 188
file[5]: 209
file[6]: 8
file[7]: 136
file[8]: 34
decrypted[0]: 7
decrypted[1]: A
decrypted[2]: A
decrypted[3]: ¨
decrypted[4]: Æ
decrypted[5]:
decrypted[6]: B
decrypted[7]:
decrypted[8]: É
TL:DR; 'unsigned char'を使います。問題が復号化かその表現かどうかは不明です。 –
暗号化エンコーダとデコーダを削除し、フラッシュからバッファを書き込んで読み込み、それが機能するかどうか確認してください。そうであれば、暗号化に集中します。 – T33C
@ T33C私はそれを試して、それは正常に動作します。私は問題がどこにあるのかを特定することができません。天気ヴェーンが言っているように、私は問題が解読や表現にあるかどうかはわかりません。 – hpb