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",
}