diff --git a/samples/node/crypto/.vscode/launch.json b/samples/node/crypto/.vscode/launch.json index db14a4a..4cfc808 100644 --- a/samples/node/crypto/.vscode/launch.json +++ b/samples/node/crypto/.vscode/launch.json @@ -80,6 +80,26 @@ "externalConsole": false, "sourceMaps": false, "outDir": null + }, + { + "name": "Run rsa.js", + "type": "node", + "request": "launch", + "program": "${workspaceRoot}/rsa.js", + "stopOnEntry": false, + "args": [], + "cwd": "${workspaceRoot}", + "preLaunchTask": null, + "runtimeExecutable": null, + "runtimeArgs": [ + "--nolazy" + ], + "env": { + "NODE_ENV": "development" + }, + "externalConsole": false, + "sourceMaps": false, + "outDir": null } ] } \ No newline at end of file diff --git a/samples/node/crypto/rsa-key.pem b/samples/node/crypto/rsa-key.pem new file mode 100644 index 0000000..e471c46 --- /dev/null +++ b/samples/node/crypto/rsa-key.pem @@ -0,0 +1,30 @@ +-----BEGIN RSA PRIVATE KEY----- +Proc-Type: 4,ENCRYPTED +DEK-Info: AES-256-CBC,D7404CE12F8B7A5F5AAC950F4ED928DF + +J1rhNZQFt2qodd5GRqUj1dB/fuGJNcZhIGHg1lsimtWXmnhbUML+qez2P0Q1MuI1 +tOcAIO4neNMZRhvVYXfjL3Rze8gAdvCx/W5xAOU37WCYsCuOiY3dkA9rAd6y+oZt +sIPi5ubAfpr9AMqam3KE9JjcJTETHyE9nFgylulgucPgchTpuarApZf8IJsNuerW +3HhtYCTdfUPXU815JVQNXFJ2z0qNkX6cCTn9AVoY1b7Eao3XRBSDfXf2E/cvkm48 +gzfz2p248UE/C3DJTjhxfI3MX2OvykkyOWumUdcKt6GOUdyQSJ3EbpuClR2NOv3Z +8gBNsmz2nglGNE90+4IgaoMWr5Q6hZ17tqFXckJQAy8DKxC69+OygkhZMX8TF+rQ +Cut7i3cyra8u4J1Y7QwVqbKwnfQZ+bFSaH8LFQKNWW9EhzRMXEPhhFltp/mEuowe +itBjGOJgrfHsbRUOPAZ8zVXcqSn5bQCeQRZMcW8WKZ3zxnk5HZydgv6N+VXCSee9 +Vcq2f3H4Ub/mC0iubVu1e7rA/pNQBPlWCUYcoDdpNiHqbudZtbYvbqgcUNxTLWSp +okMil1GhKkOvHgCLAH6iCPdyBVsnCTfp53gxCRvJtD9XaLgBMCN4e3B2dMG16Dm5 +IrfRSocRgUYawhHqDGu6nn6tlNQc+B6ASwXvK9Pxq9Z+KM071p1D3UJJtXhB8wsU +qvCdjnPYxTKMChs979zWGq1YBtFnSWUjEFdHnm0ygpfFzu0d0LOSU0Kew7ygmWgH +QBr8I8cveHhAZuMyPn6HfJO/O1ILm7ecBCuLIHuOylUmLIQJPCZ8y7qUeWEnak/0 +Q4uxrzBGij9jHF2dY8r7e6M7pRlktD+LFATauG5A0U7oscMjxmGS2bYWdAXC52Dg +Enrl1ojdpdHACPDhwWE+CFXM0siR6SdkuwPsU/g1P7hwJctqCRKmpLfH1+4C6akD +u8+E9Ya3wXbiaLn/T4Hw9E9yMbuOUWnEyJMI+musxMeUhhm5lS6P7gPhTQT0YHXk ++p7stM3+5OQVTxNzFE5g3L61TXYTZwx6ITpFUDXroPsNnNTAXWwZFnxDj+MDPPqw +GDP1LK0nuA0FfNcrKvPX3pEI/EcrfoUZ6DtaCOU+AmyFsS7xSA6Ae+YjCol2Y7sC ++WaIpEZzAbvHrVFfWQdVpo9VURKxtud4ZaPf9mUYugLfqMv8mnwMk5N13WU9qOmn +i/9w/GB6Hl7QO7FOacLa3hxicl9N8a2o7pH9NUXx1Wt7APOXmbPSnXHAlk+G1+ex +nuCmBjRaHJjJ0sWo49lcUz+TjTSvNaYOzAJgi+EQdxEu6O5b4EPouBD+MYqY+lPZ +BjKFwPgLVB0XNyOatVZcoKalZnylzEoRo2WfLL0Blm1yglxsZPS1dUOOY6v0swJY +O6PaQiLm4rEcGFTfWiQ38KSEDi0Dwt2ddwr1O/27wF77R6L9uybToOgbe9SVOemT +/ldVF8/MpSJ3AhQTV4eDrXTLpCR35P1TkTPIdLvV6jklXNpY40Y3YB+Vurr8W8ZU +n1L5q0fUWs5DulUyxn1tRC3FRnrBw/bgpACz7GKewNP4Tf8xWtWwYYP6KHS4S5+4 +-----END RSA PRIVATE KEY----- diff --git a/samples/node/crypto/rsa-prv.pem b/samples/node/crypto/rsa-prv.pem new file mode 100644 index 0000000..2f04402 --- /dev/null +++ b/samples/node/crypto/rsa-prv.pem @@ -0,0 +1,27 @@ +-----BEGIN RSA PRIVATE KEY----- +MIIEowIBAAKCAQEAkutKlptlsXWe4od+se7M0I6xQ7CcKuN+B7LUmT3toMWTThXd +fEUjbtkZsQAd/NRw9kCSNkUqFoKHHe1YUEa+fhdjdL6rLRL+K9O3hV5EUHL6CykC ++UbjxQ4EOi7fScAv7f1g9jAD6vtI+Rml44uUzCMzhsoToRpYamebnaDLI28/hs7Z +VhdcbWX61XZnhhT2hmB4IeWSpRiNU4nyBtdCrFPS5Ad2m0HPrfqWnELvfw0sT6Hc +zhtefv9nFcJuqWTBanA0y6i8m5jjXOqO6J5S/qUgDVRcozt3GEAx0AgpGBRYGnXO +MEMNTsiYwsGrAw2VJxX9SjmYmE47XAFaTEYL9QIDAQABAoIBABqe/cXqZHPSTzbW +vFM7ZOtJX79XKgTvca+tbK5TtVITWsykU5yn3nLAbdJPph9g0xMbwiKJR8YKYrc+ +gWkSWIP6cu/9eIDTVzDTzQYifZhiLQKGrN5ERRM4pfVw9s6jP0wNRFt3ec5DOAbC +6fcgHJccrcJ3rTTc1DZ7jYvzTbuer4g35KX/iqtQ5C414oQE7nTri1+HGRIJwLgo +ipQQgsJwTRMiFNEG2EdyBPTQSxbiP3yMJeCwUeD072F9L8Vjqjj5yHDZAydm2R16 +jfvngwsSDHygwE+CQl8K9lPy2DN5yuRSQuZzSY61Uf+BrboUN5xJILQ8jvGzSpK6 +t9BNCUUCgYEAw7aUDhqut3yGqPNSD6F10TlMURzJxTgiX90q/BXIZaVqaoh0Duv7 +19n4zSHEZIeDzxb5jSir0aJ3zs9ScFPYL4M43lP1tICmF9GQhn04N4wYq8g6Y6U2 +LV+ci8OlI/sv4u9lRLVMJHYNZZSAR65/tnEfBb8moJUO7ES/upcJfb8CgYEAwCzw +5XLlCl+2ARUJ61RePwXZ9hqBZFP1UgxM7CQrfv4X4Bo6/0cG0YN10xNKkZ/f+cz7 +0TZzkb/Gg9nGAP60WkUfSq7xRO7GuDivLTV+UV9swIb0qECZyAW+oZD20VLqqI9O +NZrSsS8o1AGdsaJAAnFlCrNLo/75SHNYa5+pC0sCgYAorex8OgOS0+lReLHX2eGZ +SWWZfnhZ698JOflTSFvM9OL3ncEx0M8aAI58ZMZjdt9ozge01X1RJ4nrjKBABM1s +osPRQnZRvGPJk5+MtL5YnWALZKTuTUrDh5oMWvAaWH2Nl+DetShMc9U5BfLb82NM +Upr2INMwkYr2hRus9vPcFQKBgQCmHbLWA6zsfLNM2CzM2Q7ml15DF8JFQTXLiIpt +jQ50JZvpwYLB61l/fY05uXE50+K9gW0i+ViI4ibtDi/T6FdpuFpGKlav6V6pG4aB +I75fBIdzHLUbQ0wq1Jxl+HMBmhTxQ36tY3lAY619JTB0vfVqpy5aQ4Xc6qf88oe5 +8DclZQKBgGUSimhD1NCcslkIBUzE1UFT3Y5LJBoVSRXUr/n60Np30+SIH/6kU2Qw +MXgxC7sod22uV/rehIZggaPJXPn6c1BJBAw04tvOKu3YUeFngjuE9ZUzQJ8IHxvD +PI3jkHqJBV3xba1eqHCA2SOJ3s5EZHOHCOnZQLePBVUTfYLPSaPt +-----END RSA PRIVATE KEY----- diff --git a/samples/node/crypto/rsa-pub.pem b/samples/node/crypto/rsa-pub.pem new file mode 100644 index 0000000..8d4540c --- /dev/null +++ b/samples/node/crypto/rsa-pub.pem @@ -0,0 +1,9 @@ +-----BEGIN PUBLIC KEY----- +MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAkutKlptlsXWe4od+se7M +0I6xQ7CcKuN+B7LUmT3toMWTThXdfEUjbtkZsQAd/NRw9kCSNkUqFoKHHe1YUEa+ +fhdjdL6rLRL+K9O3hV5EUHL6CykC+UbjxQ4EOi7fScAv7f1g9jAD6vtI+Rml44uU +zCMzhsoToRpYamebnaDLI28/hs7ZVhdcbWX61XZnhhT2hmB4IeWSpRiNU4nyBtdC +rFPS5Ad2m0HPrfqWnELvfw0sT6Hczhtefv9nFcJuqWTBanA0y6i8m5jjXOqO6J5S +/qUgDVRcozt3GEAx0AgpGBRYGnXOMEMNTsiYwsGrAw2VJxX9SjmYmE47XAFaTEYL +9QIDAQAB +-----END PUBLIC KEY----- diff --git a/samples/node/crypto/rsa.js b/samples/node/crypto/rsa.js new file mode 100644 index 0000000..310efaa --- /dev/null +++ b/samples/node/crypto/rsa.js @@ -0,0 +1,45 @@ +/** + * HOW TO GENERATE RSA KEY + * + * 1. generate RSA keypair: + * + * $ openssl genrsa -aes256 -out rsa-key.pem 2048 + * (enter password to protect the RSA key) + * + * 2. export private key: + * + * $ openssl rsa -in rsa-key.pem -outform PEM -out rsa-prv.pem + * (enter password) + * + * 3. export public key: + * + * $ openssl rsa -in rsa-key.pem -outform PEM -pubout -out rsa-pub.pem + * (enter password) + */ + +const + fs = require('fs'), + crypto = require('crypto'); + +function loadKey(file) { + return fs.readFileSync(file, 'utf8'); +} + +let + prvKey = loadKey('./rsa-prv.pem'), + pubKey = loadKey('./rsa-pub.pem'), + message = 'Hello, world!'; + +// encrypt by private key, then decrypt by public key: +let enc_by_prv = crypto.privateEncrypt(prvKey, Buffer.from(message, 'utf8')); +console.log('encrypted by private key: ' + enc_by_prv.toString('hex')); + +let dec_by_pub = crypto.publicDecrypt(pubKey, enc_by_prv); +console.log('decrypted by public key: ' + dec_by_pub.toString('utf8')); + +// encrypt by public key, then decrypt by private key: +let enc_by_pub = crypto.publicEncrypt(pubKey, Buffer.from(message, 'utf8')); +console.log('encrypted by public key: ' + enc_by_pub.toString('hex')); + +let dec_by_prv = crypto.privateDecrypt(prvKey, enc_by_pub); +console.log('decrypted by private key: ' + dec_by_prv.toString('utf8'));