简体   繁体   English

Java C# 中的 AES/CBC/PKCS5Padding

[英]Java AES/CBC/PKCS5Padding in C#

I have been give Java encryption code that needs to be converted to C#.我一直给Java加密代码需要转换成C#。 I think I'm pretty close... but I'm not sure how to duplicate the IV calculation... any help?我想我已经很接近了……但我不确定如何复制 IV 计算……有什么帮助吗?

Java Code: Java 代码:

    public static string getAESencodingResult(String sSrc, String encrypt_key)
    {
        Cipher cipher = Cipher.getInstance("AES/CBC/PKCS5Padding");
        byte[] raw = encrypt_key.getBytes();
        SecretKeySpec skeySpec = new SecretKeySpec(raw, "AES");
        IvParameterSpec iv = new IvParameterSpec(encrypt_key.getBytes());
        cipher.init(Cipher.ENCRYPT_MODE, skeySpec, iv);
        byte[] encrypted = cipher.doFinal(sSrc.getBytes("utf-8"));
        return new BASE64Encoder().encode(encrypted);
    }

C# Code: C# 代码:

    static string EncryptStringToBytes(string plainText, byte[] key)
    {
        byte[] encrypted;
        using (RijndaelManaged rijAlg = new RijndaelManaged())
        {
            rijAlg.Key = key;
            // rijAlg.IV = ???
            rijAlg.GenerateIV();
            rijAlg.Padding = PaddingMode.PKCS7;
            rijAlg.Mode = CipherMode.CBC;
            ICryptoTransform encryptor = rijAlg.CreateEncryptor(rijAlg.Key, rijAlg.IV);
            using (MemoryStream msEncrypt = new MemoryStream())
            using (CryptoStream csEncrypt = new CryptoStream(msEncrypt, encryptor, CryptoStreamMode.Write))
            using (StreamWriter swEncrypt = new StreamWriter(csEncrypt))
            {

                swEncrypt.Write(plainText);
                if (plainText.Length < 16)
                {
                    for (int i = plainText.Length; i < 16; i++)
                        swEncrypt.Write((byte)0x0);
                }
                swEncrypt.Flush();
                csEncrypt.FlushFinalBlock();
                encrypted = msEncrypt.ToArray();
            }
        }
        return Convert.ToBase64String(encrypted);
    }

If I'm not misunderstanding the Java code, you simply need to assign the key value to the IV as well:如果我没有误解 Java 代码,您只需将键值也分配给 IV:

rijAlg.Key = key;
rijAlg.IV = key;

And remove the GenerateIV line:并删除 GenerateIV 行:

rijAlg.GenerateIV();

I understand that you're not in control of the Java code so you can't fix this, but for future readers: you shouldn't use the same IV every time you encrypt something.我了解您无法控制 Java 代码,因此您无法解决此问题,但对于未来的读者:您不应该每次加密时都使用相同的 IV。 See this question for more information.有关更多信息,请参阅此问题

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM