无法使用私钥解密base64解码的字符串

时间:2014-02-19 06:47:20

标签: c++ openssl base64 rsa

我有一个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();

1 个答案:

答案 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是如何做到的。所有工具(`encryptdecryptx509smime等)都有相应的源文件,它们位于<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;
}
...