blueoothモジュールで暗号化されたテストデータの一部を解読しようとしています。 BluetoothのファームウェアはC言語でプログラムされています。Java/Android - 4バイトのMICでAES/CCMを解読する
暗号化されたデータました:
// Test Bytes - 16 bytes
byte[] testInput = {0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07,
0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f};
// Test key - 16 bytes, 128-bit
byte[] keyBytes = {0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07,
0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f};
// Test nonce - 13 bytes, 104-bit
byte[] nonce = {0x00,0x01,0x02,0x03,0x04,0x05,0x06,0x07,0x08,0x09,
0x0a,0x0b,0x0c};
ここで問題があります。 AES/CCMを使用してCのデータを暗号化すると、4バイトのMICを持つ16バイトの出力が生成されます。 JavaでAES/CCM/NoPaddingを使用してデータを暗号化すると、出力も16バイトになりますが、8バイトのMACがあります。 MACとMICという用語はあいまいですが、MICがBluetoothの用語に使用されているようです。
上記のtestInputをJavaで暗号化すると、Cプログラミングの暗号化と同じ16バイトの出力が得られます。しかし、MICとMACの長さが異なるため、どちらの側でもデータを復号化できません。
解決方法はありますか?
私は私のJavaコードを追加しました:
以下Cipher cipher = Cipher.getInstance("AES/CCM/NoPadding", "BC");
SecretKeySpec secretKeySpec = new SecretKeySpec(keyBytes, "AES");
IvParameterSpec ivParameterSpec = new IvParameterSpec(nonce);
cipher.init(Cipher.ENCRYPT_MODE, secretKeySpec, ivParameterSpec);
byte[] encrypted = cipher.doFinal(testInput);
// The first 16 bytes print out equivalently with the C-language AES/CCM
は私の出力の画像です:
以下はC出力のイメージです。
BLE広告パケット
ブルートゥースの場合、MICは3つの追加バイト、つまり0x00,0x01、およびPDUヘッダーの最初のバイトから計算されるバイトで計算されます。このバイトがなければ、同じMICを得ることはできません。 –
@JamesKPolkどのようにデータを渡すことをお勧めしますか?私は数日間の解決策を探してきました。あなたが私をさらに助けてくれればとっても感謝しています。 – FoxDonut
まず、MICの生成方法を把握しなければなりません。 –