用软件分发RSA公钥的最简单方法是什么?

本文关键字:最简单 方法 是什么 公钥 软件 RSA | 更新日期: 2023-09-27 18:13:49

我正在开发一些与服务器交换XML文档的软件。服务器使用XMLDSIG对XML进行签名,客户机应该在信任XML之前验证签名。我用RSACryptoServiceProvider来做这个。XML是签名的,但没有加密。

我遵循下面解释的基本程序:
如何使用数字签名对XML文档进行签名
如何验证XML文档的数字签名

这要求客户端软件具有可用的公钥。我希望客户端软件的分发尽可能简单,我不希望客户端必须处理证书。上面引用的这对文档很方便地绕过了分发公钥的主题,只是简单地指出用户"需要拥有相同的密钥"。我并不特别希望最终用户知道他们有一个公钥,所以让他们乱搞证书是不可能的。由于公钥是公开的,我想做的是以某种方式将其嵌入到客户端软件中。在我看来,我的选项是:

  • 在安装过程中安装公钥
  • 以某种方式将公钥嵌入软件本身,可能在App.config文件中

这在实践中可行吗?在不需要任何用户交互或意识的情况下,实现这一目标的最简单方法是什么?

用软件分发RSA公钥的最简单方法是什么?

您不必分发证书。一种常用的方法是将证书包含在签名的文档中,在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);
     }
 }