Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/338.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 当纯文本字符计数>;16_Python_C#_Encryption_Cryptography - Fatal编程技术网

Python 当纯文本字符计数>;16

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') 必须

我想将c#代码转换为python,如下问题所示:

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

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

首先,行

AES_KEY = bytearray(bbb, 'utf-8') 
必须在Python代码中删除,才能派生与C#代码中相同的键

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

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
)。因此,第一次复制操作的最后一个字节被覆盖。这真的应该是这样吗?