2017-05-03 18 views
2

我學習的加密,並在這個過程中,我偶然發現了這個C#代碼..默認情況下,C#使用的RSA算法是什麼?Crypto ++中的參數是什麼?

//Encrypts a string with RSA public key 
public static string EncryptTextRSA(string text, int keySize, string publicKeyXml) 
{ 
    var encrypted = RSAEncrypt(Encoding.UTF8.GetBytes(text), keySize, publicKeyXml); 
    return Convert.ToBase64String(encrypted); 
} 

//Rsa encryption algorithm 
public static byte[] RSAEncrypt(byte[] data, int keySize, string publicKeyXml) 
{ 
    using (var provider = new RSACryptoServiceProvider(keySize)) 
    { 
     provider.FromXmlString(publicKeyXml); 
     return provider.Encrypt(data, OAEP); 
    } 
} 

獲得的信息(從PHP後端)結束這樣的:

私鑰:

<RSAKeyValue> 
    <Modulus>3+A8GT1MAdf+MzIZGbGa5GSAjtvxsIeJnsZKeIP6oiK76TiTQqr6vgYKpE+jQBdI6WMsWv2H9TYWv6NmfzMI9+RHV82V5r71vG5o0GwvfzHj3I/FzYwvM8vjXiHIO1T4kD4ky4VNTtq29sW82pJeo4N50EgiWNvnczYKoG8PUaQIoW7j7kuDhgLtWx40zTwR6kxiqJm80oJRyLgxZEkH9YSK/rsGGtKmkOSXpMIAaJoDtBExqYtiBD6v4juAHejdqgUa1xuWLvgvdJhjGEP0kU1C2sye1QYUXN2el2+XU/N3qhsS2g4wn4VBWYNOm2Heq/rDUmkPLRcrRXzYTlVmXQ==</Modulus> 
    <Exponent>AQAB</Exponent> 
    <P>8Iu+4wMdHYmpzOvujzsnOCjQxRKPZxFnw9qDG1xf2/h727kfDyr2FBCXvGNHTLuRzwbc++/nUmdyvEh2uhAYlTU8eB/IcTiSzDeUWye/Bq6CL6bHR3f65bIK4K0aqFyq8eDtIEzaU0y1TxXnp6Sosk6sqp28keE1C2acnIaXQpM=</P> 
    <Q>7kJRhudKzuo33N5hoTYz6rhvU++l5gdFP6RHRoGW6qBjVlxIzptUE+fYVZIvvyYQDewccKVEOb4s8etjL98lfJ85tHCxengDou9hsNh0FERM65QYN8iPXLAU39Ubca5mmkm7Hb3f3JebZAMfxe2Q2hqU9ZHFIhiiVqpmvrpqmU8=</Q> 
    <DP>tfwj6L+8UVKLQlvk2jwYieZnPBG0qHeEl6pDsnmKlHND0ZIWq3UHQ1riUUaS9LybrZM1sO1phvB433W7TT1MO+ZQ31i8Xtw8Q4BxHx3M6hMwrzhwX+On0AuJKz4LgwDI28Id5GgAbTEFotWhszVh47Sd8V7xATTu2rdBGTLCUT0=</DP> 
    <DQ>sQIiMZhKMpk9sWChpbRwM7ScOP61AMVsBBEXRuFl7qADzRg4mw45E6TOSxyVTmyHxuAgbOvLWR7Zo01eXiVpY0GkDFMg97yL7xPrPwhAjQIFJ4vZxi/BmnnSuExJ3FZWMdAPLNRwqSEVN+M+SrzpPbA79Ik8rM0iZkKonJBAO+8=</DQ> 
    <InverseQ>DClm/3Fg7j45kjUB1Cb3XKT73j+RGHmOQUzVlNAlkCocjx4qVmOuIqi2eMKUbaTgsOPXyZQ82vQvYmQBmR4/b7gncK1X8mlcrVzVwEaO3kr7BOm8OsNnvD/V9rcwqiJCzoMFYZGod3tbJjvzg02xrBN9+nMLUkyZLmaUojAk1pY=</InverseQ> 
    <D>TlfT8CkpLgP96sB/VCR4xa/95QBG5bWojS1q5h2ZWZ+6DnVD4zKeKF1I4BMWV9lOJI4V+Yl7SG4zK8Dsn1qmqsjxxmIlMOhmahhhCX6yaFp3GLofSDzkT8XrvQcpYMntady1V5tAYHXdTSIJYpuSDrp1qFN14Y6iwgiJU3dJ7xFGfbc0D6RXO3r0f/n4QIbIX2wzYc0H5AonKWvVEXY7dUZPhOca1+okEwnDtoIObCTuuuesieK3nv4ZwoJX4eDXD9bCv2jXlv5yIzjKLZvH69TN3QNH59gktRA4ZUkG9LhKhwESQ7NrxhcwKJSxPVkk4ECVcSNxINATgw94mW9AqQ==</D> 
</RSAKeyValue> 

而導致產生的C#程序產生密文:

