Результат AES-шифрования кода C# отличается от результата Java AES-Encryption - PullRequest
1 голос
/ 18 июня 2020

Я следую за кодом шифрования aes в Java, который я хочу записать в C#, но он не дает того же результата. Java Код

public String doEncryptString(String salt, String password,String token) throws CryptoException {
        try {
            Cipher cipher = Cipher.getInstance("AES");
            SecretKeySpec secretKeySpec = generateKeySpec(salt,password);
            cipher.init(Cipher.ENCRYPT_MODE, secretKeySpec);
            byte[] inputBytes = token.getBytes();
            byte[] outputBytes = cipher.doFinal(inputBytes);
            return Base64Utils.encodeToString(outputBytes);
        } catch (NoSuchPaddingException | NoSuchAlgorithmException | InvalidKeyException | BadPaddingException
                | IllegalBlockSizeException ex) {
            throw new CryptoException("Error encrypting password", ex);
        }
    } 

private SecretKeySpec generateKeySpec(String salt,String password) throws CryptoException{
        try {

        String generatedkey=salt+password;
        byte[] key = generatedkey.getBytes("UTF-8");
        MessageDigest sha = MessageDigest.getInstance("SHA-1");
        key = sha.digest(key);
        key = Arrays.copyOf(key, 16); // use only first 128 bit
        SecretKeySpec secretKeySpec = new SecretKeySpec(key, "AES");
        return secretKeySpec;
    } catch (NoSuchAlgorithmException | IOException ex) {
        throw new CryptoException("Error encrypting password", ex);
    }
    }

Это то, что я пробовал в C#

public static string DoEncrypt(string salt, string password, string token)
        {
            var tdes = new AesManaged();
            tdes.Key = GenerateKey(salt, password);
            tdes.Mode = CipherMode.ECB;
            tdes.Padding = PaddingMode.PKCS7;
            ICryptoTransform crypt = tdes.CreateEncryptor();
            byte[] plain = Encoding.UTF8.GetBytes(token);
            byte[] cipher = crypt.TransformFinalBlock(plain, 0, plain.Length);
            return Convert.ToBase64String(cipher);
        }

        private static byte[] GenerateKey(string salt, string password)
        {
            string generatedkey = $"{salt}{password}";
            var key = Encoding.UTF8.GetBytes(generatedkey);
            var sha1 = SHA1Managed.Create();
            key = sha1.ComputeHash(key);
            return key.Take(16).ToArray(); // use only first 128 bit
        }

строка / токен для шифрования: ZHKRIWB310XVVWG315PI7UZZWU1V0YYL5WE9JL Java вывод: eUjNH8kcgWtlEmuCFHMPwnCFWjy5Pye / gF + ​​itrPs1g8AjtAEZQqlzW / v7kEt2haG Мой C# вывод кода: O8sKdJWH + XCOIbexZPEwN5NxWqpWRHC5b3ZsihT8cfBqpI1eVr3PEr9Eq39a5pMn Я не знаю, что я здесь делаю не так. Любая помощь будет оценена. Спасибо Обновление Мои извинения всем. Код переведен в C# в рабочем состоянии. По ошибке я указал другое значение соли. Всем спасибо.

1 Ответ

0 голосов
/ 18 июня 2020

Что находится в ТРАНСФОРМАЦИИ из кода Java?

Вам также необходимо использовать тот же режим и заполнение, чтобы получить те же результаты, что означает ECB и PKCS7 в вашем случае.

Java кажется, предлагает только заполнение PKCS5? А вроде с PKCS7 совместим? Я не разработчик Java и не могу предоставить подробности, но здесь есть обсуждение: https://crypto.stackexchange.com/questions/9043/what-is-the-difference-between-pkcs5-padding-and-pkcs7-padding, где они говорят:

Некоторые криптографические c библиотеки, такие как поставщик SUN в Java, указывают PKCS # 5, где должен использоваться PKCS # 7 - "PKCS5Padding" должен был быть "PKCS7Padding". Это - с большой вероятностью - наследие того времени, когда были доступны только 8-байтовые блочные шифры, такие как (тройной) симметричный шифр DES.

И, кстати, для производства никогда не используйте режим ECB в качестве это небезопасно.

...