gpt4 book ai didi

c# - RSA C# 加密 Java 解密

转载 作者:行者123 更新时间:2023-11-30 05:12:27 25 4
gpt4 key购买 nike

在我的程序(服务器端 - Java)中,我使用命令创建了 keystore 文件:

keytool -genkey -alias myalias -keyalg RSA -validity 10000 -keystore my.keystore

并导出相关的 X509 证书:

keytool -export -alias myalias -file cert.cer -keystore my.keystore

在客户端(C#)保存 cert.cer 并编写以下代码后:

X509Certificate2 x509 = new X509Certificate2();
byte[] rawData = ReadFile("mycert.cer");
x509.Import(rawData);

RSACryptoServiceProvider rsa = (RSACryptoServiceProvider)x509.PublicKey.Key;
byte[] plainbytes = System.Text.Encoding.ASCII.GetBytes("My Secret");
byte[] cipherbytes = rsa.Encrypt(plainbytes, true);
String cipherHex = convertToHex(cipherContent);
byte[] byteArray = encoding.GetBytes(cipherHex);

....

我在服务器端编写了这段Java代码:

keyStore = KeyStore.getInstance(KeyStore.getDefaultType());
keyStore.load(new FileInputStream("C:\\my.keystore"), "mypass".toCharArray());
Key key = keyStore.getKey("myalias", "mypass".toCharArray());
if (key instanceof PrivateKey) {
Certificate cert = keyStore.getCertificate("myalias");
PublicKey pubKey = cert.getPublicKey();
privKey = (PrivateKey)key;
}
byte[] toDecodeBytes = new BigInteger(encodeMessageHex, 16).toByteArray();
Cipher decCipher = Cipher.getInstance("RSA");
decCipher.init(Cipher.DECRYPT_MODE, privKey);
byte[] decodeMessageBytes = decCipher.doFinal(toDecodeBytes);
String decodeMessageString = new String(decodeMessageBytes);

我收到此错误:

javax.crypto.BadPaddingException: Data must start with zero

你能帮我一下吗?谢谢谢谢,

最佳答案

在 Java 中使用 BigInteger 进行十六进制解码的方法大多数时候会产生错误的结果,因为 Java BigInteger 类编码的值的高位字节 >= 128,并且前面有一个额外的零字节。使用 Apache commons 编解码器进行十六进制编码/解码。

编辑:您的 C# 代码不正确。有一个 .NET 类 System.Runtime.Remoting.Metadata.W3cXsd2001.SoapHexBinary 将为您的 C# 代码执行十六进制编码/解码。下面的 C# 代码片段应该可以更好地工作

public static String execute(String content)
{
ASCIIEncoding encoding = new ASCIIEncoding();
byte[] plainbytes = System.Text.Encoding.ASCII.GetBytes(content);
byte[] cipherbytes = rsa.Encrypt(plainbytes, false);
SoapHexBinary hexBinary = new SoapHexBinary(cipherbytes);
String cipherHex = hexBinary.ToString();

// This String is used on java side to decrypt
Console.WriteLine("CIPHER HEX: " + cipherHex);
return cipherHex;
}

编辑2:

SoapHexBinary 类在 .NET 中的生命周期似乎很短。对于该问题有很多好的解决方案,参见this msdn link .

关于c# - RSA C# 加密 Java 解密,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2930206/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com