我错了什么? Botan& QT& SHELL解密

时间:2017-10-16 07:09:12

标签: c++ qt encryption cryptography botan

首先我创建我的歌唱键: (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

然后我停止使用我的encrypt.txt (壳牌)

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

并使用我的公共Rsa密钥加密它 (壳牌)

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

..而且比起BT(昨天下载)与QT(5.9.1):

...

使用命名空间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();

...我的Out文件包含(并且宽度为255字节):

  

^B4 x ^V &amp; ߵݹ *S ^T K 7 JCF^ U ^ B ^ [ ^Q   = ^ H + 7Y ^^^Ü^^ø\ vbdK ^ N ^ EV ^ QI =))N ^KПVY- 23 ^^ 5] ^ \լ1 ^ U9nz萘埃^ AVR8 @ ^ C ^ So0S [ X    2 ^P4 ^L p i t ^D   ^ ZJ ^ K ^ G ^ Z 2 \ 4 \ ^ d ^ Z ^ Ew的^ TXS I5 ^DAƧozÚ #^ L ^ GN ^ FXIu ^ @ęśłżół

我的问题: 1. ...我看到我的字符串:ęśłżół....但我错了什么? - decodefile不是原始的吗?

  1. 我只允许我使用RAW类型(FOR THIS FILE:encrpted.dat):
      

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

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

    我变成了错误:

      

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

1 个答案:

答案 0 :(得分:1)

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

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

建议使用OAEP。