2016-06-30 14 views
0

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]); 
} 

は、私が見シリアル出力されます。表示されているとおり、decryptedABCDEFGHと表示されますが、奇妙な文字が表示されます。あなたの問題は、おそらくあなたが唯一の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]: É 
+0

TL:DR; 'unsigned char'を使います。問題が復号化かその表現かどうかは不明です。 –

+0

暗号化エンコーダとデコーダを削除し、フラッシュからバッファを書き込んで読み込み、それが機能するかどうか確認してください。そうであれば、暗号化に集中します。 – T33C

+0

@ T33C私はそれを試して、それは正常に動作します。私は問題がどこにあるのかを特定することができません。天気ヴェーンが言っているように、私は問題が解読や表現にあるかどうかはわかりません。 – hpb

答えて

3

は、AES128は128ビット(16バイト)の粒度で動作し、ライブラリはあなたのためにパディングを行いません。ライブラリーを見ると、それはサポートが16Bの倍数でないデータの量を暗号化/復号化んライブラリのように見えます

NOTE: String length must be evenly divisible by 16byte (str_len % 16 == 0) 
    You should pad the end of the string with zeros if this is not the case. 

、しかし:あり、これは、ライブラリの開始時にコメントしてい出力バッファが正しく動作するためには、出力バッファが16Bの倍数でなければなりません。とにかく、AES128_CBC_encrypt_bufferのコードはBlockCopy(output, input);で始まり、ブロック全体(16バイト)をinputからoutputにコピーしようとします。 8バイトのバッファだけを渡すので、これは未定義の動作が発生し、あなたが見ているものを説明することができます。つまり、暗号化/復号化バッファの長さを16バイトにし、手動で最後の8バイトをゼロに設定します。

+0

ありがとうございます。私はそれを読んでいない。 – hpb

関連する問題