[英]symmetric encryption in c# resembles JAVA
private static byte[] encryptData(ByteArrayOutputStream data, byte[] symmetricKey) throws EncryptionException {
try {
SecretKey secKey = new SecretKeySpec(symmetricKey, "AES");
Cipher cipher = Cipher.getInstance("AES");
cipher.init(Cipher.ENCRYPT_MODE, secKey);
return cipher.doFinal(data.toByteArray());
} catch (NoSuchAlgorithmException | NoSuchPaddingException | IllegalBlockSizeException |
InvalidKeyException |
BadPaddingException e) {
throw new EncryptionException(e);
}
}
我遇到需要使用.NET加密数据并使用JAVA解密相同数据的情况。 本质上,我需要在.NET中重写上述加密方法。
public byte[] Encrypt(byte[] key, byte[] plainText)
{
using (AesCryptoServiceProvider aesProvider = new AesCryptoServiceProvider())
{
using (ICryptoTransform encryptor = aesProvider.CreateEncryptor(key, magicIV))
{
using (MemoryStream ms = new MemoryStream())
{
using (CryptoStream cs = new CryptoStream(ms, encryptor, CryptoStreamMode.Write))
{
cs.Write(plainText, 0, plainText.Length);
}
byte[] cipherText = ms.ToArray();
return cipherText;
}
}
}
}
我在某处使用的上述代码强制执行JAVA不需要的IV。 JAVA代码中使用的IV是什么?
我尝试了许多无效的链接。 .NET和Java之间的对称加密
请帮忙
如果您当前的Java解密代码也没有要求IV(并且您的解密返回了您加密的相同数据),则Cipher.getInstance("AES")
将使用ECB块模式返回一个对象。
.NET对称算法默认为CBC块模式,这需要IV。
您有两种选择:
CreateEncryptor
之前,设置aesProvider.Mode = CipherMode.ECB
。
aesProvider.IV
传递给CreateEncryptor
的IV参数。 如果未设置IV属性,则在第一次读取时将使其成为密码随机值。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.