Jmk6JpFNODhMf/8r6fa8kQfyTPiVhZg9oyyYBmh1WXJrn5D5juvzZ8xjYzFUPaGZy+wiSlSEkR69o6UcjOkSi3B3dmtmFktGb0D36/yYneNES0Agca+UHWPn8triIMw4EYDuo8auMQCGR3gGg/MiJrW+Bo2gvZCoLxkAdVgoSl1e20LB1TH6UtGOs0ioMyuwG8TJSYcJVbvZZI+aZDW2YR6nrrBqcWa6n/KlLXWfbDiRq1rkmQpiIwpDRbiHOB+rao2Q93g++MYHtM0IDGWfvnWXRgXYcptMVTvzhvcdzdFwL6taa5LDAhs2HzFEawpk7EM5MpBlg1bQjCeWImIlWw== 

我一直在嘗試在Visual Studio 2014中使用Crypto ++實現相同的功能,其問題從缺乏自動XML解析和導入預生成模數和指數的一般功能。

我的C++代碼是這樣的:

std::string base64ToHex(std::string base64String) 
{ 
    std::string decodedString, finalString; 
    CryptoPP::StringSource river(base64String, true, 
     new CryptoPP::Base64Decoder(new CryptoPP::StringSink(decodedString))); 

    CryptoPP::StringSource stream(decodedString, true, 
     new CryptoPP::HexEncoder(new CryptoPP::StringSink(finalString))); 

    finalString.erase(std::remove(finalString.begin(), finalString.end(), '\n'), finalString.end()); 

    return finalString; 
}  

std::string RSAEncryptString(std::string message, std::string modulus, std::string exponent) 
{ 
    char modulusCharred[1024]; 
    strncpy_s(modulusCharred, base64ToHex(modulus).c_str(), sizeof(modulusCharred)); 
    modulusCharred[sizeof(modulusCharred) - 1] = 0; 

    char exponentCharred[1024]; 
    strncpy_s(exponentCharred, base64ToHex(exponent).c_str(), sizeof(exponentCharred)); 
    exponentCharred[sizeof(exponentCharred) - 1] = 0; 

    Integer n(modulusCharred); 
    Integer e(exponentCharred); 

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

    Integer m, c; m = Integer((const byte *)message.data(), message.size()); c = pubKey.ApplyFunction(m); 
    std::stringstream ssr; ssr << hex << c; 

    return (ssr.str()); 
} 

生成的密碼(由C++實現,使用不同的私有密鑰):

hXM7DAe/5tymIzEsQgNGiiCnA1p/J1x7Tvu6Lhbv6ApkGwfXuDi4bXZhknLDmbTXkoMVrHKnHZE6X1+pAi9+4SxN2sVcZ/cEQx+6riBsYZrSOVqq9bzEOD8J85FIUIbWZmp8kiKBCzK7F9Ke+q5/x9aOHh29Bq7cFu// 

當試圖解密密文(與它的相應的專用密鑰,它不認識它,不像C#示例那樣)

該代碼基於Crypto ++的RAW RSA Encryption Wiki,這是什麼算法ithm在C#中默認使用,以及如何在Crypto ++中複製(使用與公用密鑰在C#中使用的算法相同的算法進行加密 - 我無法將其從後端拉回)

+0

要使C#在ASN.1/DER中寫入密鑰,請參閱[加密互操作性:密鑰](https://www.codeproject.com/Articles/25487/Cryptographic-Interoperability-Keys)。我相信.Net的後續版本有一個本地方法來編寫ASN.1/DER,但我不記得方法名稱或過程。 – jww

+0

要處理Crypto ++中的簽名,請參閱[加密互操作性:數字簽名](https://www.codeproject.com/Articles/25590/Cryptographic-Interoperability-Digital-Signatures)。 [原始RSA](https://www.cryptopp.com/wiki/Raw_RSA)是這項工作的錯誤工具。如果我記得正確,您需要使用PKCS消息格式和填充。 – jww

+0

我已經測試了這段代碼來初始化我的密鑰,它並不適用於我:我爲此創建了一個新函數:請參閱https:// stackoverflow。com/a/45939796/3205529 – Malick

回答

1

OAEP值在您的代碼示例中不可見,所以我無法在沒有條件的情況下回答。如果OAEPfalse那麼C#代碼是RSAES-PKCS1-v1_5。 CryptoPP等價物是RSAES_PKCS1v15_Encryptor/RSAES_PKCS1v15_Decryptor。

如果OAEPtrue那麼C#代碼正在做RSAES-OAEP與SHA-1作爲PRF。 CryptoPP等價物是RSAES_OAEP_SHA_Encryptor/RSAES_OAEP_SHA_Decryptor(請參閱the example)。

你的代碼似乎在做原始的RSA。原始的RSA是危險的(https://rdist.root.org/2009/10/06/why-rsa-encryption-padding-is-critical/,許多其他)。暴露它的庫主要是試圖在你遵守的一個協議上發明/指定其他一些填充方案時不會妨礙你。

.NET不公開原始RSA。

+0

你讓我保持我的理智,非常感謝你,OEAP是錯誤的 –

相關問題