Skip to content

Instantly share code, notes, and snippets.

@renatoargh
Last active April 13, 2023 21:38
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save renatoargh/54b641cdeac2f2bc7bfa38727b64729c to your computer and use it in GitHub Desktop.
Save renatoargh/54b641cdeac2f2bc7bfa38727b64729c to your computer and use it in GitHub Desktop.
RSA 4096 Assymmetric key encrypt/decrypt example
import { JWK, JWE } from 'node-jose';
const store = JWK.createKeyStore()
const alphaKey = await JWK.createKey("RSA", 4096, {
kid: '258df19c-f3bf-4f39-8829-a9adbd97d7d7',
alg: 'RSA-OAEP-256',
use: 'enc',
expires_on: Math.floor(new Date().valueOf() / 1000),
})
const betaKey = await JWK.createKey("RSA", 4096, {
kid: 'd955c2af-82e3-4e58-ae70-aa1afa8baf63',
alg: 'RSA-OAEP-256',
use: 'enc',
expires_on: Math.floor(new Date().valueOf() / 1000),
})
await Promise.all([
store.add(alphaKey),
store.add(betaKey),
])
const plaintext = 'potato'
const format = 'compact' // `compact` meand JWT-like string. `flattened` means an object format.
// PUBLIC KEY ONLY
const alphaPublic = alphaKey.toJSON(false) // export PUBLIC key only
console.log('> Public Key:', JSON.stringify(alphaPublic, null, 2))
const publicEncrypted = await JWE.createEncrypt({ format }, alphaPublic).update(plaintext).final();
console.log(`> public encrypted (${format}):`, publicEncrypted)
const publicDecrypted = await JWE.createDecrypt(store).decrypt(publicEncrypted)
console.log('> public decrypted:', publicDecrypted.plaintext.toString())
console.log('')
// PRIVATE KEY ONLY
const alphaPrivateAndPublic = alphaKey.toJSON(true) // export PUBLIC and PRIVATE keys
console.log('> Public and Private Key:', JSON.stringify(alphaPrivateAndPublic, null, 2))
const privateEncrypted = await JWE.createEncrypt({ format }, alphaPrivateAndPublic).update(plaintext).final();
console.log(`> private encrypted (${format}):`, privateEncrypted)
const privateDecrypted = await JWE.createDecrypt(store).decrypt(privateEncrypted)
console.log('> private decrypted:', privateDecrypted.plaintext.toString())
console.log('')
// EXPORTING THE STORE AS JWKS
console.log('> JWKS:', JSON.stringify(store.toJSON(false), null, 2)) // `false` means only public keys exported
@renatoargh
Copy link
Author

Output:

