Как создать ключ шифрования контента для реализации JWE - PullRequest
0 голосов
/ 26 марта 2019

Я пытаюсь изучить и внедрить JWE в Java для постановки проблемы.Я пытаюсь понять, как генерируется ключ шифрования контента с использованием определенного алгоритма (скажем, RSA-PKCS1_1.5).

У меня есть знания о том, как сгенерировать пару ключей, используя генератор ключей, а затем использовать открытый ключ для шифрования и закрытый ключ для дешифрования.Кроме того, я знаю, как создать простой токен JWT, предоставляя претензии, а также как их подписывать.Я пытаюсь выполнить следующие действия:

Процесс шифрования сообщения выглядит следующим образом:

Создание случайного ключа шифрования содержимого (CEK).CEK ДОЛЖЕН иметь длину, по крайней мере равную длине требуемых ключей шифрования, и ДОЛЖЕН быть сгенерирован случайным образом.

Шифрование CEK для получателя

Создание случайного IV (если требуется для алгоритма).

Сжатие открытого текста, если был включен параметр zip.

Сериализация (сжатого) открытого текста в цепочку битов M.

Шифрование M с использованием CEK и IV для формирования цепочки битов C.

Установка зашифрованного зашифрованного текста JWE равным закодированному в base64url представлениюC.

Создание заголовка JWE, содержащего используемые параметры шифрования.

Base64url кодирует байты представления UTF-8 заголовка JWE для создания закодированного заголовка JWE.

Три кодированные части, взятые вместе, являются результатом шифрования.

public static void main(String[] args)
            throws NoSuchAlgorithmException, NoSuchPaddingException, InvalidKeyException, BadPaddingException, IllegalBlockSizeException {
        //ASYMMETRIC ENCRYPTION
        KeyPairGenerator keyPairGenerator = KeyPairGenerator.getInstance("RSA");
        keyPairGenerator.initialize(2048);
        KeyPair keys = keyPairGenerator.generateKeyPair();
        byte[] publicKey = keys.getPublic().getEncoded();
        byte[] privateKey = keys.getPrivate().getEncoded();

        System.out.println("PUBLIC KEY  ::: " + Base64.encodeBase64String(publicKey));
        System.out.println("PRIVATE KEY ::: " + Base64.encodeBase64String(privateKey));

        Cipher cipher = Cipher.getInstance("RSA");
        //PUBLIC KEY IS GETTING USED IN ENCRYPTING PLAIN TEXT
        cipher.init(Cipher.ENCRYPT_MODE, keys.getPublic());
        byte[] encryptedBytes = cipher.doFinal("Test String".getBytes());
        //PRIVATE KEY IS GETTING USED IN DECRYPTING CIPHER TEXT
        cipher.init(Cipher.DECRYPT_MODE, keys.getPrivate());
        byte[] decryptedBytes = cipher.doFinal(encryptedBytes);

        System.out.println("encrypted data  ::: " + BaseEncoding.base64().encode(encryptedBytes));
        System.out.println("decrypted text ::: " + new String(decryptedBytes));
}

1 Ответ

0 голосов
/ 27 марта 2019

Режим управления ключами

Режим управления ключами используется для определения CEK. Каждый алгоритм использует один из этих режимов. Далее список доступных режимов и алгоритмов ассоциаций:

  • Ключ шифрования: RSA1_5, RSA-OAEP, RSA-OAEP-256, RSA-OAEP-384, RSA-OAEP-512
  • Обертывание ключа: A128KW, A192KW, A256KW, PBES2-HS256+A128KW, PBES2-HS384+A192KW, PBES2-HS512+A256KW, A128GCMKW, A192GCMKW, A256GCMKW
  • Соглашение о прямом ключе: ECDH-ES
  • Соглашение о ключах с упаковкой ключей: ECDH-ES+A128KW, ECDH-ES+A192KW, ECDH-ES+A256KW
  • Прямое шифрование: dir

Как определить CEK?

  • С Key Encryption , Key Wrapping и Согласование ключей с Key Wrapping , CEK является случайной байтовой строкой. Его размер зависит от алгоритма шифрования содержимого.
  • При Соглашении о прямом ключе CEK - это согласованный ключ, рассчитанный с использованием ключей отправителя и получателя.
  • При Direct Encryption CEK является общим симметричным ключом.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...