2014-02-17 89 views
2

我需要一個運行在我的Linux服務器上的C++程序,通過RSA加密消息與我的C#應用​​程序進行通信。 C#的部分很容易通過RSACryptoServiceProvider但它僅支持XML格式的按鍵,例如:C++ RSA使用XML密鑰加密/解密

私鑰

<RSAKeyValue> 
    <Modulus>jhU5nGfGNopA6bHb6nxqTj3/AvPsyZnep6BTSMFyCZLtP4VRu9a/xFaYH6M6SBSf8Aod8Ljjz5aWtet9DPujC1tdG2AmDpkn/6TiUShYbYFNueB25IJoGmNfZdJl3XEWQS0pdrq0wqwgFG4GE3l8gMV6Y/gEnqBx/HZmZOv4JlbkTaQX6KIB8Sxc1zqiAQDV1uTHORG9d6Rh/Rrrv+XntGbKfx75cqU2Q6Ie+o7QoXBSkiRUgb7VlP3NlwBW9VQ03rENpovHhwLvqHbOlV90HPbl0d/JUqmBPTRLe+P+iCLPt76WE1k2Nb9mQzs8fbJ+jrfXtSqSUieeG9B+uz7pxw==</Modulus> 
    <Exponent>EQ==</Exponent> 
    <P>qP5inK0zFPNqViqpu1dTIrvtD2Ep29YKlnDdnYEwlRjf0VCn/IMfC4lMggOvqmh7FifwJ+GYo+9PLY6pDo5+EAjE1Lna1GRFyrd3smO9scUbAf0Zq2eqhsJjbVBdBQFX2LnARBhpVvevF7wrMpvCYhC6KmhzGrjfmhadDSSfmnU=</P> 
    <Q>1zv1p5pWfN3208zp7lIDJPmLa5tO+LEMUsKg4qPFjUif2uI1++HWFCjT6OS9PS48FXv2xdWA/P3jOTw7DSK7SJX5HVBl6T6QV87jkqUtyYFxLAAVxRpGGDy6f+lVs+NyTjmQ7s2zk+Qm7DzGiUoe6BeMU0jXr/KZ4WmvOiy908s=</Q> 
    <DP>T4bE/m+fkWN9Vbm5SRoJAUlgf7VA3+xBN7ykhlrpr5M8JkQS0S6lMpr208V/17iyZMeAEsSEEOkWM45trH9KYeYCRf0brz4+9fv8F7Z3YrcbxLNXX7hQP2qJJGINqAChz2Z4mIP1Vho0R2eb25SXta2EyKmflBrDk85oBi9aKpE=</DP> 
    <DQ>S/cLaFSW/uTttCo0cjsQKyrl6b5YG4nIHTWiMd9y5pIaTUDHwk+0+A5o6Mkzuz1+nivAgg8ed2iqjKvYmzlvRsuFGWerf39+PRvX2Wd5kmnrtS003CdkCI3neHB4mdfN/X26rqL0FhRJ+QZkMHSDYPlAld15TShyi8ryjQC7d+0=</DQ> 
    <InverseQ>d7/VKPzww1KBb0Q6AR8xJrQrbUi1ayVrhB1UQC3K/T1o5xGaEUpkTM+DmPDYi4WMQxhDaalu8II0y1tHMsmZsFy05+VLg8c8BSE9Qn0qOgLxBBYHYqh96kGQqglV1n8s76EHxNZ0aMgpEmipoenqyYgMInCGp5rmmaFeU8hxqsM=</InverseQ> 
    <D>GRLN7myqghhlzuMmzwbllVY8D5R1FISQtCtZ/cfI1INXCzWlAwfHfQA49oY3diHB3xDYG2vr93Tta2XKxg5J8vIBXy8VxldDSzs2/0Na5iXgijarkbyo9ZkQ1bu3n4xtVsu8BeS2fLT2mjGImgZhQ+adILNMG/4yO5xsbCmkQwACmf5Shdci2G8nGGjCadLNyamzGcChk9y69mbl0Awx4XQUZ888a9PHv1Mfxvbs48ZSKgrV54aQ0lESJAT7Zl8XzwzIoxxNCiYGFRPrGMkr6ZpcrRAPrFzcoYt6C65XlUvhjBNNvLBJiFZco7KeOOiu5ObTplSqww+rwRdVEq9SCQ==</D> 
