Java AES / CBC / PKCS5Padding в C # - PullRequest
       7

Java AES / CBC / PKCS5Padding в C #

0 голосов
/ 01 ноября 2019

Мне дали код шифрования Java, который необходимо преобразовать в C #. Я думаю, что я довольно близко ... но я не уверен, как дублировать вычисление IV ... любая помощь?

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 # код:

    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);
    }

1 Ответ

0 голосов
/ 01 ноября 2019

Если я не неправильно понимаю код Java, вам просто нужно присвоить значение ключа для IV:

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

и удалить строку GenerateIV:

rijAlg.GenerateIV();

Я понимаю, что вы не контролируете код Java, поэтому вы не можете это исправить, но для будущих читателей: вам не следует использовать один и тот же IV каждый раз, когда вы что-то шифруете. См. этот вопрос для получения дополнительной информации.

...