Java数字签名与C#的区别我有下面的c#代码来从私钥生成数字签名:staticstringSign(stringtext,stringcertificate){X509Certificate2cert=newX509Certificate2(证书,“TestPassword”,X509KeyStorageFlags.Exportable);RSACryptoServiceProviderrsa=(RSACryptoServiceProvider)cert.PrivateKey;//散列数据SHA1Managedsha1=newSHA1Managed();ASCIIEncoding编码=newASCIIEncoding();字节[数据.GetBytes(文本);byte[]hash=sha1.ComputeHash(数据);//对哈希值进行签名returnSystem.Convert.ToBase64String(rsa.SignHash(hash,CryptoConfig.MapNameToOID("SHA1")));然后我创建了我认为是等效的java代码:publicstaticStringsignData(StringdataToSign,StringkeyFile){FileInputStreamkeyfis=null;尝试{keyfis=newFileInputStream(fileName);KeyStorestore=KeyStore.getInstance("PKCS12");store.load(keyfis,"TestPassword".toCharArray());KeyStore.PrivateKeyEntrypvk=(KeyStore.PrivateKeyEntry)store.getEntry("测试密钥",newKeyStore.PasswordProtec化(“测试密码”.toCharArray()));私钥privateKey=(PrivateKey)pvk.getPrivateKey();byte[]data=dataToSign.getBytes("US-ASCII");MessageDigestmd=MessageDigest.getInstance("SHA1");byte[]hashed=md.digest(data);签名rsa=Signature.getInstance("SHA1withRSA");rsa.initSign(私钥);rsa.更新(数据);返回Base64.encode(rsa.sign());}catch(Exceptionex){Logger.getLogger(this.getClass().getName()).log(Level.SEVERE,null,ex);}finally{if(keyfis!=null){try{keyfis.close()}catch(Exceptionex){keyfis=null;}}}返回空值;不幸的是,数字签名不匹配任何帮助将不胜感激。提前致谢。编辑:如果我从java代码中删除MessageDigest,则输出是相同的。为什么?我认为需要哈希。此致,EugeneJavasign方法根据Signature类的getInstance方法中提供的算法进行散列和签名,因此基本上您在Java中进行了两次散列。好的,我已经确认了。如果我从java示例代码中删除MessageDigest/Hashing代码,那么两个数字签名是相同的。不知道为什么,但我会尝试找出答案。如果有人想进一步教育我,请随意。以上就是C#学习教程的全部内容:Java数字签名与C#的区别。如果对你有用,需要进一步了解C#学习教程,希望大家多多关注。本文收集自网络,不代表立场。如涉及侵权,请点击右侧联系管理员删除。如需转载请注明出处:
