我正在尝试在 Java 中学习和实现 JWE 以获取问题陈述。我试图了解如何使用某种算法(比如说 RSA-PKCS1_1.5)生成内容加密密钥。
我知道如何使用密钥生成器生成一对密钥,然后使用公钥进行加密,使用私钥进行解密。另外,我知道如何通过提供声明来创建简单的 JWT 令牌以及如何对其进行签名。我正在尝试按照以下步骤操作:
消息加密过程如下:
生成随机内容加密密钥 (CEK)。CEK 的长度必须至少等于所需加密密钥的长度,并且必须随机生成。
为收件人加密 CEK
生成随机 IV(如果算法需要)。
如果包含 zip 参数,则压缩明文。
将(压缩的)明文序列化为位串 M。
使用 CEK 和 IV 加密 M 以形成位串 C。
将 Encoded JWE Ciphertext 设置为等于 C 的 base64url 编码表示。
创建一个包含使用的加密参数的 JWE 标头。
Base64url 对 JWE 标头的 UTF-8 表示的字节进行编码,以创建编码的 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));
}