期待どおりに動作しないc ++コードのブロックがあり、その理由を理解できません
base64でエンコードされた2つの暗号化されたキー(両方とも512バイトの長さ)があります。
最初のキーは正常にデコードされ、復号化できます。2番目のキーは約半分しかデコードしないため無効ですが、デコーダーはデコードされた長さとして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("%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コマンドにパイプすると有効であり、暗号化されたキー全体が吐き出されます(rubyでBase64.decode64()を使用する場合も同じです)
コンパイル済み:
g++ -o main.o -c main.cpp
g++ -o test main.o -lcrypto
乾杯
キーをゼロで終了する文字列として印刷することで確認します。これは最初のキーで機能する可能性があります。これは、ゼロ文字が埋め込まれていないためですが、2番目のキーの位置0x81(129、130番目の文字を意味する)にゼロ文字が埋め込まれているため、出力が早期に終了します。
コードもメモリリークしていることに注意してください!
この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。
侵害の場合は、連絡してください[email protected]
コメントを追加