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

问题描述 投票:0回答:1

我正在尝试在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));
}
encryption jwe jceks
1个回答
0
投票

Key Management Mode

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

  • 密钥加密:RSA1_5RSA-OAEPRSA-OAEP-256RSA-OAEP-384RSA-OAEP-512
  • 关键包装:A128KWA192KWA256KWPBES2-HS256+A128KWPBES2-HS384+A192KWPBES2-HS512+A256KWA128GCMKWA192GCMKWA256GCMKW
  • 直接密钥协议:ECDH-ES
  • 关键包装的重要协议:qazxsw poi,qazxsw poi,qazxsw poi
  • 直接加密:ECDH-ES+A128KW

How to determine the CEK?

  • 通过密钥加密,密钥包装和密钥包装的密钥协商,CEK是一个随机字节串。其大小取决于内容加密算法。
  • 使用直接密钥协议,CEK是使用发送方和接收方密钥计算的约定密钥。
  • 使用直接加密,CEK是共享对称密钥。
© www.soinside.com 2019 - 2024. All rights reserved.