首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Python Base64字符串比Botan Base64字符串短

Python Base64字符串比Botan Base64字符串短
EN

Stack Overflow用户
提问于 2012-04-04 09:35:42
回答 2查看 1.5K关注 0票数 0

我成功地获得了AES/Rijndael 256位密钥/128位块大小的对称加密工作:用pycrypto加密,在C++中用Botan解密。

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

Botan Base64:

zjjxmJf5KPs183I/EvC+JuNbOdmbm4bWyhLsdZI8fuVUnKQAeSj0ivmKIYu7HBjM7gLgLV+xtSKcsCeQD7Gy4w==

Py-3k Base64:

zjjxmJf5KPs183I/EvC+JuNbOdmbm4bWyhLsdZI8fuVUnKQAeSj0ivmKIYu7HBjM

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

如何使Botan接受Python字符串?

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

代码语言:javascript
复制
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的结果:

代码语言:javascript
复制
Encryption result: 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'

Base64 encoded: b'zjjxmJf5KPs183I/EvC+JuNbOdmbm4bWyhLsdZI8fuVUnKQAeSj0ivmKIYu7HBjM

Python似乎在“遗漏”一些东西。但是什么呢?

-编辑2 --

当我尝试base64decode &解密pycrypto结果时,Botan抛出如下内容:

代码语言:javascript
复制
Botan exception caught: Buffered_Operation::final - not enough input

因此,pycrypto无法产生“足够”的输出,无法被Botan解密。

-编辑3-代码示例:

Python:更改了敏感信息。

代码语言:javascript
复制
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)

代码语言:javascript
复制
void botanDecryptor::decrypt()
{
    Botan::SymmetricKey key( private_key );
    Botan::InitializationVector iv( iv_value );
    try
    {
        // Now decrypt...
        Botan::Pipe dec_pipe(new Base64_Decoder, get_cipher("AES-256/CBC", key, iv, Botan::DECRYPTION));

        dec_pipe.process_msg( ciphertext );

        string decrypted = dec_pipe.read_all_as_string();

        cout << "Decrypted:[" << decrypted << "]" << endl;
    }
    catch(Botan::Exception& e)
    {
        cout << "Botan exception caught: " << e.what() << endl;
        return;
    }

-编辑4 --

我决定尝试解密python中加密的base64编码字符串,但它增加了一堆看起来像是填充的内容:

代码语言:javascript
复制
Decrypted:[b'097807897-340284-083-08-8034-0843324890098324948\x10\x10\x10\x10\x10\x10\x10\x10\x10\x10\x10\x10\x10\x10\x10\x10']

然后,我在base64编码之前将这个填充添加到我的pycrypto结果中,生成以下内容,Botan拒绝解密;

代码语言:javascript
复制
zjjxmJf5KPs183I/EvC+JuNbOdmbm4bWyhLsdZI8fuVUnKQAeSj0ivmKIYu7HBjMEBAQEBAQEBAQ\nEBAQEBAQEA==

-回答-- (系统不允许我再回答5个小时!)

我终于翻阅了所有的文档,找到了答案!需要指定用于模式的填充方法。我指定了NoPadding。

代码语言:javascript
复制
Pipe dec_pipe(new Base64_Decoder, get_cipher("AES-256/CBC/NoPadding", key, iv, Botan::DECRYPTION));

还有中提琴!输出与pycrypto完全匹配。参考: http://botan.randombit.net/filters.html

1: Botan文档:密码过滤器

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2012-04-18 10:01:55

我终于翻阅了所有的文档,找到了答案!

需要指定用于模式的填充方法。我指定了NoPadding。

代码语言:javascript
复制
Pipe dec_pipe(new Base64_Decoder, get_cipher("AES-256/CBC/NoPadding", key, iv, Botan::DECRYPTION));

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

票数 0
EN

Stack Overflow用户

发布于 2012-04-04 09:40:19

Base64可以在末尾有一个填充(参见填充)

显然Botans解码器不支持这个。

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

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/10008537

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档