2017-10-18 12 views
0

jwcryptoでJWEを生成するのは、同じキーを持つnode-joseと同じです。目標は、ノードジョーズでキーを生成し、pwkeyをjwcryptoにエクスポートしてペイロードを暗号化し、ノード・ジョーズで消費され、解読されることです。ECキーを使用したnode-jose(js)とjwcrypto(python)の相互運用は可能ですか?

ノード・ホセで完全に私のテストが正常に動作します

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で同じことを行う際に、ノード・ホセが異なるJWEを生成します。

key = jwk.JWK(**json.loads(the_exported_key)) 

    # This key looks exactly the same as the exported key in node-jose 
    print(key.export(private_key=False)) 

    payload = "this is a test payload" 

    header = { 
     'alg': 'ECDH-ES', 
     'enc': 'A128CBC-HS256', 
    } 
    my_jwe = jwe.JWE(payload.encode('utf-8'), header) 
    my_jwe.add_recipient(key) 

ノード・ホセmy_jweを解読しようとすると、「エラー:鍵が見つかりません」というエラーが表示されます。奇妙なことに(あるいは、これはJWEを使った初めてのことです...)、2つの暗号化結果があります(下記の例を参照)。私はjwcryptoをnode-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", 
} 

答えて

0

あなたがjwcryptoまたはノード・ホセで得た結果は、RFC7516に準拠して見えます。 唯一の違いは、protectedメンバ(完全性保護されたヘッダー)にヘッダーを設定し、headerメンバ(受信者ごとの保護されていないヘッダー)にjwcryptoを設定するという点です。

私の理解では、ヘッダー(epkメンバー)に公開鍵が見つからないため、node-joseはエラーをスローします。 JWEは一つだけの受信者のために作成されたときに、私の視点から

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

:それだけRFC7516 section 2 paragraph 4.に準拠していないprotectedメンバーとされていない他のヘッダ(headerともunprotected会員存在する場合)をチェック保護されていないヘッダーにepkメンバー(およびalgおよびencメンバー)を設定する理由はありません。これらの保護されていないヘッダーが存在すると、JWE Compact Serializationを使用できなくなります。したがって、jwcryptoの動作を変更する必要があります。

  • フォースjwcrypto完全性を保護ヘッダの代わりに、保護されていない1(最高)を使用する:

    しかし私は、その問題を解決するには、2つの方法があり、これら2つのライブラリがどのように動作するか分かりません。

  • 考慮に他のヘッダ取るためにnode.jose依頼(良いをいくつかの時間がかかる場合があります)