0

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

1 回答 1

1

密钥管理模式

密钥管理模式用于确定 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, A192GCMKW,A256GCMKW
  • 直接密钥协议:ECDH-ES
  • 密钥封装的密钥协议:ECDH-ES+A128KW, ECDH-ES+A192KW, ECDH-ES+A256KW
  • 直接加密:dir

如何确定CEK?

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