[英]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.