如何为JWE实施生成内容加密密钥

时间:2019-03-26 05:34:26

标签: encryption jwe jceks

我正在尝试通过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));
}

1 个答案:

答案 0 :(得分:0)

密钥管理模式

密钥管理模式用于确定CEK。每种算法都使用这些模式之一。 以下是可用模式和算法关联的列表:

  • 密钥加密:RSA1_5RSA-OAEPRSA-OAEP-256RSA-OAEP-384RSA-OAEP-512
  • 密钥包装:A128KWA192KWA256KWPBES2-HS256+A128KWPBES2-HS384+A192KWPBES2-HS512+A256KWA128GCMKW,{{ 1}},A192GCMKW
  • 直接密钥协议:A256GCMKW
  • 带有密钥包装的密钥协议:ECDH-ESECDH-ES+A128KWECDH-ES+A192KW
  • 直接加密:ECDH-ES+A256KW

如何确定CEK?

  • 通过密钥加密密钥包装与密钥包装的密钥协商,CEK是一个随机字节字符串。它的大小取决于内容加密算法。
  • 通过直接密钥协议,CEK是使用发送者和接收者密钥计算出的商定密钥。
  • 通过直接加密,CEK是共享对称密钥。