Python Base64字符串比Botan Base64字符串短 我已经成功地获得了AES/RijnDael[256bit密钥/128bit块大小]对称加密工作:用PyCito加密,用Botan在C++中解密。

Python Base64字符串比Botan Base64字符串短 我已经成功地获得了AES/RijnDael[256bit密钥/128bit块大小]对称加密工作:用PyCito加密,用Botan在C++中解密。,python,base64,botan,Python,Base64,Botan,但是,当我尝试用python对加密结果进行base64编码时,得到的字符串比Botan使用base64_编码器生成的相同字符串短。例如: 植物学基础64: zjjxmJf5KPs183I/EvC+JuNbOdmbm4bWyhLsdZI8fuVUnKQAeSj0ivmKIYu7HBjM7gLgLV+xtSKcsCeQD7Gy4w== Py-3k Base64: zjjxmJf5KPs183I/EvC+JuNbOdmbm4bWyhLsdZI8fuVUnKQAeSj0ivmKIYu7HBjM 您可以看

但是,当我尝试用python对加密结果进行base64编码时,得到的字符串比Botan使用base64_编码器生成的相同字符串短。例如:

植物学基础64:

zjjxmJf5KPs183I/EvC+JuNbOdmbm4bWyhLsdZI8fuVUnKQAeSj0ivmKIYu7HBjM7gLgLV+xtSKcsCeQD7Gy4w==

Py-3k Base64:

zjjxmJf5KPs183I/EvC+JuNbOdmbm4bWyhLsdZI8fuVUnKQAeSj0ivmKIYu7HBjM

您可以看到字符串在64个字符标记之前是完全相同的。如果我试图在Botan中解密Python base64字符串,它会抱怨“输入不足”

如何使Python base64字符串被Botan接受

--编辑-- 在Python中解码Botan base64编码字符串时:

Botan Decoded:[b'\xce8\xf1\x98\x97\xf9(\xfb5\xf3r?\x12\xf0\xbe&\xe3[9\xd9\x9b\x9b\x86\xd6\xca\x12\xecu\x92<~\xe5T\x9c\xa4\x00y(\xf4\x8a\xf9\x8a!\x8b\xbb\x1c\x18\xcc\xee\x02\xe0-_\xb1\xb5"\x9c\xb0\'\x90\x0f\xb1\xb2\xe3']
Botan Encoded:[b'zjjxmJf5KPs183I/EvC+JuNbOdmbm4bWyhLsdZI8fuVUnKQAeSj0ivmKIYu7HBjM7gLgLV+xtSKcsCeQD7Gy4w==']
所以pycrypto并没有产生“足够”的输出,以致于它不能被Botan解密

--编辑3--- 代码示例:

Python:更改了敏感信息

import sys
import base64
import binascii
from Crypto.Cipher import AES

plaintext = "097807897-340284-083-08-8034-0843324890098324948"

hex_key = b'xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx'
key = binascii.unhexlify( hex_key )
hex_iv = b'xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx'
iv = binascii.unhexlify( hex_iv )

aes_enc_bytes = AES.new(key, AES.MODE_CBC, iv).encrypt( plaintext )
aes_enc = base64.encodebytes(aes_enc_bytes )

print( "Encrypted:[{}]".format( aes_enc ) )

aes_dec = AES.new(key, AES.MODE_CBC, iv).decrypt( binascii.a2b_base64( aes_enc ) )
print( "Decrypted:[{}]".format( aes_dec ) )
C++(Qt+Botan)

然后,在base64编码之前,我继续将填充添加到我的pycrypto结果中,以生成以下内容,Botan拒绝对其进行解密;(

--答复-- (系统在接下来的5小时内不允许我自动应答!)


我终于浏览了所有文档并找到了答案!需要指定模式使用的填充方法

Pipe dec_pipe(new Base64_Decoder, get_cipher("AES-256/CBC/NoPadding", key, iv, Botan::DECRYPTION));
Pipe dec_pipe(new Base64_Decoder, get_cipher("AES-256/CBC/NoPadding", key, iv, Botan::DECRYPTION));
和viola!输出与pycrypto完全匹配。仅供参考:[http://botan.randombit.net/filters.html][1]


[1] :Botan Docs:Cipher Filters

Base64可以在末尾添加填充(请参阅)

显然,Botans解码器不支持这一点


也许binascii模块可以帮助您;或者您可以自己添加/删除填充。

我终于浏览了所有文档并找到了答案

需要指定模式使用的填充方法

Pipe dec_pipe(new Base64_Decoder, get_cipher("AES-256/CBC/NoPadding", key, iv, Botan::DECRYPTION));
Pipe dec_pipe(new Base64_Decoder, get_cipher("AES-256/CBC/NoPadding", key, iv, Botan::DECRYPTION));

瞧!输出与pycrypto完全匹配。这是参考。

您使用的是base64。b64encode?解码然后重新编码botan字符串。它使用python为我提供准确的字符串。Dikei,您在那里找到了一些东西。我也处理了字符串并得到了相同的结果。但这意味着pycrypto的加密结果不一样与Botan一样:我将编辑以进一步展示示例@j13r:我使用了base64和binascii模块,变化很小,也没有显著的成功。第二个示例中的输入比第一个示例短。这也是我最初的想法,但结果字符串中的“附加”数据[7gLgLV+xtSKcsCeQD7Gy4w=]通过binascii.b2a_base64解码为“N2dMZ0xWK3h0U0tjc0NlUUQ3R3k0dz09\n”,这对我理解其含义或起源没有任何帮助。
zjjxmJf5KPs183I/EvC+JuNbOdmbm4bWyhLsdZI8fuVUnKQAeSj0ivmKIYu7HBjMEBAQEBAQEBAQ\nEBAQEBAQEA==
Pipe dec_pipe(new Base64_Decoder, get_cipher("AES-256/CBC/NoPadding", key, iv, Botan::DECRYPTION));
Pipe dec_pipe(new Base64_Decoder, get_cipher("AES-256/CBC/NoPadding", key, iv, Botan::DECRYPTION));