我有一个base64字符串的加密字符串并使用BIO_f_base64()我解码并使用ofstream(c ++代码)写入文件(decoding.txt)。
用于解密我使用下面的命令(终端)
openssl rsautl -decrypt -inkey private.key -in decoded.txt -out plaintext.txt
这会抛出错误" RSA_EAY_PRIVATE_DECRYPT数据大于mod"。
但是当我使用
通过终端解码base64字符串时echo "base64 string" | base64 --decode >> terminal_decode.txt
并运行
openssl rsautl -decrypt -inkey private.key -in terminal_decode.txt -out plaintext.txt
工作正常。我比较了decode.txt和terminal_decode.txt,两者看起来都一样。
使用encoded.txt文件我无法解密字符串,请帮我解决此问题
用于解码的代码: -
char *enstr = new char[200];
strcpy(enstr,"sX3/ks3+abL5B1O/o/gSywOYv0tACnRkrMxKnBVDT7yhnatfE5ox2mvQz8RyM6MSCtf2exLUz3uIQGnTnk0yqgWzaDgR2ASEXi6ap1pV+1gAPMHBdiMZeNDI86RfleIH/37p7+lW3eyYwnpKJrsHf72jUu9R+aEXZSsEDEDQ1Hw=");
int len = strlen(enstr);
char *buff = (char *)malloc(len+1);
memset(buff,0,len+1);
BIO *biomem, *bio64;
bio64 = BIO_new( BIO_f_base64() );
BIO_set_flags(bio64,BIO_FLAGS_BASE64_NO_NL);
biomem = BIO_new_mem_buf(enstr,len);
biomem = BIO_push(bio64,biomem);
BIO_read(biomem,buff,len);
buff[len]='\0';
ofstream ofs("encoded.txt",std::ios::out);
ofs.write(buff,len);
ofs.close();
答案 0 :(得分:0)
ofstream ofs(“encoded.txt”,std :: ios :: out); ofs.write(浅黄色,LEN); ofs.close();
ofstream
将摆弄位,因此您无法在内存中获得精确的表示。我相信你需要:
ofstream ofs("encoded.txt", std::ios::binary);
binary
停止新线路处理。
阅读时,我相信你需要:
ifstream ifs("encoded.txt", std::ios::binary);
ifs.unsetf(std::ios::skipws);
这会抛出错误“RSA_EAY_PRIVATE_DECRYPT数据大于mod”。
这意味着消息中的位数超过了模数中的位数。要继续,请减小消息的大小,使其小于或等于n - 1
,其中n
是模数。
使用encoded.txt文件我无法解密字符串,请帮我解决这个问题
您的解密代码在哪里?
如果您查看<openssl source>/apps/rsautil.c
,那么您将看到OpenSSL是如何做到的。所有工具(`encrypt
,decrypt
,x509
,smime
等)都有相应的源文件,它们位于<openssl source>/apps
。
这是openssl rsautil
在从命令行设置选项后所做的事情的肉和土豆。见第275行:
switch(rsa_mode) {
case RSA_VERIFY:
rsa_outlen = RSA_public_decrypt(rsa_inlen, rsa_in, rsa_out, rsa, pad);
break;
case RSA_SIGN:
rsa_outlen = RSA_private_encrypt(rsa_inlen, rsa_in, rsa_out, rsa, pad);
break;
case RSA_ENCRYPT:
rsa_outlen = RSA_public_encrypt(rsa_inlen, rsa_in, rsa_out, rsa, pad);
break;
case RSA_DECRYPT:
rsa_outlen = RSA_private_decrypt(rsa_inlen, rsa_in, rsa_out, rsa, pad);
break;
}
...