Я пытаюсь изучить и внедрить 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));
}