Openssl (сценарий оболочки) эквивалент java кода дешифрования - PullRequest
0 голосов
/ 27 января 2020

Нужна помощь с openssl, Каким будет openssl эквивалент приведенного ниже java метода?

private static String decryptString(String value, String myKey) {

    MessageDigest sha = null;
    SecretKeySpec secretKey = null;
    try {
        byte[] key = myKey.getBytes("UTF-8");
        sha = MessageDigest.getInstance("SHA-1");
        key = sha.digest(key);
        key = Arrays.copyOf(key, 16); // use only first 128 bit
        secretKey = new SecretKeySpec(key, "AES");
        Cipher cipher = Cipher.getInstance("AES/ECB/PKCS5PADDING");
        cipher.init(Cipher.DECRYPT_MODE, secretKey);
        return (new String(cipher.doFinal(Base64.decodeBase64(value))));
    } catch (Exception e) {
        System.out.println("Error while decrypting: " + e.toString());
    }
    return null;
}

1 Ответ

0 голосов
/ 27 января 2020

Функция переваривает строку (myKey) с использованием SHA-1, а затем использует первые 16 байтов результирующего дайджеста в качестве ключа для операции дешифрования AES128-ECB. Перед расшифровкой зашифрованный текст сначала декодируется в формате base64.

Чтобы переварить строку с использованием SHA-1, используйте следующий код: https://wiki.openssl.org/index.php/EVP_Message_Digests

Этот код фактически использует SHA- 256. Для этого вместо SHA-1 замените экземпляр EVP_sha256() на EVP_sha1(). Первые 16 байтов результата - это ваш «ключ».

Затем входное «значение» декодируется base64. Вот некоторый пример кода, чтобы сделать это с OpenSSL здесь:

http://www.ioncannon.net/programming/122/howto-base64-decode-with-cc-and-openssl/

Наконец, для выполнения операции расшифровки AES-ECB используйте код здесь:

https://wiki.openssl.org/index.php/EVP_Symmetric_Encryption_and_Decryption#Decrypting_the_Message

Этот код использует AES256-CB C. Для этого вместо AES128-ECB замените экземпляр EVP_aes_256_cbc() на EVP_aes_128_ecb(). Аргумент key такой же, как вы рассчитали выше. Аргумент iv для ECB просто NULL. Зашифрованный текст - это декодированные данные base64, которые вы вычислили выше. Обратите внимание, что часть «PKCS5PADDING» кода Java является значением по умолчанию в OpenSSL, так что ничего особенного для этого не требуется.

Открытый текст, который был выведен из операции дешифрования, является возвращаемым значением от вашей Java функции.

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