首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何使用相同的密钥对对程序集进行StrongName并对文件进行签名?

如何使用相同的密钥对对程序集进行StrongName并对文件进行签名?
EN

Stack Overflow用户
提问于 2014-08-06 08:07:52
回答 1查看 294关注 0票数 0

我希望使用公钥/私钥对程序集进行签名,并对程序集将通过USB密钥接收的一些配置设置进行签名。

其基本原理是,程序集将能够使用嵌入其中的公钥来验证其自身的完整性,并在其到达时验证设置文件。

我使用sn.exe生成密钥对文件,然后使用.snk文件对程序集进行签名。

然后,在代码中,我使用:

代码语言:javascript
复制
byte[] k = Assembly.GetExecutingAssembly().GetName().GetPublicKey();

来访问公钥。

同时,我使用sn.exe -i将密钥对存储在机器存储中。

我的服务器代码使用:

代码语言:javascript
复制
CspParameters cspp = new CspParameters();
cspp.KeyContainerName = "mykey";
cspp.Flags = CspProviderFlags.UseMachineKeyStore;
using (RSACryptoServiceProvider rsa = new RSACryptoServiceProvider(cspp))
  {
    var p = rsa.ExportParameters(true);
    rsa.ImportParameters(p);
    signature = rsa.SignData(toSign, new SHA1CryptoServiceProvider());
  }

对发送到远程客户端的文本进行签名。

问题是,在代码片段1中获得的公钥似乎与存储在容器"mykey“中并由代码片段2使用的公钥不同。

因此,当我的客户端运行VerifyData方法时,它总是返回false。

签名代码:

代码语言:javascript
复制
public static secobj sign(remobj obj)
{
  // Serialize remote object to string
  var xmlSerializer = new XmlSerializer(typeof(remobj));
  var textWriter = new StringWriter();
  var encoder = new UTF8Encoding();

  xmlSerializer.Serialize(textWriter, obj);
  var toSign = encoder.GetBytes(textWriter.ToString());

  // Sign using stored key in local keystore
  CspParameters cspp = new CspParameters();
  cspp.KeyContainerName = "mykey";
  cspp.Flags = CspProviderFlags.UseMachineKeyStore;
  secobj l = new secobj {D1 = obj.D1, D2 = obj.D2, text = obj.text};
  using (RSACryptoServiceProvider rsa = new RSACryptoServiceProvider(cspp))
  {
    var p = rsa.ExportParameters(true);
    rsa.ImportParameters(p);
    l.key = rsa.SignData(toSign, new SHA1CryptoServiceProvider());
  }

  return l;
}

验证码:

代码语言:javascript
复制
public static bool validate(secobj l)
{
  // Obtain the public key from the assembly
  byte[] k = Assembly.GetExecutingAssembly().GetName().GetPublicKey();

  // Set up rsa
  RSACryptoServiceProvider rsa = new RSACryptoServiceProvider();
  RSAParameters rsap = rsa.ExportParameters(false);

  rsap.Modulus = k;

  rsa.ImportParameters(rsap);

  // Create remote obj from secobj
  var obj = new remobj {D1 = l.D1, D2 = l.D2, text = l.text};

  // Serialize remote obj to string
  var xmlSerializer = new XmlSerializer(typeof(remobj));
  var textWriter = new StringWriter();
  var encoder = new UTF8Encoding();

  xmlSerializer.Serialize(textWriter, obj);
  var toVerify = encoder.GetBytes(textWriter.ToString());

  return rsa.VerifyData(toVerify, new SHA1CryptoServiceProvider(), l.key);

}

我非常确定本地程序集的签名存在问题(目前我在一个控制台应用程序中作为一种测试工具执行所有这些操作),或者是在我对模块化参数的赋值上存在问题。无论如何,在对程序集进行签名和验证签名文本之间出现了一些问题。

EN

回答 1

Stack Overflow用户

发布于 2015-02-22 02:40:46

有关程序集公钥结构的参考信息,请参见structure of the public key of a signed assembly

公钥中没有私钥组件,只有公钥模数和公钥指数。

使用公钥加密的示例:Sign string using given Public Key

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/25150299

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档