> Public Key: {
  "kty": "RSA",
  "kid": "258df19c-f3bf-4f39-8829-a9adbd97d7d7",
  "use": "enc",
  "alg": "RSA-OAEP-256",
  "e": "AQAB",
  "n": "ynFwSkQSobRMeZ-1Z7zbTRLD-QxDfK8Ya7KkUlo9sGaZ0xXuQCL9SX2Nvua7nIX4NKld8t1u9QZZA3PZGAxmgML2tPcPjVGCBIOjPlrZpmNUB_aeNH9Ug7vrFUsEqMBOa69WYygGxHYbWM5rQqU0ylMlKQ5Z7lYSDsRKLwdtozjl5CDL9mre7qZWGqH1tK5PkdJECQph9tXrD3PYyKm1sFd6Dx7F5vJQt7bE0YXLd-tdJ1z6a_J7wnKl6O-ShZ3oKGC8qY0g9jxbBmtHD2wC6oXiY2aTn1Q92yQ191e-XjYghGd22DiLGvp8O4eBcB7e70l-j_ntNOkxXo3fvBLDWg4MaEpVpr6P5pjxQN9FWBMR9Yzz4cAM62oCGiKODiXe18y9L5jVkxzSkHv3Jg-oL6CsZnJjW5qcggp5Lgo3-OrZhcujxdCPUXu1ZafZ7sCP4kQmjwMeJqgBih_StV8derJkCGYy0jjC69oqTBiGCSDPs4VbPLCIT79xqjUgqjTn6ytnlqGNCDeEA_T0s4Dy2TjyKcq2AdC20HzIcyvmEAxjmbFibvHM0snOf7vem_tMq8nVNwW7IjG0j72eD3FdwPEfheDTLpZR88m1R3A04zx6cQs3GbjmO4Cz5911DGoQAea0K8tGnMDgSHJfMSIMRX-GEUpTpikxrZjx8JyD_C0",
  "expires_on": 1681421710
}
> public encrypted (compact): eyJlbmMiOiJBMTI4Q0JDLUhTMjU2IiwiYWxnIjoiUlNBLU9BRVAtMjU2Iiwia2lkIjoiMjU4ZGYxOWMtZjNiZi00ZjM5LTg4MjktYTlhZGJkOTdkN2Q3In0.Nz14X2ArlyrI3126DthqrxRXPx4ji2GXaFCpUPMomg9DBdvscWMfis6aX0zTBukifBPO4iI4JpeB84PwM3iEtc5_Ct8HgL7VmYSAWRmJnpvG6q3_SCC7SpQ7vApRRlPkz7hFB_rvTf2eu10eBi8qa5hhul7xTyc9B1-WNaD96fiYvfm-XpKExsYxnOL_JdXVrRkJdL5K6HcQ09zOPxEN64VEUF4CYArX52LqqlKQVQL2TpHvOsF5UjUaWNtrFCDG_VyFG4MUA2YuIRdMkCB9FiWr34UOqt8LzwNfDrYaw3FRueiKOxTJ8M7No2XvFZpZAVET8OxVeLn8qYDzlDpFlG-4l2PiaAWPF5_mMV5pug0eHmNtfzQRGHPKVcyY4WHMsBXNKp_ZQFG1gL4MwlXJv9H1M7XtDDDZArohK7LTkpnnh4VZpjgA_TeqlqMFG4wMyxAgB2_GjndlHjFa7AQx9kKRVU14RilWVQGpGEyBGePlvUVeCQsu0GrGWrknzjoEVYrwXF-LovIwJdtt8tXHnzX2HYAKamXUVgx0OD3-cp6wcXGqgvngL-HLL6aFxGT97m5eomchmGpj-Y4UXf_q52-5Q9JABFzMyvNLp7HE7OYCSL90iWK69OgAipEugW_rQ-dz3Y5ypq1NuNLaYSl_Tae5jXIwxQieTppffcIeXg4.sJ0VtWJyFwmHZ81HLqtZag.8IIS3WLUazLDQpi431bHSw.P-5Y6DWp-ccOs_dpaIsSig
> public decrypted: potato

