openssl - 使用 Openssl 解密 JWE 的内容加密密钥
问题描述
我有一个 JWE,我想用 openssl(和其他命令行)解密内容加密密钥(cek)
这里是我的 JWE:
eyJlcGsiOnsia3R5IjoiRUMiLCJjcnYiOiJQLTI1NiIsIngiOiJHQ2wtLWxRSGI3TktZVTNqWHBLVklfQllhVGxBTFQ1SkZQZGwzc2JCOW1ZIiwieSI6IkFEUlgyNVBCU2xaSkU3OWRyRVQwQVJ0UnFaQWtVSU1OdDlhYTJiYmpCWVkifSwiZW5jIjoiQTEyOEdDTSIsImFsZyI6IkVDREgtRVMrQTEyOEtXIn0.IFiUOn11TxTgnYWCA2rJLTYV3_r2n_qW.[IV].[Payload].[Sign]
所以现在我已经检索了这些元素:
临时公钥 (EPK):
-----BEGIN PUBLIC KEY-----
MFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAEGCl++lQHb7NKYU3jXpKVI/BYaTlA
LT5JFPdl3sbB9mYANFfbk8FKVkkTv12sRPQBG1GpkCRQgw231prZtuMFhg==
-----END PUBLIC KEY-----
私钥:
-----BEGIN EC PRIVATE KEY-----
MEECAQAwEwYHKoZIzj0CAQYIKoZIzj0DAQcEJzAlAgEBBCC0pi7An729X2hjD01f
TwwrlDzFIZ1XaNpJjqM01hyVuA==
-----END EC PRIVATE KEY-----
来自私钥和 EPK(base 64)的共享密钥:
5gMHliQ850OswmbhgSK/QR6QU43sTGfXxbQDPhgK0Qw=
base 64 中的密钥加密密钥 (kek):
jy5VPMvuVJTxTwtf1rhUKA==
解密的 JWE 标头:
{
"epk": {
"kty": "EC",
"crv": "P-256",
"x": "GCl--lQHb7NKYU3jXpKVI_BYaTlALT5JFPdl3sbB9mY",
"y": "ADRX25PBSlZJE79drET0ARtRqZAkUIMNt9aa2bbjBYY"
},
"enc": "A128GCM",
"alg": "ECDH-ES+A128KW"
}
现在我尝试解密 CEK: IFiUOn11TxTgnYWCA2rJLTYV3_r2n_qW 。但我有一些错误。
这里的命令:
openssl enc -nosalt -aes128-wrap -base64 -k $(base64 kek) -d -in encrypted-cek.64 -out cek
base64 kek
等于_jy5VPMvuVJTxTwtf1rhUKA==
和 encrypted-cek.64 包含IFiUOn11TxTgnYWCA2rJLTYV3/r2n/qW
(我已将 cek 从 base64url 转换为 base64)
这里的错误:
Error setting cipher id-aes128-wrap
140295367438784:error:0607B0AA:digital envelope routines:EVP_CipherInit_ex:wrap mode not allowed:../crypto/evp/evp_enc.c:160:
我忘记了什么。
解决方案
推荐阅读
- c# - UWP RichEditBox RightClick->Paste 未触发 Paste 事件
- python - 为什么用于跨行比较值的向量化 python 代码不起作用?
- discord.js - Discord.js bot 向它所在的每个服务器中的特定频道发送消息
- version-control - hg diff 显示特定目录中文件的不相关更改
- ruby-on-rails - Grunt 还是 Sprockets 更适合应对铁轨
- c# - 有没有办法在 Windows 中使用 C# 以编程方式禁用磁盘驱动器上的写入缓存策略?
- javascript - Web 应用程序不断在外部浏览器中打开新页面
- vba - 在表单中根据时间隐藏和取消隐藏标签
- webpack - Babel with core-js - Polyfills 不兼容 IE11
- html - 使用 rvest 抓取网页跨度