Python 当纯文本字符计数>;16
我想将c#代码转换为python,如下问题所示: 当纯文本的字符数<16时,我给出这两个代码相同的结果。(24个字符) 但当纯文本的字符数>=16时,C#代码返回的结果有44个字符,python返回的结果有24个字符。这是相同的字符,但缺少python。 例如:c#结果是Python 当纯文本字符计数>;16,python,c#,encryption,cryptography,Python,C#,Encryption,Cryptography,我想将c#代码转换为python,如下问题所示: 当纯文本的字符数=16时,C#代码返回的结果有44个字符,python返回的结果有24个字符。这是相同的字符,但缺少python。 例如:c#结果是jfgdohpE8zrgls3Mpi8B+t/ngbzk1ea3l1rj0g8sfu=, python的结果是 jfgdohpE8zrgls3Mpi8B+g== 为什么?(我使用Python3和PKCS7库进行填充)首先,行 AES_KEY = bytearray(bbb, 'utf-8') 必须
jfgdohpE8zrgls3Mpi8B+t/ngbzk1ea3l1rj0g8sfu=
,
python的结果是
jfgdohpE8zrgls3Mpi8B+g==
为什么?(我使用Python3和PKCS7库进行填充)首先,行
AES_KEY = bytearray(bbb, 'utf-8')
必须在Python代码中删除,才能派生与C#代码中相同的键
然后可以重现您描述的问题:C代码返回,例如,对于base64编码的IVJ223ULe3Xf6PX1KfNVmEiw=
,以及您发布的明文和密钥,返回以下密文:
O5EBcIB987RNfZ41RbvRThmlEyP2RxkDCuGWQiajkDY=
Python代码生成此密文时:
O5EBcIB987RNfZ41RbvRTg==
原因是pypkcs7()中的一个已知错误使得该包实际上无法使用,因为填充通常不再符合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#代码生成的密文与C#代码生成的密文相同(顺便说一句,解码实际上可以省略,因为加密过程会再次对密文进行编码;我保留这一点只是为了与旧实现进行比较)
作为旁注,使用以下方法可以更容易地导出密钥:
hash = hashlib.sha256(bbb.encode('utf8')).digest()
AES_KEY = hash[:15] + hash[:16] + b"\0"
这两个代码都没有编译/运行。Python代码缺少
PKCS7Encoder
的定义。两种代码都缺少完整的样本来重现问题(没有明文和密钥的密文没有多大帮助)。请发封邮件。你现在能看一下吗?我做了一些编辑@Topaco C代码仍然无法编译(array
未定义)。当前您使用的是一个32字节的键,值为0(array\u bbb
)<代码>数组_bbb_2根本不使用。不知道要实现什么。在第一次复制操作中,将字节0-15(array\u bbb\u 2
)复制到0-15(array\u bbb
)。在第二次复制操作中,将0-15(array_bbb_2
)复制到15-30(array_bbb
)。因此,第一次复制操作的最后一个字节被覆盖。这真的应该是这样吗?