我设法让AES / Rijndael [256位密钥/ 128位块大小]对称加密工作:用pycrypto加密并用C ++中的Botan解密。
但是,当我尝试在python中对加密结果进行base64编码时,生成的字符串比Botan使用Base64_Encoder生成的字符串短。例如:
Botan Base64:
zjjxmJf5KPs183I / EVC + JuNbOdmbm4bWyhLsdZI8fuVUnKQAeSj0ivmKIYu7HBjM7gLgLV + xtSKcsCeQD7Gy4w ==
Py-3k Base64:
zjjxmJf5KPs183I / EVC + JuNbOdmbm4bWyhLsdZI8fuVUnKQAeSj0ivmKIYu7HBjM
在64个字符标记之前,您可以看到字符串完全相同。如果我尝试解密Botan中的Python base64字符串,它会抱怨“输入不够”。
如何让Botan接受Python base64字符串?
- 编辑 - 在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==']
因此,Python pycrypto结果:
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&amp;解密pycrypto结果,Botan抛出这个:
Botan exception caught: Buffered_Operation::final - not enough input
所以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)
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中解密Botan加密的base64编码字符串并且它有效,但它添加了一堆看似填充的内容:
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拒绝解密;(
zjjxmJf5KPs183I/EvC+JuNbOdmbm4bWyhLsdZI8fuVUnKQAeSj0ivmKIYu7HBjMEBAQEBAQEBAQ\nEBAQEBAQEA==
- 答案 - (系统不允许我自己回答另外5个小时!)
我终于完成了所有文档并找到了答案!需要指定用于模式的填充方法。我指定了NoPadding例如
Pipe dec_pipe(new Base64_Decoder, get_cipher("AES-256/CBC/NoPadding", key, iv, Botan::DECRYPTION));
和中提琴!输出完全匹配pycrypto。供参考:[http://botan.randombit.net/filters.html] [1]
[1]:Botan Docs:Cipher Filters
答案 0 :(得分:0)
Base64最后可以有一个填充(参见https://en.wikipedia.org/wiki/Base64#Decoding_Base64_with_padding)
显然Botans解码器不支持此功能。
也许binascii模块可以帮助你;或者你可以自己添加/删除填充。
答案 1 :(得分:0)
我终于完成了所有文档并找到了答案!
需要指定用于模式的填充方法。我指定了NoPadding例如
Pipe dec_pipe(new Base64_Decoder, get_cipher("AES-256/CBC/NoPadding", key, iv, Botan::DECRYPTION));
瞧,瞧!输出完全匹配pycrypto。 Here是参考。