我正在尝试通过Java学习和实现JWE来解决问题。我试图了解如何使用某种算法(例如RSA-PKCS1_1.5)生成内容加密密钥。
我了解如何使用密钥生成器生成一对密钥,然后使用公钥进行加密,并使用私钥进行解密。另外,我知道如何通过提出声明来创建简单的JWT令牌以及如何对其进行签名。 我正在尝试按照以下步骤操作:
消息加密过程如下:
生成随机内容加密密钥(CEK)。 CEK的长度必须至少等于所需加密密钥的长度,并且必须随机生成。
为收件人加密CEK
生成随机IV(如果算法需要)。
如果包含zip参数,则压缩纯文本。
将(压缩的)纯文本序列化为比特串M。
使用CEK和IV加密M以形成位串C。
设置“编码的JWE密文”等于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));
}
答案 0 :(得分:0)
密钥管理模式用于确定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
,{{ 1}},A192GCMKW
A256GCMKW
ECDH-ES
,ECDH-ES+A128KW
,ECDH-ES+A192KW
ECDH-ES+A256KW