gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-28 06:57:26 25 4
gpt4 key购买 nike

我有一段 c++ 代码没有按预期运行,我无法弄清楚原因

我有两个以 base64 编码的加密 key (均为 512 字节长)。

第一个 key 成功解码并能够被解密。第二个 key 只解码了大约一半因此是无效的,但解码器返回 512 作为解码长度

主要.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("%s\n", *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: %d\n\n", base64Decode("WU9ZTyEA", &binaryBuffer));

// Key #1 - Decodes successfully - 512 returned
printf("Length is: %d\n\n", 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: %d\n\n", 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 命令时,它们会完整地吐出加密 key (如果我在 ruby​​ 中使用 Base64.decode64() 也一样)

编译:

g++ -o main.o -c main.cpp
g++ -o test main.o -lcrypto

干杯

最佳答案

您通过将 key 打印为零终止字符串来进行验证。这可能适用于第一个键,因为它没有嵌入的零字符,但第二个键在位置 0x81(129,表示第 130 个字符)处有一个嵌入的零字符,因此将提前终止输出。

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

关于c++无法对二进制数据进行base64解码-仅部分结果,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22977476/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com