You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用jsrsasign手动生成JWE?CEK相关实现疑问

手动构建JWE时的CEK生成与加密问题解答

关于CEK(ArrayBuffer)传入jsrsasign.KJUR.crypto.Cipher.encrypt的有效性问题

  • jsrsasign的Cipher.encrypt方法文档要求输入为字符串,直接传ArrayBuffer未报错是因为内部做了隐式转换,但这种转换存在风险:ArrayBuffer会被当作UTF-8字符串处理,而CEK是二进制密钥,部分字节值(如0x80以上)在UTF-8编码中无效,会导致字节丢失或篡改,最终生成的JWE加密密钥必然无效。
  • 正确做法是将CEK的ArrayBuffer转成十六进制字符串传入:
    // 假设cek是Uint8Array类型的CEK
    const cekHex = KJUR.crypto.Util.bintohex(cek);
    const encryptedCek = KJUR.crypto.Cipher.encrypt(publicKey, cekHex, 'RSA-OAEP');
    
    这样能保证二进制数据完整传递,符合RFC7516对CEK加密的要求。

关于getRandomHexOfNbits(256)生成的CEK数组长度问题

  • 256位的CEK对应32字节,getRandomHexOfNbits(256)返回的是64个字符的十六进制字符串(每个字节对应2个十六进制字符)。你得到33字节数组且首字节为0,大概率是转换方式错误导致的:比如错误地将十六进制字符串转成数字后再转数组,或者用了不匹配的转换工具。
  • 用jsrsasign自带的KJUR.crypto.Util.hextobin()转换十六进制字符串,得到的Uint8Array长度必然是32字节。如果转换后首字节确实是0,这是完全正常的随机结果——CEK是随机字节数组,任何字节值(包括0)都是合法的,不需要丢弃首字节,只要确保最终CEK是32字节即可。

内容的提问来源于stack exchange,提问作者epc

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.28 11:52:37