使用EC键在nodejose(js)和jwcrypto(python)之间进行互操作?

2024-05-15 08:09:20 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在努力在jwcrypto中生成一个JWE,它与节点jose中的JWE具有相同的键。目标是在节点jose中生成一个密钥,并将pubkey导出到jwcrypto来加密有效负载,然后由节点jose使用并解密。在

我的测试完全在node jose中进行:

var jose = require("node-jose")
var keyStore = jose.JWK.createKeyStore()

keyStore.generate('EC', 'P-521').then(function (result) {

    // Use exported key to encrypt something (so we see the same thing jwcrypto does)    
    jose.JWK.asKey(result.toJSON()).then(function(result) {

        jose.JWE.createEncrypt(result).update('this is a test payload').final().then(function (result) {

            jose.JWE.createDecrypt(keyStore).decrypt(result).then(function (result) {

                // Result is good
                console.log(result)
        })
    })

})

但是,当我在python中执行相同操作时,node jose会生成一个不同的JWE:

^{pr2}$

当节点jose试图解密my_jwe时,它失败,并显示“错误:找不到密钥”。奇怪的是(或者不是,这是我第一次使用JWEs…),两个加密结果是(见下面的示例)。我想我遗漏了如何让jwcrypto像节点jose一样,不需要'header'值,但是当我拉这些值时它会抱怨。在

“垃圾邮件”节点(示例):

{
    ciphertext: "1e7YX6hNDJWJELhHTNXEOg",
    iv: "oQZZq2smHX8u8MMwoC6NBA",
    protected: "eyJhbGciOi".....(very long string),
    tag: "3NfEqx9f2ivL8QodG5Duaw",
}

jwcrypto(垃圾数据):

{
    ciphertext: "7ldKnkcsLZUy-SXFRv_HpkWOsb-YUUlNFv-4M5yZhCA",
    iv: "1uErMiK_RWcaPXPCPq12Uw",
    header: {
        alg: "ECDH-ES",
        enc: "A128CBC-HS256",
        epk: {
            crv: "P-521",
            kty: "EC",
            x: different from the exported key, I assume this is expected 'epk', 
            y: different from the exported key, I assume this is expected 'epk',
        },
        kid: "JCU3sWKfirVybFbpy2NPOnq-4-43JiemRZLO5dmPMVo"
    },
    tag: "51AMFyCJld5uPyMFLLl-sw",
}

Tags: thekeynode节点isfunctionresultthis
1条回答
网友
1楼 · 发布于 2024-05-15 08:09:20

jwcrypto或node jose look的结果符合RFC7516。 唯一的区别是节点jose在protected成员(完整性保护头)中设置头,而jwcrypto在header成员中设置它(每个接收者不受保护的头)。在

我的理解是节点jose抛出一个错误,因为它在头(epk成员)中找不到公钥。它只检查protected成员,而不检查与RFC7516 section 2 paragraph 4.不兼容的其他头(header和{}成员,如果存在):

let the JOSE Header be the union of the members of the JWE Protected Header, the JWE Shared Unprotected Header and the corresponding JWE Per-Recipient Unprotected Header

在我看来,当只为一个收件人创建JWE时,没有理由在不受保护的头中设置epk成员(以及alg和{}成员)。这些不受保护的头的存在将阻止您使用JWE压缩序列化。因此,jwcrypto的行为应该改变。在

我不知道这两个库是如何工作的,但是有两种方法可以解决这个问题:

  • 强制jwcrypto使用受完整性保护的标头,而不是不受保护的标头(best)。在
  • 问节点.jose考虑其他标题(良好但可能需要一些时间)

相关问题 更多 >