c#中的对称加密类似于JAVA

时间:2016-11-10 12:14:06

标签: java c# .net encryption encryption-symmetric

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是什么?

我尝试了许多无效的链接。 Symmetric Encryption between .NET and Java

请帮忙

1 个答案:

答案 0 :(得分:2)

如果您当前的Java解密代码也没有要求IV(并且您的解密返回您加密的相同数据),则Cipher.getInstance("AES")将使用ECB阻止模式返回对象。

.NET对称算法默认为CBC块模式,需要IV。

您有几个选择:

  • 在致电aesProvider.Mode = CipherMode.ECB之前设置CreateEncryptor
  • aesProvider.IV传递给CreateEncryptor的IV参数。如果未设置,则IV属性将在第一次读取时生成加密随机值。
    • 您需要将此数据传递给解密例程,然后解密例程应使用" AES / CBC / PKCS5Padding",然后设置IV,但是用Java编写它。
    • 一种常见的传输方法是简单地将数据前置到密文,然后在解密时选择前16个字节。
    • 不要为IV使用固定值,因为它与ECB几乎相同。