当前位置: 首页 > 知识库问答 >
问题:

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

白浩气
2023-03-14

我试图学习并在java中实现JWE来解决问题。我试图理解内容加密密钥是如何使用特定算法生成的(比如RSA-PKCS1\u 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个答案

乐正焕
2023-03-14

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

  • 密钥加密:RSA1_5RSA-OAEPRSA-OAEP-256RSA-OAEP-384RSA-OAEP-512
  • 密钥包装:A128KWA192KWA256KWPBES2-HS256 A128KWPBES2-HS384 A192KWPBES2-HS512 A256KWA128GCMKWA192GCMKWA256GCMKW
  • 直接密钥协议:ECDH-ES
  • 与密钥包装的密钥协议:ECDH-ES A128KWECDH-ES A192KWECDH-ES A256KW
  • 直接加密:dir
  • 通过密钥加密、密钥包装和密钥协议与密钥包装,CEK是一个随机字节字符串。其大小取决于内容加密算法
 类似资料:
  • 我正在使用节点jose v0。11.0 (https://www.npmjs.com/package/node-jose)用于JWK和JWE操作。我有一个JWK格式的RSA密钥,可以加载到JWK密钥存储中,也可以再次提取。然而,当我尝试加密任何东西时,我会进入“error2”,“unsupported algorithm”。RSA怎么可能是不受支持的算法? 结果如下: 更新我在实际代码中挖掘了一点

  • 我试图在Android(Java)中实现ECDH加密/解密和JWE。 我找到了jose4j和Nimbus JOSE库,它们旨在做我需要的一切,但似乎比我想象的更具挑战性。 如果有人熟悉的话,那就是3D安全2.0。。。 在以下规范中: SDK=本地端 DS=目录服务器(另一边) 接下来是规范: 给定:P(DS)-EC公钥(以PEM格式提供,可以转换为PublicKey或JWK) 生成新的短暂密钥对(

  • 我从这里得到了提示:PHP中的双向加密 作为测试环境,im运行WAMP LocalHost。

  • 问题内容: 我正在用Python编写程序,以通过安装程序分发给Windows用户。 该程序需要能够每天下载使用用户公钥加密的文件,然后再解密。 因此,我需要找到一个Python库,该库将允许我生成公共和私有PGP密钥,并解密使用该公共密钥加密的文件。 pyCrypto是否会做这件事(文档模糊)?还有其他纯Python库吗?使用任何语言的独立命令行工具如何? 到目前为止,我所看到的只是GNUPG,但

  • 我有一个类似于下面的私钥 例如。 我有下面的JWE数据,它是使用上面的私钥/证书生成的公钥加密的 有人能给我java代码,我可以用我的私钥解密这个JWE吗?我在网上找不到明确的答案。我对JWE这个概念很陌生

  • 问题内容: 我有一个奇怪的问题 我的解决方案基于将硬编码文件解密为字节[] 因此,我写了一个小的Cypher类来帮助进行加密/解密…它曾经用来模拟在某个地方进行硬编码的密钥,以及另一个在其他地方存储的预加密密钥。但这与atm无关。 加密过程如下: 检索硬编码的字节数组 用它来解密key2 使用key2解密数据 使用key1进一步解密数据 已解密数据 我将加密的数据存储为十六进制字符串,使用这两个函