https://github.com/cisco/node-jose es mi código de ejemplo:
let keystore1; let keystore2; keystore1 = JWK.createKeyStore(); keystore2 = JWK.createKeyStore(); const input = { message: { text: 'Привет!' } }; const priv1 = await keystore1.generate('EC', 'P-256', { kid: '1gBdaS-G8RLax2qgObTD94w', key_ops:["sign", "decrypt", "unwrap"] }); const priv2 = await keystore2.generate('EC', 'P-256', { kid: '2gBdaS-G8RLax2qgObTD94v', key_ops:["sign", "decrypt", "unwrap"] }); const pub1 = await JWK.asKey(priv1.toJSON()); const pub2 = await JWK.asKey(priv2.toJSON()); const encrypted = await JWE.createEncrypt( { format: 'compact', fields: { alg: 'ECDH-ES', enc: 'A128CBC-HS256', cty: 'json', // replace with JWT if you're encrypting a JWT... }, }, { key: pub2, } ) .update(JSON.stringify(input)) .final(); console.log('encrypted', encrypted); const decrypted = await JWE.createDecrypt(priv2).decrypt(encrypted); console.log('decrypted', JSON.parse(decrypted.payload.toString()));// simular solo tener acceso a la clave pública, generalmente este es su punto de partida ya que solo tiene acceso a los componentes públicos si está encriptando un mensaje para otra persona.
¡Con latín - descifrado ok! Cómo descifrar con cirílico, por favor ayúdenme.