繁体   English   中英

我怎么了? Botan & QT & SHELL 解密

[英]What do I wrong? Botan & QT & SHELL decrypting

首先我创建我的唱歌键:(Shell/Debian 9)

>openssl genrsa -out ./priv.rsa 2048

>openssl pkcs8 -topk8 -inform PEM -outform PEM -in ./priv.rsa -out priv.pem

>openssl rsa -in ./priv.pem -pubout -out pub.pem

然后我用(Shell)创建我的 encrypt.txt

> echo "ęśłżół">encrypt.txt

并使用我的公共 Rsa 密钥(Shell)对其进行加密

> openssl rsautl -encrypt -inkey ./pub.pem -pubin -in ./encrypt.txt -out
> ./encrypt.dat

..然后是带有QT(5.9.1)的Botan(昨天下载):

...

使用命名空间 Botan;

使用 std::string;

QFile file,file2;

// Reading private key
file.setFileName(".../priv.pem");
file.open(QIODevice::ReadOnly);
QByteArray f = file.readAll();
file.close();

//reading encrypted file
file2.setFileName("...../encrypt.dat");
file2.open(QIODevice::ReadOnly);
QByteArray f2 = file2.readAll();
file2.close();
 enter code here
std::vector<uint8_t> ct;
for(QByteArray::Iterator it = f2.begin();it!=f2.end();it++)
{
    ct.push_back((uint8_t)(*it));
}

string password=ui->lineEdit_2->text().toStdString().c_str();
std::unique_ptr<Botan::RandomNumberGenerator> rng(new Botan::AutoSeeded_RNG);

DataSource_Memory keyData2( f.toStdString().c_str() );

std::unique_ptr<Private_Key> kp = PKCS8::load_key(keyData2,pass);
PK_Decryptor_EME dec(*kp,*rng.get(), "Raw");       
secure_vector<uint8_t> ct4=dec.decrypt(ct);

QByteArray aaa;

for(secure_vector<uint8_t>::iterator it=ct4.begin();it!=ct4.end();it++)
{
    aaa+=(uint8_t)(*it);
}

QFile fileX(".../encryptE.txt");
fileX.open(QIODevice::WriteOnly);
fileX.write(aaa);
fileX.close();

...我的输出文件包含(并且是 255 字节宽):

^B4 x ^V & 赭绹 *S ^T 㓠K 7 J CF^U^B^[ ^Q =^H + 7Y^^^U ^^O\\ v bdK^N^Ev^QI= ) ) n^KПV Y -23^^ 5] ^ ^P4 ^L p i t^D ^Z J^K ^G^Z^\\ 4\\^D^Z^Ew^Tx S i 5 ^D A Ƨ o zÚ # ^L ^G Ŋ^FXIu ^@ęśłżół

我的问题: 1. ...我看到我的字符串:ęśłżół ....但我有什么错? - 解码文件不是原始文件?

  1. 我只允许使用 RAW 类型(对于此文件:encrpted.dat):

    PK_Decryptor_EME dec(*kp,*rng.get(), "Raw");

如果我选择:PKCS1v15” || “EME-PKCS1-v1_5” “OAEP” || “EME-OAEP” || “EME1” || “EME1(SHA-1)” || “EME1(SHA-256)”

我变成了错误:

在抛出'Botan::Decoding_Error' what() 实例后调用终止:参数无效解码错误:公钥密文无效,无法解密

OpenSSL 默认使用安全性较低的PKCS#1 v1.5 填充。 要使用相同的取消填充,您可能应该在 Botan 中使用"PKCS1v15"

请注意,PKCS#1 v1.5 容易受到 Bleichenbacher(填充预言机)攻击,因此应谨慎使用 PKCS#1 v1.5 填充(即不要在可以充当填充预言机的自动化系统中)。

建议使用 OAEP。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM