首页 新闻 会员 周边

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

1
悬赏园豆:100 [待解决问题]

需要实现一个和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
< >
分享
所有回答(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
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册