所以我不是任何方式的加密向导,但这里有一些我在C#中工作的代码但是在Java中没有返回相同的b64字符串。
C#
string _Cert = "long b64 string here";
string _Pass = "my password";
string lvreturn = "Test";
byte[] lvCertBytes = Convert.FromBase64String(_Cert);
X509Certificate2 lvCertFromBytes = new X509Certificate2(lvCertBytes, _Pass);
SHA1Managed lvSHA1 = new SHA1Managed();
byte[] lvData = Encoding.Unicode.GetBytes(lvReturn);
byte[] lvHash = lvSHA1.ComputeHash(lvData);
RSACryptoServiceProvider lvCryptoProvider = (RSACryptoServiceProvider)lvCertFromBytes.PrivateKey;
byte[] lvSignedBytes = lvCryptoProvider.SignHash(lvHash, CryptoConfig.MapNameToOID("SHA1"));
string lvToken = Convert.ToBase64String(lvSignedBytes);
爪哇
String certB64 = "long b64 string here";
char[] Pass = "text password".toCharArray();
String alias = "guid looking ID here";
String plaintext = "Test";
byte[] certbytes = Base64.getDecoder().decode(certB64);
InputStream in = new ByteArrayInputStream(certbytes);
KeyStore keystore = KeyStore.getInstance("PKCS12");
keystore.load(in,Pass);
KeyStore.PrivateKeyEntry pvk = (KeyStore.PrivateKeyEntry)keystore.getEntry(alias, new KeyStore.PasswordProtection(Pass));
PrivateKey pkey = (PrivateKey)pvk.getPrivateKey();
Signature rsa = Signature.getInstance("SHA1withRSA");
rsa.initSign(pkey);
rsa.update(plaintext.getBytes());
System.out.println("Hash: " + Base64.getEncoder().encodeToString(rsa.sign()));
我有Cert.pfx文件,我想用它来使用私钥来加密https身份验证段。我只是将文件转换为base64字符串并将其填充到" _Cert" var中的C#。我在Java中做同样的事情。我想使用cert和SHA1的私钥来签署明文消息。下面的C#代码有效,https服务器提供响应。然而,Java并没有吐出相同的base64编码字符串。谢谢你的帮助!
更新:我找到了另一个帖子的链接,该帖子与我的相同但有几个小差异,我不想在它上面发帖。我跟着它完全删除了原始代码的messagedigest。我试着直接从pfx文件中读取或直接在代码中使用b64字符串。我仍然没有在Java和C#之间获得相同的结果。在这一点上,它必须是我在Java中编码所缺少的东西,因为C#基本上与我的相同。