用软件分发RSA公钥的最简单方法是什么?
本文关键字:最简单 方法 是什么 公钥 软件 RSA | 更新日期: 2023-09-27 18:13:49
我正在开发一些与服务器交换XML文档的软件。服务器使用XMLDSIG对XML进行签名,客户机应该在信任XML之前验证签名。我用RSACryptoServiceProvider
来做这个。XML是签名的,但没有加密。
我遵循下面解释的基本程序:
如何使用数字签名对XML文档进行签名
如何验证XML文档的数字签名
这要求客户端软件具有可用的公钥。我希望客户端软件的分发尽可能简单,我不希望客户端必须处理证书。上面引用的这对文档很方便地绕过了分发公钥的主题,只是简单地指出用户"需要拥有相同的密钥"。我并不特别希望最终用户知道他们有一个公钥,所以让他们乱搞证书是不可能的。由于公钥是公开的,我想做的是以某种方式将其嵌入到客户端软件中。在我看来,我的选项是:
- 在安装过程中安装公钥
- 以某种方式将公钥嵌入软件本身,可能在App.config文件中
这在实践中可行吗?在不需要任何用户交互或意识的情况下,实现这一目标的最简单方法是什么?
您不必分发证书。一种常用的方法是将证书包含在签名的文档中,在KeyInfo/X509Data
节点中。
验证可以很容易地使用嵌入的证书,客户端唯一需要的基础设施元素是证书指纹和主题名称。换句话说,客户机使用包含的证书验证文档,然后轻松地根据主题名称和指纹检查证书。如果匹配,则假定提供了正确的证书。
在我的博客文章中阅读更多技术细节(这是一个由3部分组成的教程,所以你也可以看看所有其他的文章)。无论如何,不要导入证书,也不要在您的软件中包含证书,而是使用两个字符串配置参数。
XmlDsigned文档中的嵌入式证书具有const大小,通常开销可以忽略不计。
http://www.wiktorzychla.com/2012/12/interoperable-xml-digital-signatures-c.html http://www.wiktorzychla.com/2012/12/interoperable-xml-digital-signatures-c_20.html我不知道你在没有看到你的代码的情况下面临什么问题,但是,这个来自Ji Zhou的答案可以帮助吗?
public static void Main()
{
try
{ //initialze the byte arrays to the public key information.
byte[] PublicKey = {214,46,220,83,160,73,40,39,201,155,19,202,3,11,191,178,56,
74,90,36,248,103,18,144,170,163,145,87,54,61,34,220,222,
207,137,149,173,14,92,120,206,222,158,28,40,24,30,16,175,
108,128,35,230,118,40,121,113,125,216,130,11,24,90,48,194,
240,105,44,76,34,57,249,228,125,80,38,9,136,29,117,207,139,
168,181,85,137,126,10,126,242,120,247,121,8,100,12,201,171,
38,226,193,180,190,117,177,87,143,242,213,11,44,180,113,93,
106,99,179,68,175,211,164,116,64,148,226,254,172,147};
//Values to store encrypted symmetric keys.
byte[] EncryptedSymmetricKey;
byte[] EncryptedSymmetricIV;
//Create a new instance of RSACryptoServiceProvider.
RSACryptoServiceProvider RSA = new RSACryptoServiceProvider();
//Get an instance of RSAParameters from ExportParameters function.
RSAParameters RSAKeyInfo = RSA.ExportParameters(false);
//Set RSAKeyInfo to the public key values.
RSAKeyInfo.Modulus = PublicKey;
//Import key parameters into RSA.
RSA.ImportParameters(RSAKeyInfo);
//Create a new instance of the RijndaelManaged class.
RijndaelManaged RM = new RijndaelManaged();
//Encrypt the symmetric key and IV.
EncryptedSymmetricKey = RSA.Encrypt(RM.Key, false);
EncryptedSymmetricIV = RSA.Encrypt(RM.IV, false);
Console.WriteLine("RijndaelManaged Key and IV have been encrypted with RSACryptoServiceProvider.");
}
catch (CryptographicException e)
{
Console.WriteLine(e.Message);
}
}