</RSAKeyValue> 

公鑰

<RSAKeyValue> 
    <Modulus>jhU5nGfGNopA6bHb6nxqTj3/AvPsyZnep6BTSMFyCZLtP4VRu9a/xFaYH6M6SBSf8Aod8Ljjz5aWtet9DPujC1tdG2AmDpkn/6TiUShYbYFNueB25IJoGmNfZdJl3XEWQS0pdrq0wqwgFG4GE3l8gMV6Y/gEnqBx/HZmZOv4JlbkTaQX6KIB8Sxc1zqiAQDV1uTHORG9d6Rh/Rrrv+XntGbKfx75cqU2Q6Ie+o7QoXBSkiRUgb7VlP3NlwBW9VQ03rENpovHhwLvqHbOlV90HPbl0d/JUqmBPTRLe+P+iCLPt76WE1k2Nb9mQzs8fbJ+jrfXtSqSUieeG9B+uz7pxw==</Modulus> 
    <Exponent>EQ==</Exponent> 
</RSAKeyValue> 

因此我需要一個C++ (gcc)RSA加密庫,支持這些密鑰並在Linux上運行。我發現one library,但它似乎使用了一個非常特殊的標準,其中密鑰長度是以數字而不是位來衡量的,它的唯一區別是指數,而C#標準的指數是兩個密鑰中的相同值。

任何人都知道我可以使用的圖書館嗎?

+0

FWIW,用於私鑰的格式通常不重要,因爲只有該應用程序纔會使用它。公鑰是其他人通常用來發送加密郵件的所有人。私人鑰匙應該保持......私密。 –

+0

這對x-late來說看起來並不難。 XML令牌是補救措施,內容看起來不過是實際位的bas64。任何合理的XML DOM應該能夠讀取這些,加密庫的base64解碼器(或者你自己的或第三方)應該能夠解碼base64,並且從那裏它只是在你的lib的正確位置加載權利blob。所以你正在尋找一些已經爲你做的事情?我發現很難(但並非不可能,知道MS)相信.NET不能導出到PEM,在這種情況下,任何加密庫都會在本地進行。 – WhozCraig

+0

crypto ++是我以前用過的很好的庫。 http://www.cryptopp.com/ –

回答

1

RSA是一種標準化算法。也就是說,實際上您擁有PKCS#1 v1.5中定義的RSA,並且定義了用於加密的RSA OAEP。所以你需要同步一個庫使用的確切的RSA算法。一些庫也支持「原始」RSA,即:只有模冪指數部分,但這是不安全的。請注意,對於RSA,結果被定義爲八位字符串(又名字節數組),這使得它可以互操作。

您指出的圖書館似乎是託管在Google代碼上的單人項目。這看起來沒有什麼希望,我會堅持使用像OpenSSL,CryptoPP或Botan這樣的圖書館,這些圖書館在該領域已經存活了一段時間,並且擁有一個活躍的社區。

您可以簡單地從XML中提取數字並將它們用於任何庫。你並不是完全需要所有的參數,只需提供Modulus,ExponentD的值應該足夠了。請注意,上面的Exponent只是公開的指數,D是私人指數。公共指數通常包含在RSA私鑰中(實際上可以用於加密庫的內部驗證)。注意不同的圖書館可能會使用不同的符號。

請注意,不是直接依賴RSA,也可以使用容器格式,如CMS(aka PKCS#7)。