c++无法对二进制数据进行base64解码-仅部分结果
c++ Unable to base64 decode binary data - Only Partial result
我有一块c++代码没有按预期运行,我不知道的原因
我有两个用base64编码的加密密钥(都是512字节长)。
第一个密钥解码成功并且能够被解密。第二密钥只解码大约一半,因此是无效的,但解码器返回512作为解码长度
main.cpp:
#include <openssl/bio.h>
#include <openssl/evp.h>
int base64Decode(const char *encoded_bytes, unsigned char **decoded_bytes)
{
BIO *b64, *bioMem;
size_t buffer_length, decoded_length;
bioMem = BIO_new_mem_buf((void *)encoded_bytes, -1);
b64 = BIO_new(BIO_f_base64());
BIO_set_flags(b64, BIO_FLAGS_BASE64_NO_NL);
bioMem = BIO_push(b64, bioMem);
buffer_length = BIO_get_mem_data(bioMem, NULL);
*decoded_bytes = (unsigned char*)malloc(buffer_length);
decoded_length = BIO_read(bioMem, *decoded_bytes, buffer_length);
// Here to see what is actually getting decoded
printf("%sn", *decoded_bytes);
BIO_free_all(bioMem);
return decoded_length;
}
int main(){
unsigned char *binaryBuffer = (unsigned char*)malloc(512);
// Test if "YOYO!" gets correctly decoded (Which it seems to)
printf("Length is: %dnn", base64Decode("WU9ZTyEA", &binaryBuffer));
// Key #1 - Decodes successfully - 512 returned
printf("Length is: %dnn", base64Decode("va+Kr/EHdeIwdgzymP40nnyIoFqpb6Y0sWAgrpz8B1DQx+9flmJyDF7ZeaQSnIBRdB17alzf5HmNga9kmAWLJvAeBSBexTrZvPSuA0Ug4cvI+hPAtPecWjm4s1s+3NmWuWI3Wv2trkv/uQNz2WzFaXPz4wT4gcl+zEYf1wie5VO2hzF0xSgmSR+AnF1gx6C4ncAKBnnm9K/sQ8Ldf+SyE5OJM9znczVRZRB6s+3zG3UPC17Atnyvh2pBxRCPoRrV4DDP+DcaijIr+KbCgp1G56r2faT9d0nfbAKarnNAhBXOH4QODW/hhirHSj2OKqtYSNmOJXja3R9d625EZcfcH/pU6bXB+RvupLG9Kkj1WF4bD8v5+RdqsRxlJVEE0I9o2VRG+kIOqDg8FLe2lDoefCXnpLgXh15j9xTh7zHXTAq0diTskfneo5KehwoveY7/TrxOXg3VOazj3TaiLmB1YDfZwPD2MwfQ9VyP5uAd2NB8qcXDSDVJcD7QPeF8hcPFu7wX5GsNXNOFdIFnzaaKfdiT5uz2m3QnORTFTloi2IM2ItYRsm2GErD6cyJTf1qnSPJo8r5lx6A1UKDvyF8kwWoC3UnzWA6djzi3fi9QGVO6agytUDNX8IiHpxU2V6EK0CRl3tRpogMhSNyr2F78IazNECStTt5MO0AyOMpkQt0=", &binaryBuffer));
// Key #2 - Only decodes about half, yet returns 512
printf("Length is: %dnn", base64Decode("U4tR8mRzyrqpNhhFjkbEe4I6LTYXhL7PxkbddNTQ1yZ6ofZ4s1R/UOQsq6x+CNxB+yddPirwT0yPgtm6IC1qYF9GGQsOqXHkpTrmXf0GiXDVpm91EMnyxtMu74B3OMIYgxmjoeua7HoKQkW6/GRuCpgWIoZQq7uOaKIsc3k9HGgfAFk6vTGER1YJlG28lOhsiGccl0EqD0uhrBGNhFERfAzB2gaJjI1oRO87Q2NbevKHeZycpyXgazvtw9JigA+Hp3+Cy9LUIRvF6k5uv0DKxOs5cynqYslb1LfKqT0IvLjBl4gNHl+pG5/Ur70XzZTiO1+n5jWITPoslZ4slVkl4qiTaqNWHgLT6aSUhWwPlvK+7wlk+st5ykAuSIE2e3Lia+omBRH2LQfG1v7KaOJApF3k4D0li/4QWOJ3zLwBDHB6WCwMQfNS8vTRWM1yIO/o9417wJEpBlcr/B308vGheoTF9+qRKGDe0M5PNHeBbEHhgNkLsKvcS/31HK6Xd36cg85yvyLghQRr9Gyn7TUU5m6f6iSlx3u+yo1vT7BBV6OjbxPklwCIYCZWIIOJq10JXC+bSGPbTKZYXjQW90URKesUOMi9s+DS7BKVEr471AnEyazividrgivfHDNWQisIcOctpDFCfEBAa28PYjIj4KJo5bDkSluRVcVDJVrP2Ns=", &binaryBuffer));
}
我知道这两个64编码的字符串都是有效的,因为当我将它们管道传输到base64-d命令时,它们会完整地吐出加密的密钥(如果我在ruby中使用base64.decode64()也是一样的)
编制单位:
g++ -o main.o -c main.cpp
g++ -o test main.o -lcrypto
干杯
通过将键打印为以零结尾的字符串来进行验证。这可能适用于第一个键,因为它没有嵌入的零字符,但第二个键在位置0x81(129,意味着第130个字符)处嵌入了零字符,因此将提前终止输出。
请注意,您的代码也在泄漏内存!
相关文章:
- 无法解码base64+deflate数据
- 正在解码MSVC 32位版本的程序集(作业).没有手术做什么
- 编译时 Base64 解码 C++
- 为什么我的从base64解码的函数不起作用?
- 解码 c++ 中以 base64 编码的大量数据
- 是否有函数可以将 base64 字符串解码为张量流 c++ 中的张量
- 解码并保存 base64 C++中的图像文件
- 为什么这个base64解码/编码功能不能正常工作?
- CryptoPP vs PHP Base64 编码/解码
- 使用Boost解码base64字符串
- Windows API base64编码/解码
- 将 base64 解码字符串转换为无符号字符[32]
- 将解码的 Base64 字节字符串转换为布尔向量
- OpenSSL base64解码-BIO_read返回0
- Base64解码错误
- 尝试解码不在base64字符集中的值
- 谷歌协议缓冲区-对编码解码base64 char * c字符串协议缓冲区数据感到困惑
- cryptopp-base64编码/解码后的值不相同
- 解码base64时GtkTextView中出现UTF-8错误
- c++无法对二进制数据进行base64解码-仅部分结果