【问题标题】:symmetric encryption in c# resembles JAVAc# 中的对称加密类似于 JAVA
【发布时间】:2017-03-24 11:13:40
【问题描述】:
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

请帮忙

【问题讨论】:

  • Stackoverflow 不是代码编写服务。像你这样的问题应该以太宽泛来结束。
  • 你应该完全放弃上面的代码。它远非安全。

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


【解决方案1】:

如果您当前的 Java 解密代码也不需要 IV(并且您的解密返回的数据与您加密的数据相同),那么 Cipher.getInstance("AES") 正在使用 ECB 块模式返回一个对象。

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

你有几个选择:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-01-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-09-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多