AES Java 到 Python

AES Java to Python

这是我从 Java 来源获得的 AES 加密代码。这让我很烦恼,因为 Cipher 本身在它的初始化中不使用任何初始向量 - 因此我似乎无法在 Python 中使用同样的东西。有 Java 背景的任何人都可以帮助我理解这实际上是做什么的吗?

byte key[] = {0x13, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x06, 0x00, 0x00, 0x00, (byte) 0xB4, 0x00, 0x00, 0x00, 0x1B, 0x00, 0x00, 0x00, 0x0F, 0x00, 0x00, 0x00, 0x33, 0x00, 0x00, 0x00, 0x52, 0x00, 0x00, 0x00};
SecretKeySpec skeySpec = new SecretKeySpec(key, "AES");
Cipher cipher = Cipher.getInstance("AES");
cipher.init(Cipher.ENCRYPT_MODE, skeySpec);
byte[] myIv = {70, 114, 122, 82, 70, 114, 122, 82, 70, 114, 122, 82, 70, 114, 122, 82}
byte[] newIv = cipher.doFinal(myIv);

Java 有实施某些方案的提供者。一个方案是从一个字符串中选择的,在你的例子中是Cipher.getInstance("AES")。由于在 Java 中 运行 普通 AES 是不可能的,因此它选择了一些默认值以使其成为一个完整的方案。

有必要确定操作模式和可选的填充模式。 Java 中的大多数提供商在看到 "AES".

时默认为 "AES/ECB/PKCS5Padding"

现在 byte[] newIv = cipher.doFinal(myIv)。此行在 ECB 模式下使用 AES 加密明文 (myIv) 并应用 PKCS#7 填充。 ECB 模式不使用 IV,所以这是错误的变量命名,因为 myIv 不是用于加密的 IV。

This 是一个 post,展示了如何进行填充和取消填充。

代码使用 "AES" 作为算法字符串,(实际上)解析为 "AES/ECB/PKCS5Padding"。看来您可以使用 PyCrypto 在 python 中使用 AES.MODE_ECB,因此复制它应该没有问题。不过,您可能必须自己实施 PKCS#7 padding/unpadding(或使用 one of the many examples on the internet)。您不需要任何 IV,因为 ECB 不使用 IV。

我不知道为什么使用静态密钥以及为什么要加密静态 IV(使用填充)。这只能由代码的作者来澄清。它当然不遵循最佳实践。