我想将c#代码转换为python,如以下问题:从Python到C# AES CBC PKCS7
当纯文本的字符计数< 16时,我给出了这两个代码的相同结果。(24字)
但是当纯文本的字符数为>= 16时,C#代码返回有44个字符的结果,python返回包含24个字符的结果。这是相同的字符,但是python缺少了。例如: c#结果是jfgdohpE8zrgls3Mpi8B+t/nGbzK1iEA3l1rJ0G8sFU=,python结果是jfgdohpE8zrgls3Mpi8B+g==,为什么?(我使用Python3和PKCS7库填充)
发布于 2020-11-25 08:53:15
首先,线
AES_KEY = bytearray(bbb, 'utf-8') 必须在Python代码中删除,才能派生与C#代码相同的密钥。
然后可以重现您描述的问题: C#代码返回例如base64编码的IV J223ULe3Xf6PX1KfNVmEiw==以及您发布的明文和密钥的以下密文:
O5EBcIB987RNfZ41RbvRThmlEyP2RxkDCuGWQiajkDY=当Python代码生成这个密文时:
O5EBcIB987RNfZ41RbvRTg==原因是pypkcs7 (问题1)中已有的一个bug使得这个包实际上无法使用,因为填充通常不再符合PKCS7定义(特别是如果填充前的明文有一个整数倍的块大小(对于AES是16个字节))。
因此,您需要一个不同的PKCS7实现。幸运的是,PyCryptodome提供了一个填充模块 (在遗留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#代码生成的(顺便说一句,解码实际上可以省略,因为加密过程再次对密文进行编码;我只在与旧实现进行比较时保留了这一点)。
作为附带说明,可以更容易地通过以下方法导出密钥:
hash = hashlib.sha256(bbb.encode('utf8')).digest()
AES_KEY = hash[:15] + hash[:16] + b"\0"https://stackoverflow.com/questions/64986155
复制相似问题