現在、Python で書かれたネットワーク デバイス プロトコル ライブラリを再実装しようとしています。そのコンテキストでは、暗号化された文字列と暗号化された文字列を処理する必要があります。これで、暗号化は正常に機能します。Pythonコードと同じ結果が得られ、デバイスも通信してくれます。
さて、私は現在、同じ文字列を復号化すると長さが異なることに驚き、混乱しています。
私は2つのサンプルを書きました:
#!/usr/bin/python
from Crypto.Cipher import AES
key = bytearray([0x09, 0x76, 0x28, 0x34, 0x3f, 0xe9, 0x9e, 0x23, 0x76, 0x5c, 0x15, 0x13, 0xac, 0xcf, 0x8b, 0x02])
iv = bytearray([0x56, 0x2e, 0x17, 0x99, 0x6d, 0x09, 0x3d, 0x28, 0xdd, 0xb3, 0xba, 0x69, 0x5a, 0x2e, 0x6f, 0x58])
enc = bytearray([0x38, 0x31, 0x40, 0x6c, 0x61, 0x43, 0xb2, 0x42, 0x85, 0xf4, 0x00, 0x10, 0x7b, 0x26, 0x13, 0x78, 0x32, 0x5a, 0xc3, 0x6a, 0x1c, 0x26, 0xbc, 0xc2, 0xde, 0x50, 0xdd, 0x38, 0x63, 0xb0, 0xc4, 0x64]);
print str(enc).encode('hex');
aes = AES.new(str(key), AES.MODE_CBC, str(iv));
payload = aes.decrypt(str(enc));
print str(payload).encode('hex');
私は結果を得る
3831406c6143b24285f400107b261378325ac36a1c26bcc2de50dd3863b0c464
0200000028a01d795f13946895860a58ccf98047000000000000000000000000
nodeJS の同等のコード
'use strict'
var crypto = require('crypto');
var key = new Array(0x09, 0x76, 0x28, 0x34, 0x3f, 0xe9, 0x9e, 0x23, 0x76, 0x5c, 0x15, 0x13, 0xac, 0xcf, 0x8b, 0x02);
var iv = new Array(0x56, 0x2e, 0x17, 0x99, 0x6d, 0x09, 0x3d, 0x28, 0xdd, 0xb3, 0xba, 0x69, 0x5a, 0x2e, 0x6f, 0x58);
var enc = new Array(0x38, 0x31, 0x40, 0x6c, 0x61, 0x43, 0xb2, 0x42, 0x85, 0xf4, 0x00, 0x10, 0x7b, 0x26, 0x13, 0x78, 0x32, 0x5a, 0xc3, 0x6a, 0x1c, 0x26, 0xbc, 0xc2, 0xde, 0x50, 0xdd, 0x38, 0x63, 0xb0, 0xc4, 0x64);
console.log(new Buffer(enc));
var aes = crypto.createDecipheriv("aes-128-cbc", new Buffer(key), new Buffer(iv));
var payload = aes.update(new Buffer(enc));
console.log(new Buffer(payload));
結果を投げる
<Buffer 38 31 40 6c 61 43 b2 42 85 f4 00 10 7b 26 13 78 32 5a c3 6a 1c 26 bc c2 de 50 dd 38 63 b0 c4 64>
<Buffer 02 00 00 00 28 a0 1d 79 5f 13 94 68 95 86 0a 58>
それで、ここで何が問題なのですか?暗号化されたデータの一部が欠落しているのはなぜですか?