c#中的对称加密类似于JAVA
本文关键字:类似于 JAVA 加密 对称 | 更新日期: 2023-09-27 18:17:28
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
。- 你可能不想要这个,看看企鹅在https://en.wikipedia.org/wiki/Block_cipher_mode_of_operation#Common_modes。
- 将
aesProvider.IV
传递给CreateEncryptor
的IV参数。如果IV属性没有设置,它将在第一次读取时生成一个加密随机值。- 您需要将此数据传递给解密例程,然后应该使用"AES/CBC/PKCS5Padding",并设置IV,然而在Java中这样做。
- 一种常见的传输方法是简单地将数据附加到密文中,然后在解密时只取出前16个字节。
- 不要为IV使用固定值,因为它几乎与ECB相同。