2

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

使用标准::字符串;

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�&����������*S�^T�㓠K��7�J CF^U^B^[��^Q�� =^H�+ �7Y^^^U�^^O\�v�����bdK^N^Ev^QI=����)�)��n^KПV����Y�-23^^�5 ]������������\����1^U�9n�z�^A��Vr@^C����S����o��0��S[x�^��2 �^P4�^L�p��i���<em>t^D���</em> ��^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)”</p>

我变成了错误:

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

4

1 回答 1

1

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

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

建议使用 OAEP。

于 2017-10-16T10:53:42.807 回答