> Public and Private Key: {
  "kty": "RSA",
  "kid": "258df19c-f3bf-4f39-8829-a9adbd97d7d7",
  "use": "enc",
  "alg": "RSA-OAEP-256",
  "e": "AQAB",
  "n": "ynFwSkQSobRMeZ-1Z7zbTRLD-QxDfK8Ya7KkUlo9sGaZ0xXuQCL9SX2Nvua7nIX4NKld8t1u9QZZA3PZGAxmgML2tPcPjVGCBIOjPlrZpmNUB_aeNH9Ug7vrFUsEqMBOa69WYygGxHYbWM5rQqU0ylMlKQ5Z7lYSDsRKLwdtozjl5CDL9mre7qZWGqH1tK5PkdJECQph9tXrD3PYyKm1sFd6Dx7F5vJQt7bE0YXLd-tdJ1z6a_J7wnKl6O-ShZ3oKGC8qY0g9jxbBmtHD2wC6oXiY2aTn1Q92yQ191e-XjYghGd22DiLGvp8O4eBcB7e70l-j_ntNOkxXo3fvBLDWg4MaEpVpr6P5pjxQN9FWBMR9Yzz4cAM62oCGiKODiXe18y9L5jVkxzSkHv3Jg-oL6CsZnJjW5qcggp5Lgo3-OrZhcujxdCPUXu1ZafZ7sCP4kQmjwMeJqgBih_StV8derJkCGYy0jjC69oqTBiGCSDPs4VbPLCIT79xqjUgqjTn6ytnlqGNCDeEA_T0s4Dy2TjyKcq2AdC20HzIcyvmEAxjmbFibvHM0snOf7vem_tMq8nVNwW7IjG0j72eD3FdwPEfheDTLpZR88m1R3A04zx6cQs3GbjmO4Cz5911DGoQAea0K8tGnMDgSHJfMSIMRX-GEUpTpikxrZjx8JyD_C0",
  "d": "cSpGhg1ViPU7xsVDZ9EHmicCS8bSNvG-Kf37o1l0oJZKKNhajZnBkwJPaUab25x8Khv_O5MSwn-g5LAuzCWqaxIRTQnKtMm6b4GSkHnCryNZRvZSa7A980Hp4MZFvXt6mvGxzc4DMnF_Sf5hsSiewPcHj9LI7NVKVNzfRzjUzegxgnve6EnHgwqSmWKt8il6q14p0A_wwUXFl6a_qTRNL11HCwq9wCL2giv2C9XJ7qgwM5_jENLE4eaq3fKGKpEhxOiGrhUJNvx4ObdgSrurSaQ78CrYHLm_ti-gxzpSXWHOfZVEtwusnxEkvzY5Yg6vun2P9TXVpr0wbtXKGt02O7KxjiPb6K19bSTBi1SS-UAc16j-ZEiE8iBXC90x4mOvp9YupY-1fn07bBNQgq_Wy1IjMx0psgRgkejRkN7_6C5n7GY-fjNvvsOT_tjxVvFNTh1_0JFuxjFwjGM5qfynD0oDAsxAmBuMODKTypzC1AF587WRNh3rkGPCMeC2w2MSGh5hta0R6S_q3hLhpOnMiBNZlApFCN9ZTQjwPzuF-nWct0_BtnM-yQwU8qikX-yJoVW8jTLE1sYq_ZVJbAqgM2I7X2ZbqL1nABkYXHvtYKrhVFNdOsteoOLaBpBPCEuJlds91DcdhkkOzszb3SWmkxkBKwO7lBfkdT4cg-5l6fU",
  "p": "96FqQQr2LkVGfG6fc6N2M7bo8QqRU4nYdAMceVNM74mK5bTE_3lNHtajpSr_0BSKJx73Xk8NTQYIqOFXxk_uaif-Pj0mV6r2I_9s9nvqAl9h9urOxpeunbCMKwc697Q-kGN2qO2o6jTn7-OaETulzwdsCPYC_prAtNvUkfEJEV5Z0yns4l54GHn2Fqsud2PpZOMW3uZOHM1DP8MUlyP5BlGu8UT7u-yQsPoEmxSLsGhQ7bfu5UUlSE36EJYMFxhghT9kU6cYtIxVOSTzpl_X7RjaK5GHPDDiTbPylwgISeHaD3v8EK5Xc7UmNJ2Uw4765OtxqcKFiwx64hWRyLlSzw",
  "q": "0UkL53-HMVjJDxTxDZ2bYqnsOLKOLuJwlQnT3XHLQbywY8F04C6UFVL6SRf7SNpupgpeM0KtDs_SSr1Qo7t-ALQGiNFNqnprZ8qjeCudrnxr2YBF-af23IF9KikkT7cGKkYULDpANH6oY8DJLq9dM_Ve3RgIY0grB2ih9LdBiDxkgBDbRzs1jYmuLavRudZ6tne-A0aphNAex5ojwIAqqZWjeJZTEQ4sX2hIacGY7wMIURW4qfe05t9tZyjjfqJUOXzgz5WYKbwT1Y04fB8KmHQFmSnUiDp45Iw-S7uBpsnD78NVFhpBhiA2dZzQD8e6UI8QxKtDYQhdgsvH7NuwQw",
  "dp": "WKp5SzTLlSHE7UUG3vcGmdnCapxoEMtor5F1npOPFq3fCATEDN24GXStP7S3yB-yn_Nci24uyweADkgxj5aLPYN4a3ylv_o9DAKnV1JjJdpVT34f78fcBCZ06es61_q39CdJE4-VTdcHvUN3pPgAlLKJomPECroKije0U1VE8-0eqJd4dE1zHwB8dv1wM9uYdEFDrSg1i-aLT8dgFgYRYovY4hbbNByuak_7WjPvGIkhgRy882bgxJT3Fv1C8voNhWh_WdyY4fzlfwKWI1pqDEE7zSHclFbEkSH_mMiNfzbZR3YTeT2TnqCcP3a1D5igiVssZaZ6_qDHVzB19LM2zQ",
  "dq": "ZBJCj_Ipyc3DbeO8k58eEqJfooi2dfKulIU7ejKUVx2LVlfFtABxrHSd2t-NtztDFz_z5RzntSJoUnaNnYzkZh-u1DMIqRCaVOnPGoH4httVko3EZ-kJoEyGdedwRnGkkAgsUy2TT8aUbAZd7GXL8jFMp_l64UY71PISJvqNakA-agIlZ70HEWOZFpuG0A6fZKqC__wEyM3fOeAZYk2mmKpFnT57_7bAPuqVXYRFxVu02VjCkPsx1AdXv7EMfpvOHCL7OCc2uBYHgeBh9u-82EL5_k_DIVScQ-RPUVUaXI8zkmzbPZNWa3TxtXFDB5igHS8bfH7L3BTs6cLZGQe_Ew",
  "qi": "J3iGlWmIGxX693V11XGEwTr1a0_n_HCXcDFccxO2gPfLVmM6TN-JG-iodrMiFt_KNuWTUFIkfjHOUqwvNorTZc21k-KXEIDa6hHa7PzHK58Mz5ilHWm6tLyP-PPQpTBsYW6vxNSbxtbQ13eV73bjF6y2-9im9-8fY5El7CJPHTzWd3n33QTxpGwzjO3MgySyOlchs4Uj_8S0U8XiIhRoztMiFiKpIj7NHp30zSvJBGLrGQLCU_quc_J7WR8ZOIux34bK8R8mtQMe3AdLEd2ju8Co07T0LsHEDQGXngEAXqae5DO7qz_UBAMAc6eoXxmzgs-oRotFMYVUn0_sS4cBiQ",
  "expires_on": 1681421710
}
> private encrypted (compact): eyJlbmMiOiJBMTI4Q0JDLUhTMjU2IiwiYWxnIjoiUlNBLU9BRVAtMjU2Iiwia2lkIjoiMjU4ZGYxOWMtZjNiZi00ZjM5LTg4MjktYTlhZGJkOTdkN2Q3In0.LEgoOtGU6Put324w2qnWItDWV3pk1QaDUmbWkxCTOVJsX4L72mcY7GszGjOK8VjOdXXarAN31e1nrPUlNhUeH2APIZsa4lYD80JjatbIzi6WLzbYIzliw9w0NayMbu9H-JA5NRE-twJYee-o2MiSlARsV96UYCqpGrtCKFhzahWt72-cwFn-nHrF4lOR70h7b5j8xC4fq8E7ZydXDL7HfXtt9a5BniE5jxqr9R_6tLaU84AmUsMOQ6Jw5T3aV9kMTBAYg-syMg_7kfmJRzScZq_6dOXwD7Z3wDliu8q8liUYdHWDLbvurvpTKNXP4TW4CRofpV_Xw62ZBN8I3PhgQqq0Q81w8YFhZgims4qRm4Frj33lFuWEfq8xOP73XdEJbfbgCCOVnpopEeK-2N_BOnGr3tXOH-bZBJwigsdLJEBEsiAYBwYtUd50ctkZeT1HVo9kbx1Xx7uGjCWXU_6Y80rad6zie-CLFjUy7XuBPiuznzuA5p0F9oggFq2JEWvLWt1fwfK89NGtZK5FxK0PAr4SVOd0253SzrVqbjgojI2uiD3R07zP7gBvqu0VVB07sD18JRPwdUwBUxV88RPt4H9-0yIMBxonRTsSdcGW5MNmUvgRcNgysLr1k0mDrRvaAJGN5Qng4mixcK7qFfo5CgDCgJd2-BJ7mLOL8agPcHY.gWGJ3rIAjStahELs_IqAVQ.p8cvozpZ1lYHRO5eJ-UOfw.u_LRxr2aCzLd11S55j7YQw
> private decrypted: potato

