AES Java到Python

2024-10-05 10:06:47 发布

您现在位置:Python中文网/ 问答频道 /正文

这是一个AES加密代码,我从Java源代码中获得。这让我很恼火,因为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);

Tags: key代码new源代码javabyte向量aes
2条回答

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是一篇文章,展示如何进行填充和取消添加。在

代码使用"AES"作为算法字符串,它(实际上)解析为"AES/ECB/PKCS5Padding"。似乎可以使用PyCrypto在python中使用AES.MODE_ECB,因此复制它应该没有问题。不过,您可能需要实现PKCS#7填充/取消添加自己(或使用one of the many examples on the internet)。你不需要任何静脉注射,因为欧洲央行不使用静脉注射

我不知道为什么要使用静态密钥,为什么要加密静态IV(使用填充)。只有代码的作者才能解释清楚。它当然不遵循最佳实践。在

相关问题 更多 >

    热门问题