c++无法对二进制数据进行base64解码-仅部分结果

c++ Unable to base64 decode binary data - Only Partial result

本文关键字:解码 base64 仅部 结果 二进制 数据 c++      更新时间:2023-10-16

我有一块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个字符)处嵌入了零字符,因此将提前终止输出。

请注意,您的代码也在泄漏内存!