【问题标题】:How to generate Content Encryption Key for JWE implementation如何为 JWE 实现生成内容加密密钥
【发布时间】:2019-08-16 10:34:42
【问题描述】:

我正在尝试在 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】:

    密钥管理模式

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

    • 密钥加密:RSA1_5RSA-OAEPRSA-OAEP-256RSA-OAEP-384RSA-OAEP-512
    • 密钥包装:A128KWA192KWA256KWPBES2-HS256+A128KWPBES2-HS384+A192KWPBES2-HS512+A256KWA128GCMKWA128GCMKWA256GCMKW
    • 直接密钥协议:ECDH-ES
    • 带有密钥包装的密钥协议:ECDH-ES+A128KWECDH-ES+A192KWECDH-ES+A256KW
    • 直接加密:dir

    如何确定CEK?

    • 使用 Key EncryptionKey WrappingKey Agreement with Key Wrapping,CEK 是一个随机字节串。它的大小取决于内容加密算法。
    • 对于直接密钥协议,CEK 是使用发送方和接收方密钥计算得出的商定密钥。
    • 使用直接加密,CEK 是共享对称密钥。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-07-17
      • 2011-02-12
      • 2019-12-07
      • 2018-11-25
      • 2021-08-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多