背景:我目前希望使某些诊断软件可以与其他软件互操作,但该软件中发生的所有通信均使用 AES-128-CBC 进行加密。下面包含一个示例请求。二进制文件也链接到底部,供那些希望检查它的人使用。
{
"api-version": "1.0",
"mac-model": 69,
"action": 1,
"timestamp": 1517862344000,
"service-location": false,
"ksess": "X+syUFRBrn9ytyg0qDaG/+W7wN6MiuHyJzNuLj/y/vbjpeDJoZjAP65xTWiSLrgJJMCgAyoKc8Ss3oUjq1gRYeTz8oEjjUmU2ym+f6pwoVsrVJ+EtQ/WDnhENjdAjE2vNOuiD1v/ncSk/gk1AUiZwK8tpPPEytSv0R9XlVtVpg8KlK1SF66Vl2hRjovko9uqIxs98iymZ42iWkff39DQoclbngKTbLItUeXUbzwBI6thXkNiTYDmdm3SZUJrK6TS7ZoOxH/4eEJXDprf9pImEg7r0PmE4pPXSXSmuLVPAwHjWp0riVIVw0DGgQ4cfABmCh/oFxxl/Q5rzkvsKQuKeg==",
"hmac": "89FA90002E4FA47C83FAEF1AC378B51D5A1CD2DB",
"data": "MtN0XjxexXRb9GNh3pSJNW0jxvLZm45alwSbJ40fVXowOnKQpaD7Yc3exBCvmw1z//a+iQtOdpBV/NdHe78hj8oxQJ+4iBDsM6tv6PEB2OeNFJnKuQ5R0azq527npjMAuPWvZszotJkB7FBiF3YjbK6QPCBDURybanqUCJrO3Yao6+Qfa4P41VFbZab0FhoJ",
"data2": "xgffrf24+Poxd6iS+r7nC5KDD6s="
}
我已经弄清楚了 AES 密钥是如何生成的,并且已经能够解密加密数据,除了第一个块,它显然在加密过程中使用了 IV。IV是根据时间戳生成的,我在下面包含了反汇编函数的图片:
据我所知,该函数基本上是这样做的(目标 C):
double timestamp = 1517862344;
double t1 = timestamp * 1000.0;
uint64_t t2 = (uint64_t)timestamp;
NSData *data = [NSData dataWithBytes:&t2 length:16];
NSLog(@"%@", data);
其中记录的数据是给定整数的十六进制字符串。如果我解密 base64 编码数据,这一事实得到进一步支持
elUxn0rJeP3/6rnm9XnTmzJIok0VUOrE6lceAWZsLXiz1tX9i+KhfWcfdq12FW3gbfSpjNu+glVhBA+0rM5RnB4QzWp1CRrQKs1YQ/B/H4F8i7/BBhlUVD1bGNDJdW0Uf4E7RzyBVcFAaLv1pjY+XEMcx2ED6bdNvUZfC5LKI+Qk2bsQiheOLpAGLIhWUQ8E
使用密钥(十六进制)7286276c0adb764ff1926bde8a12cbe6和 IV 4055a56761010000000054557a167642(上述 Obj C 代码的输出,如(128 AES CBC w/ PKCS7 解密后的数据)
{"requesË4¶ÆðÎtem-serial-number":"C02S213LG8WQ","system-environment":"EFI","diagnostic-version":"1.1.15","netboot-image":"EFI"}}
正确的输出是:
{"request":{"system-serial-number":"C02S213LG8WQ","system-environment":"EFI","diagnostic-version":"1.1.15","netboot-image":"EFI"}}
因此,我的问题是,鉴于唯一传输的数据是样本请求中存在的数据,并且第一个块的解密部分成功,我在生成使一个人能够正确执行的 IV 方面误解了什么解密第一个块的最后一部分?第二个问题,如果有人知道答案,为什么即使 IV 不完全正确,第一个块也能成功部分解密?

