c++ - 我做错了什么?牡丹&QT&SHELL解密

标签 c++ qt encryption cryptography botan

首先我创建了我的歌键: (外壳/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

然后我用 (外壳)

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

然后用我的 Rsa 公钥加密 (外壳)

> 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();

...我的 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��8�@^C�^S����o��0����S[x� ��2 �^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)”

我变成了错误:

terminate called after throwing an instance of 'Botan::Decoding_Error' what(): Invalid argument Decoding error: Invalid public key ciphertext, cannot decrypt

最佳答案

OpenSSL 默认使用不太安全 PKCS#1 v1.5 填充。要使用相同的去填充,您应该在 Botan 中使用 "PKCS1v15"

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

推荐使用 OAEP。

关于c++ - 我做错了什么?牡丹&QT&SHELL解密,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46764715/

相关文章:

ssl - DSC - 客户端错误 - 无法获取私钥

C# 无法生成初始化向量 IV

c++ - 声明一个具有 C 调用约定但具有内部链接的 C++ 函数

c++ - 比较 Fortran 和 C++ 汇编程序的 int = floor(sqrt(...))

qt - QML 中的字典

c++ - 哪些 Windows 编译器支持 <future> 类

java - 调号在 Python 中有效,但在 Java 中不行吗?

c++ - "std::string const &s"和 "const std::string &s"有什么区别?

c++ - 为什么我们不能从浮点最大值中减去?

c++ - 如何更改 MDI 子窗口图标?