首页 新闻 会员 周边 捐助

向.net高手求救:C# 实现DSA签名

1
悬赏园豆:100 [待解决问题] 浏览: 3697次

需要实现一个和java一样功能的C#函数,
java原代码如下(参考连接:http://ajava.org/course/safe/12328.html):

public static String sign(byte[] data, String privateKey) throws Exception {
  // 解密由base64编码的私钥
  byte[] keyBytes = decryptBASE64(privateKey);
  // 构造PKCS8EncodedKeySpec对象
  PKCS8EncodedKeySpec pkcs8KeySpec = new PKCS8EncodedKeySpec(keyBytes);
  // KEY_ALGORITHM 指定的加密算法
  KeyFactory keyFactory = KeyFactory.getInstance(KEY_ALGORITHM);
  // 取私钥匙对象
  PrivateKey priKey = keyFactory.generatePrivate(pkcs8KeySpec);
  // 用私钥对信息生成数字签名
  Signature signature = Signature.getInstance(SIGNATURE_ALGORITHM);
  signature.initSign(priKey);
  signature.update(data);
  return encryptBASE64(signature.sign());
}

C#的方法头如下:
public static string sign(byte[] data, string privateKey)
{
// 目的:用私钥privateKey对data进行签名,并得到签名后的字符串,和java签名的方法得到一样的结果

//C# 实现DSA签名 得到一个签名后的字符串

DSACryptoServiceProvider dsa = new DSACryptoServiceProvider();
}

Steven Sun的主页 Steven Sun | 初学一级 | 园豆:100
提问于:2011-09-14 09:15
< > 人人可用的开源BI工具
分享
所有回答(2)
0
artwl | 园豆:16736 (专家六级) | 2011-09-14 10:49

msdn我看了,还是不知道如何使用已知的私钥。

感谢楼上这位兄弟的关注

支持(0) 反对(0) Steven Sun | 园豆:100 (初学一级) | 2011-09-14 12:38
0
privatestaticBoolean isValid(String xiString,String xiSig)AsnKeyParser keyParser =newAsnKeyParser("path/to/key.public");  DSAParameters publicKey = keyParser.ParseDSAPublicKey();  DSACryptoServiceProvider DSA =newDSACryptoServiceProvider();  DSA.ImportParameters(publicKey);  DSASignatureDeformatterDSADeformatter=newDSASignatureDeformatter(DSA);  UTF8Encoding UTF8 =new UTF8Encoding();  byte[] plainBytes = UTF8.GetBytes(xiString);        var sha1 =new SHA1Managed();  var hash = sha1.ComputeHash(plainBytes);  byte[] asn1SigBytes =Convert.FromBase64String(xiSig);  byte[] sigBytes =ConvertToP1363Signature(asn1SigBytes);  Boolean retVal =DSADeformatter.VerifySignature(hash, sigBytes);  return retVal;}


privatestaticbyte[]ConvertToP1363Signature(byte[] ASN1Sig){  AsnParser asn =newAsnParser(ASN1Sig);  asn.NextSequence();  byte[] r = asn.NextInteger();  byte[] s = asn.NextInteger();  // Returned to caller  byte[] p1363Signature =newbyte[40];  if(r.Length>21||(r.Length==21&& r[0]!=0))  {    // WTF???    // Reject - signature verification failed  }  elseif(r.Length==21)  {    // r[0] = 0    // r[1]'s high bit *should* be set    Array.Copy(r,1, p1363Signature,0,20);  }  elseif(r.Length==20)  {    // r[0]'s high bit *should not* be set    Array.Copy(r,0, p1363Signature,0,20);  }  else  {    // fewer than 20 bytes    int len = r.Length;    int off =20- len;    Array.Copy(r,0, p1363Signature, off, len);  }  if(s.Length>21||(s.Length==21&& s[0]!=0))  {    // WTF???    // Reject - signature verification failed  }  elseif(s.Length==21)  {    // s[0] = 0    // s[1]'s high bit *should* be set    Array.Copy(s,1, p1363Signature,20,20);  }  elseif(s.Length==20)  {    // s[0]'s high bit *should not* be set    Array.Copy(s,0, p1363Signature,20,20);  }  else  {    // fewer than 20 bytes    int len = s.Length;    int off =40- len;    Array.Copy(s,0, p1363Signature, off, len);  }  return p1363Signature;}
sundayle | 园豆:135 (初学一级) | 2011-09-15 13:35

这个AsnParser是哪里的呢

支持(0) 反对(0) Steven Sun | 园豆:100 (初学一级) | 2011-09-26 16:02
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册
Top