1

メッセージの暗号化に相当する「初期化ベクトル」の初期化に関して問題があります。JSON経由でDjangoサーバーにデータを送信するESP32(マイクロコントローラー)があります。ESP32 では Arduino IDE を使用しているため、ESP32 のコードは C/C++ で記述されています。Django はもちろん Python を使用しています。

両側で次のように IV を初期化すると、暗号化はこれまでのところ機能します。

ESP32:

unsigned char iv[16] = {'0','0','0','0','0','0','0','0','0','0','0','0','0','0','0','0'};

ジャンゴ:

iv = b'0000000000000000'

ESP32 のライブラリには、unsigned char 配列を想定する暗号化関数があります。配列が null で終了していない (最後に '\0') ことに注意する必要があります。そうしないと、異なる結果が得られます。それが背景情報です。あなたが必要です。今、私の特定の問題に:

暗号化でカウンター モードを使用したい。両側の IV の最後の 4 バイトに整数カウンターをコピーしたい:

ESP32 では、次のことを行います。

int msg_counter = 15 //15 just as an example
memcpy(iv+12, &msg_counter, sizeof(msg_counter));

Django では次のことを行います。

counter = (int) 15;
iv = counter.to_bytes(16, byteorder = 'big')

変数「iv」を出力すると、Django で次のようになります。

b'\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x0f'

復号化は失敗します。サーバー上の ESP32 から元のメッセージを取得できません。

上記のように IV を初期化しないと、常に異なる結果が得られます。

Django での暗号化/復号化に PyCryptoDome を使用しています。このコード行に IV を渡します: obj = AES.new(enckey, AES.MODE_CFB, iv, segment_size = 128) IV は、この b'0000000000000000' のような形式で渡す必要があります。したがって、サーバー側で他の選択肢はありません。

ESP32 でこれを行う場合:

memset(iv,0,16);

b'0000000000000000'

Django では異なる結果が得られます。何をすればいいのかわからない。

何か案は?

4

2 に答える 2