> JWKS: {
  "keys": [
    {
      "kty": "RSA",
      "kid": "258df19c-f3bf-4f39-8829-a9adbd97d7d7",
      "use": "enc",
      "alg": "RSA-OAEP-256",
      "e": "AQAB",
      "n": "ynFwSkQSobRMeZ-1Z7zbTRLD-QxDfK8Ya7KkUlo9sGaZ0xXuQCL9SX2Nvua7nIX4NKld8t1u9QZZA3PZGAxmgML2tPcPjVGCBIOjPlrZpmNUB_aeNH9Ug7vrFUsEqMBOa69WYygGxHYbWM5rQqU0ylMlKQ5Z7lYSDsRKLwdtozjl5CDL9mre7qZWGqH1tK5PkdJECQph9tXrD3PYyKm1sFd6Dx7F5vJQt7bE0YXLd-tdJ1z6a_J7wnKl6O-ShZ3oKGC8qY0g9jxbBmtHD2wC6oXiY2aTn1Q92yQ191e-XjYghGd22DiLGvp8O4eBcB7e70l-j_ntNOkxXo3fvBLDWg4MaEpVpr6P5pjxQN9FWBMR9Yzz4cAM62oCGiKODiXe18y9L5jVkxzSkHv3Jg-oL6CsZnJjW5qcggp5Lgo3-OrZhcujxdCPUXu1ZafZ7sCP4kQmjwMeJqgBih_StV8derJkCGYy0jjC69oqTBiGCSDPs4VbPLCIT79xqjUgqjTn6ytnlqGNCDeEA_T0s4Dy2TjyKcq2AdC20HzIcyvmEAxjmbFibvHM0snOf7vem_tMq8nVNwW7IjG0j72eD3FdwPEfheDTLpZR88m1R3A04zx6cQs3GbjmO4Cz5911DGoQAea0K8tGnMDgSHJfMSIMRX-GEUpTpikxrZjx8JyD_C0",
      "expires_on": 1681421710
    },
    {
      "kty": "RSA",
      "kid": "d955c2af-82e3-4e58-ae70-aa1afa8baf63",
      "use": "enc",
      "alg": "RSA-OAEP-256",
      "e": "AQAB",
      "n": "tzxmhBQZdlcal9eT3wQKs6SgQapQmDiUXYPln6j-0hf1dL2Qz2JpuBoqtlzqzHYoBbchZZee3tgfSfd70ULLIgJGnoD-mivlPS22ERNm9Q2L4m640dHUGaGnnwyHAV-XecYm_PmxA0UoxsvuK8LiJ2EwJ8hxwqXTzj1psuECj3T2O32db-eWIKeAz0-gPKJ6GUf6fnU2iYPBUxxyexPdNmfYQ9xkGNg6rQHpty6r5IbMxTF93ngPJCvgjJ_FB43G9uTELid_4gvd90-ngkgqjK3Bl8fNqbsbrwTkMExqC9LNcIbDkKmuZ5JROlPc7lLoe8IbekBJPOOw2FrNHgecpI5I3pWU5wX_xAdVrl_HE54g0y_SXwQrGLwmU1j94r9BlkJAuEamVt8acQ8daX7M8EhRPXQtZFFmgjh7oKvhNBqPzyXp7gxXAzJjvU9u8YDdZiGqvy9uG0658BoAKtZ1gjtGfVB9uP40xsYl2FFf09wMYIyCj7upi5q3-POFX12WQGwU413UNeJl5NIpyMfBY71V4MsPdC8szQc1jK0RhbON3WjT7UNcsFMBgDJn9ppMiUn8gMylooWvhsTGg-MQXALEhkSy-F0mPeceTw_AvNjWEYRKXdNgXtlsi5YevY-dI68FQ2Lw_SFRkfcXcDA80AFaCTL6ZhjKsclbXSp4NPc",
      "expires_on": 1681421710
    }
  ]
}

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment