【发布时间】:2020-12-17 19:36:44
【问题描述】:
想在java中使用生成的RSA公钥,在c#函数中加密数据并在Java解密函数中解密。
生成的 Java 公钥已在 c# 中的 Modulus 标记中替换:
static string publicKey = "<RSAKeyValue><Modulus>MFwwDQ...wEAAQ==</Modulus><Exponent>AQAB</Exponent></RSAKeyValue>";
C# 加密函数:
static string Encrypt(string text)
{
const int PROVIDER_RSA_FULL = 1;
const string CONTAINER_NAME = "Tracker";
CspParameters cspParams;
cspParams = new CspParameters(PROVIDER_RSA_FULL);
cspParams.KeyContainerName = CONTAINER_NAME;
RSACryptoServiceProvider rsa1 = new RSACryptoServiceProvider(512,cspParams);
rsa1.FromXmlString(publicKey);
byte[] textBytes = Encoding.UTF8.GetBytes(text);
byte[] encryptedOutput = rsa1.Encrypt(textBytes, RSAEncryptionPadding.Pkcs1);
string outputB64 = Convert.ToBase64String(encryptedOutput);
return outputB64;
}
Java解密函数:
static String Decrypt(String encodedString,PrivateKey privKey) {
try {
Cipher cipher = Cipher.getInstance(cipherInstancename);
cipher.init(Cipher.DECRYPT_MODE, privKey);
byte[] decrypted = cipher.doFinal(Base64.getDecoder().decode(encodedString));
return new String(decrypted, "UTF-8");
} catch (Exception err) {
return err.fillInStackTrace().toString();
}
}
第一个问题:在 c# XML 字符串中替换 Modulus 标记中的 Java 公钥是否正确?指数标签呢?我使用了 AQAB 值。
第二个问题:为什么在Java中解密时会出现这个错误:
javax.crypto.IllegalBlockSizeException: Data must not be longer than 64 bytes
经过一番研究,我发现这是一个普遍的错误,什么原因会导致这种错误?
【问题讨论】:
-
RSA 私钥/公钥加密仅限于小数据,并且取决于密钥长度。您使用的是不安全的 512 位长密钥,因此您一次只能加密 64 个字节。拥有更长的密钥将导致更大的明文可以被加密,但加密的时间也会增加,因此在“现实世界”中,您将使用混合加密(生成随机 AES 密钥,使用此密钥加密您的数据,加密密钥(AES 256 为 32 字节)和公钥,并将加密数据和加密密钥一起发送到 Java - 在那里你用私钥解密密钥并解密。
标签: java c# encryption rsa