Другой результат Encrypt C # Java - PullRequest
0 голосов
/ 03 января 2019

Когда я пытаюсь преобразовать кодовую форму Java в C #, у меня возникает большая проблема с EncryptFunction. У меня есть этот код в Java:

    private String KEY_PRIVATE_HP = "__hpcSecretKey__";

    private IvParameterSpec getIvParameterSpec() {
        byte[] empty = new byte[16];
        return new IvParameterSpec(empty);
    }

    private String encryptBin(String value) {
            SecretKeySpec secretKeySpec = new SecretKeySpec(KEY_PRIVATE_HP.getBytes("UTF-8"),"AES");
            Cipher cipher = Cipher.getInstance("AES/CBC/PKCS5PADDING");
            cipher.init(Cipher.ENCRYPT_MODE, secretKeySpec, getIvParameterSpec());

            byte[] encrypted = cipher.doFinal(value.getBytes());
            return Base64.encodeToString(encrypted, Base64.NO_WRAP);
    }

И я преобразовал его в C # так:

        static string  KEY_PRIVATE_HP = "__hpcSecretKey__";

        public static string encryptBin(string value)
        {
            RijndaelManaged rijndaelCipher = new RijndaelManaged();
            rijndaelCipher.Mode = CipherMode.CBC;
            rijndaelCipher.Padding = PaddingMode.PKCS7;

            rijndaelCipher.KeySize = 0x80;
            rijndaelCipher.BlockSize = 0x80;
            byte[] pwdBytes = Encoding.UTF8.GetBytes(KEY_PRIVATE_HP);
            byte[] keyBytes = new byte[0x10];
            int len = pwdBytes.Length;
            if (len > keyBytes.Length)
            {
                len = keyBytes.Length;
            }
            Array.Copy(pwdBytes, keyBytes, len);
            rijndaelCipher.Key = keyBytes;
            rijndaelCipher.IV = keyBytes;
            ICryptoTransform transform = rijndaelCipher.CreateEncryptor();
            byte[] plainText = Encoding.UTF8.GetBytes(value);
            return Convert.ToBase64String(transform.TransformFinalBlock(plainText, 0, plainText.Length));
        }

Но когда я отлаживаю в C # и Java вместе, это приводит к другому результату. Что не так?

1 Ответ

0 голосов
/ 03 января 2019

В одном коде вы используете полностью нулевой байт IV, в другом вы копируете байты ключа.

Оба небезопасны, для режима CBC IV должен быть непредсказуемым; обычно используются безопасные случайные значения с префиксом зашифрованного текста.

Возможно, вы захотите взглянуть на аутентифицированные шифры, такие как GCM. Использование CBC между двумя программами для безопасности транспорта небезопасно.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...