当纯文本字符计数>16时,C#到Python密码文本不同

2024-04-24 23:24:20 发布

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

我想把一个c#代码转换成python,比如这个问题:Python to C# AES CBC PKCS7

当纯文本的字符计数<;16,我给出了这两个代码相同的结果。(24个字符)

但当纯文本的字符计数>;=16,C#代码返回44个字符的结果,python返回24个字符的结果。这是相同的字符,但缺少python。 例如:c#结果是jfgdohpE8zrgls3Mpi8B+t/nGbzK1iEA3l1rJ0G8sFU=, python的结果是 jfgdohpE8zrgls3Mpi8B+g== 为什么?(我使用Python3和PKCS7库进行填充)


Tags: to代码文本ltgt字符python3aes
1条回答
网友
1楼 · 发布于 2024-04-24 23:24:20

首先,这条线

AES_KEY = bytearray(bbb, 'utf-8') 

必须在Python代码中删除,才能派生与C#代码中相同的键

然后可以重现您描述的问题:C#code返回,例如,对于base64编码的IVJ223ULe3Xf6PX1KfNVmEiw==,以及您发布的明文和密钥,返回以下密文:

O5EBcIB987RNfZ41RbvRThmlEyP2RxkDCuGWQiajkDY=

Python代码生成此密文时:

O5EBcIB987RNfZ41RbvRTg==

原因是pypkcs7issue #1)中的一个已知错误使得该包实际上无法使用,因为填充通常不再符合PKCS7定义(特别是如果填充前的明文长度是块大小的整数倍(AES为16字节))

因此,您需要一个不同的PKCS7实现。幸运的是,PyCryptodome提供了一个padding module(在遗留PyCrypto中不可用)。有以下变化

#from pkcs7 import PKCS7Encoder
from Crypto.Util.Padding import pad
...
#encoder = PKCS7Encoder()
#padded_text = encoder.encode(secret_text)    
padded_text = pad(secret_text.encode('utf8'), 16).decode('utf8')  

C#代码生成的密文与C#代码生成的密文相同(顺便说一句,解码实际上可以省略,因为加密过程会再次对密文进行编码;我保留这一点只是为了与旧实现进行比较)

作为旁注,使用以下方法可以更容易地导出密钥:

hash = hashlib.sha256(bbb.encode('utf8')).digest() 
AES_KEY = hash[:15] + hash[:16] + b"\0"

相关问题 更多 >