我知道这是一个有很多现有问题的主题,但我无法找到涵盖我的确切情况的任何现有答案。验证由C#中的Java生成的DSA签名
我需要在某些Java代码中签署一个字符串(URL),并将该字符串与签名一起传递给C#程序。
我运行下面的Java代码,一旦生成一个密钥对DSA:
KeyPairGenerator keyGen = KeyPairGenerator.getInstance("DSA", "SUN");
SecureRandom random = SecureRandom.getInstance("SHA1PRNG", "SUN");
keyGen.initialize(1024, random);
KeyPair pair = keyGen.generateKeyPair();
PrivateKey priv = pair.getPrivate();
PublicKey pub = pair.getPublic();
/* save the private key in a file */
byte[] privkey = priv.getEncoded();
FileOutputStream privkeyfos = new FileOutputStream("key.priv");
privkeyfos.write(privkey);
privkeyfos.close();
/* save the public key in a file */
byte[] pubkey = pub.getEncoded();
FileOutputStream pubkeyfos = new FileOutputStream("key.public");
pubkeyfos.write(pubkey);
pubkeyfos.close();
我然后用下面的代码生成签名。
public static String Sign(String keyPath, byte[] data)
{
FileInputStream keyfis = new FileInputStream(new File(keyPath, "key.priv"));
byte[] encKey = new byte[keyfis.available()];
keyfis.read(encKey);
keyfis.close();
PKCS8EncodedKeySpec privKeySpec = new PKCS8EncodedKeySpec(encKey);
KeyFactory keyFactory = KeyFactory.getInstance("DSA");
PrivateKey privKey = keyFactory.generatePrivate(privKeySpec);
Signature dsa = Signature.getInstance("SHA1withDSA", "SUN");
dsa.initSign(privKey);
ByteArrayInputStream in = new ByteArrayInputStream(data);
BufferedInputStream bufin = new BufferedInputStream(in);
byte[] buffer = new byte[1024];
int len;
while ((len = bufin.read(buffer)) >= 0)
{
dsa.update(buffer, 0, len);
}
bufin.close();
byte[] realSig = dsa.sign();
return new String(Base64.encodeBase64(realSig), "UTF-8");
}
在我的C#代码中,我可以从第一步访问字符串,Base64编码签名和“key.public”文件。
任何人都可以提供一个代码块,结合这些元素以及合适的库来确定字符串是否被篡改?
谷歌搜索“C#dsa验证示例”获得大量命中,可以解释这些示例如何不能满足您的需求? – 2011-02-04 00:16:13
[在C#验证DSA签名]的可能重复(http://stackoverflow.com/questions/1628305/verify-dsa-signature-in-c) – 2011-02-04 00:17:22