2014-02-17 90 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)。