需要实现一个和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();
}
msdn我看了,还是不知道如何使用已知的私钥。
感谢楼上这位兄弟的关注
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;
}
                        这个AsnParser是哪里的呢