使用Crypto ++的RAW RSA加密和解密

问题描述 投票:4回答:2

我需要在PC与支持RSA加密和SHA1签名的设备之间建立安全的通信。因为我已经在应用程序的其他部分中使用了Crypto ++,所以我也想为此使用Crypto ++。

该设备非常原始,但允许执行我在其上编写的程序。它具有内置的原始RSA和SHAa函数;但是,它的内存很少,准确地说是2K字节。

我必须加密并签名来自PC的消息。然后,设备解密并验证消息。然后,设备将回复加密的消息并在其上签名。 PC将解密该消息,然后进行验证。我已经使用内置函数在设备内部使用SHA1实现了原始RSA加密,签名和验证。消息足够短,无法在单个回合中完成。

但是,我不知道如何在不涉及OAEP或PKCS#1的情况下使用Crypto ++使用原始RSA加密消息。有人可以向我展示一些示例代码吗?多谢!

rsa crypto++
2个回答
3
投票

我不知道如何在不使用Crypto ++的情况下使用原始RSA加密消息涉及OAEP或PKCS#1。有人可以向我展示一些示例代码吗?

当您知道从哪里看时,这很容易:来自Crypto ++ Wiki的Raw RSA。以下代码摘自该页面。


加密

Integer n("0xbeaadb3d839f3b5f"), e("0x11"), d("0x21a5ae37b9959db9");

RSA::PublicKey pubKey;
pubKey.Initialize(n, e);

///////////////////////////////////////////////////////////////

Integer m, c;
string message = "secret";  

cout << "message: " << message << endl;

// Treat the message as a big endian byte array
m = Integer((const byte *)message.data(), message.size());
cout << "m: " << hex << m << endl;

// Encrypt
c = pubKey.ApplyFunction(m);
cout << "c: " << hex << c << endl;

解密

Integer n("0xbeaadb3d839f3b5f"), e("0x11"), d("0x21a5ae37b9959db9");
AutoSeededRandomPool prng;

RSA::PrivateKey privKey;
privKey.Initialize(n, e, d);

///////////////////////////////////////////////////////////////

Integer c("0x3f47c32e8e17e291"), r;
string recovered;

// Decrypt
r = privKey.CalculateInverse(prng, c);
cout << "r: " << hex << r << endl;

// Round trip the message
size_t req = r.MinEncodedSize();
recovered.resize(req);
r.Encode((byte *)recovered.data(), recovered.size());

cout << "recovered: " << recovered << endl; 

这是示例输出:

$ ./cryptopp-raw-rsa.exe
message: secret
m: 736563726574h
c: 3f47c32e8e17e291h
r: 736563726574h
recovered: secret

有一个警告:c = m ^ e mod n,因此,对原始文本大小和密文大小有一些限制。本质上,mc必须小于n。在此示例中,将字符串secret替换为now is the time for all good men to come to the aide of their country将失败,因为在转换为n时,其比Integer大。

您可以使用功能MaxPreImage()获得最大的纯文本大小,并使用MaxImage()获得最大的密文大小。


我必须加密并签名来自PC的消息。然后设备解密并验证消息。然后,设备将回复加密的消息并在上面签名。 PC将解密该消息并随后对其进行验证。

表面上看来,它将遭受重放攻击。您可能需要具有保护功能的协议。


1
投票

这是我第一次使用Crypto ++进行RSA加密和解密时编写的演示函数。我写它只是为了了解基础知识。希望对您有所帮助:

© www.soinside.com 2019 - 2024. All rights reserved.