2012-03-23 215 views
4

我需要在PC和支持使用SHA1進行RSA加密和簽名的設備之間建立安全通信。因爲我已經在我的應用程序的其他部分使用了Crypto ++,所以我想爲此使用Crypto ++。RAW RSA使用Crypto ++加密和解密

該設備是非常原始的,但允許執行我寫的程序。它內置了原始的RSA和SHAa功能;但是,它的內存很少,2K字節要精確。

我必須加密並簽名來自PC的消息。然後設備解密並驗證消息。設備將回復一條加密的消息並在其上簽名。 PC將解密消息並在之後進行驗證。我已經使用內置函數在設備內部使用SHA1實現了原始RSA加密,簽名和驗證。這些消息足夠短,可以在一輪中完成。

但是,我不知道如何在不涉及OAEP或PKCS#1的情況下使用Crypto ++以原始RSA加密消息。有人能夠給我看一些示例代碼嗎?萬分感謝!

回答

2

我不知道如何使用加密加密與原RSA消息++沒有 涉及OAEP或PKCS#1。有人能夠給我看一些示例代碼嗎?

當你知道去哪裏看看就很容易:Raw RSA來自Crypto ++ wiki。下面的代碼是從頁面中提取的。


加密

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加密和解密時寫的演示函數。我只是爲了理解基礎而寫的。我希望它能幫助:

#include <cryptopp/files.h> 
#include <cryptopp/modes.h> 
#include <cryptopp/osrng.h> 
#include <cryptopp/rsa.h> 
#include <cryptopp/sha.h> 

void rsa_examples() 
{ 
    // Keys created here may be used by OpenSSL. 
    // 
    // openssl pkcs8 -in key.der -inform DER -out key.pem -nocrypt 
    // openssl rsa -in key.pem -check 

    CryptoPP::AutoSeededRandomPool rng; 

    // Create a private RSA key and write it to a file using DER. 
    CryptoPP::RSAES_OAEP_SHA_Decryptor priv(rng, 4096); 
    CryptoPP::TransparentFilter privFile(new CryptoPP::FileSink("rsakey.der")); 
    priv.DEREncode(privFile); 
    privFile.MessageEnd(); 

    // Create a private RSA key and write it to a string using DER (also write to a file to check it with OpenSSL). 
    std::string the_key; 
    CryptoPP::RSAES_OAEP_SHA_Decryptor pri(rng, 2048); 
    CryptoPP::TransparentFilter privSink(new CryptoPP::StringSink(the_key)); 
    pri.DEREncode(privSink); 
    privSink.MessageEnd(); 

    std::ofstream file ("key.der", std::ios::out | std::ios::binary); 
    file.write(the_key.data(), the_key.size()); 
    file.close(); 

    // Example Encryption & Decryption 
    CryptoPP::InvertibleRSAFunction params; 
    params.GenerateRandomWithKeySize(rng, 1536); 

    std::string plain = "RSA Encryption", cipher, decrypted_data; 

    CryptoPP::RSA::PrivateKey privateKey(params); 
    CryptoPP::RSA::PublicKey publicKey(params); 

    CryptoPP::RSAES_OAEP_SHA_Encryptor e(publicKey); 
    CryptoPP::StringSource(plain, true, new CryptoPP::PK_EncryptorFilter(rng, e, new CryptoPP::StringSink(cipher))); 

    CryptoPP::RSAES_OAEP_SHA_Decryptor d(privateKey); 
    CryptoPP::StringSource(cipher, true, new CryptoPP::PK_DecryptorFilter(rng, d, new CryptoPP::StringSink(decrypted_keydata))); 

    assert(plain == decrypted_data); 
} 
+0

感謝您的代碼。我瞭解你的代碼。但是,我的情況有點不同。 – crackpot 2012-03-23 03:16:48

+0

該代碼進行RSA加密和解密。如果這不是你想要的,我只會刪除它。 – 01100110 2012-03-23 03:23:57

+0

對不起,評論是用返回鍵發佈的,但我只是想插入一行。 我已經進一步闡述了我在這個問題上的處境。 我真的很感謝你的幫助。^_^ – crackpot 2012-03-23 03:43:59