因此,我从 Orcales NetSuite 收到一个文件,该文件已通过 NetSuite 使用 AES-256-CBC 加密进行加密。 然而,在尝试使用给定的 key/iv(已验证其在 NetSuite 密钥文件中确实拥有的密钥/iv)对其进行解密时,我注意到密钥和 iv 都是 32 字节长,这是不正确的。 对于 AES-256,IV 应为 16 字节长。 我假设我可能需要解码这些字符串,所以我通过 javascript 的 Node Forge 库运行它
forge.util.decode64(iv)
但传入的值相同,32 字节。
有没有人有 NetSuite 加密经验可以告诉我到底发生了什么? 我根本找不到任何关于此的文档。
这是我从 NetSuite 获取的密钥文件的示例(显然不是实际值):
{"key":"ZC9TZW5iQzQzRGlJOG0yZ3MzQ2NHR3hjOXQwRjBxcG8=","iv":"MTI2NWMwZDU4ZTU4ODZkYjE3MjNhYjJhMzc0M2IzZjk="}
看起来 IV 实际上被编码为十六进制,然后编码为 Base64。 这导致长度加倍,因为它从 8 位字符变为 4 位十六进制字符。
将 Base64 值解码为二进制数据会产生以下结果:
0000: 31 32 36 35 63 30 64 35
0010: 38 65 35 38 38 36 64 62
0020: 31 37 32 33 61 62 32 61
0030: 33 37 34 33 62 33 66 39
观察这个足够长的时间,你最终会注意到它的熵很低,所有字节的最高位都被清除,并且它们都以 3 或 6(十六进制)开头。
如果您解码 Base64 并将数据解释为十六进制字符串,您将得到:
0000: 12 65 c0 d5 8e 58 86 db
0010: 17 23 ab 2a 37 43 b3 f9
...正好是 16 个字节长。这个
CipherPayload
的文档页面可能有答案(尽管我可能解释错误),其中写着:
注意此评论:无论
encode.Encoding.HEX
方法中的参数值如何,此属性都会在options.inputEncoding
中编码。 这个想法归功于cipher.final