Skip to content

Instantly share code, notes, and snippets.

@EarlGeorge
Created May 28, 2021 17:20
Show Gist options
  • Save EarlGeorge/0893b3d4066d69d5911475b1922d5b1e to your computer and use it in GitHub Desktop.
Save EarlGeorge/0893b3d4066d69d5911475b1922d5b1e to your computer and use it in GitHub Desktop.
const crypto = require('crypto');
function decryptWithPrivateKey(privateKey, encryptedMessage) {
return crypto.privateDecrypt(privateKey, encryptedMessage);
}
function decryptWithPublicKey(publicKey, encryptedMessage) {
return crypto.publicDecrypt(publicKey, encryptedMessage);
}
module.exports.decryptWithPrivateKey = decryptWithPrivateKey;
module.exports.decryptWithPublicKey = decryptWithPublicKey;
const crypto = require('crypto');
function encryptWithPublicKey(publicKey, message) {
const bufferMessage = Buffer.from(message, 'utf8');
return crypto.publicEncrypt(publicKey, bufferMessage);
}
function encryptWithPrivateKey(privateKey, message) {
const bufferMessage = Buffer.from(message, 'utf8');
return crypto.privateEncrypt(privateKey, bufferMessage);
}
module.exports.encryptWithPublicKey = encryptWithPublicKey;
module.exports.encryptWithPrivateKey = encryptWithPrivateKey;
const crypto = require('crypto');
const fs = require('fs');
function genKeyPair() {
// Generates an object where the keys are stored in properties `privateKey` and `publicKey`
const keyPair = crypto.generateKeyPairSync('rsa', {
modulusLength: 4096, // bits - standard for RSA keys
publicKeyEncoding: {
type: 'pkcs1', // "Public Key Cryptography Standards 1"
format: 'pem' // Most common formatting choice
},
privateKeyEncoding: {
type: 'pkcs1', // "Public Key Cryptography Standards 1"
format: 'pem' // Most common formatting choice
}
});
// Create the public key file
fs.writeFileSync(__dirname + '/id_rsa_pub.pem', keyPair.publicKey);
// Create the private key file
fs.writeFileSync(__dirname + '/id_rsa_priv.pem', keyPair.privateKey);
}
// Generates the keypair
genKeyPair();
-----BEGIN RSA PRIVATE KEY-----
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
-----END RSA PRIVATE KEY-----
-----BEGIN RSA PUBLIC KEY-----
MIICCgKCAgEA2I24W1DFE0I2O8tcUfOHq44TJRgwcRzHcDFO20Y+OkQQxKpiUHVS
nBepCmCMrf8f/Qq+OQl1+6z3UsJUxjX6Yr/BUoPs5kOVhSvBJI3r3V6hX9GRAYyU
mAGCvpYs6ViyrtpUrIHVA1f+TLZmfxjtns4TwoWOQd06U+mA3mR2OoOhCQfgu2ts
ch1M6IUFmEFUz1aXudwyfclaRUm40eSSB0JGE64sQHCKjZScF/+yUJvamc0+cCeC
yR4aBbRcLNEsNS+1wx+F7IXWeJnK98cnK4TOD/tKQEaPP5WNmCo8GC5KwSKrl/lh
lPg2/mOayZQCAnAMqUtCMCp/YHC5xj6LfnQWLx5SuA8bTDR91biLkI2rcU6ZwQ9W
JevVIjrkzD8mRA5RKju0iiUmnAtD6ppB/qksIM27Tne9U8lEL7vQeAuC8RPqFD2F
dYry1m+NlFp7yPj7KCNW+w1Nz5CV+BO8ibfl21J/O06PhNiID5gIy7nBYe/g+Lg4
XmdQfsf4RwItbl+R5xZsUyKbrELtgghRE7xZq8/dU0x8QePBZ4zB6uM40omuH5I8
FZVorwdZ/KTJ1rh9UopipOGRBnilFSgt0oL1N5KHLs4DMht33NTW0KUFFA/XT7Ef
5uDXx5fmRjRt2VRxF1bnEw/iCC1gSaCc6IMaDITe+lbqPv6mpOJ5BOsCAwEAAQ==
-----END RSA PUBLIC KEY-----
const fs = require('fs');
const encrypt = require('./encrypt');
const decrypt = require('./decrypt');
const publicKey = fs.readFileSync(__dirname + '/id_rsa_pub.pem', 'utf8');
// Stores a Buffer object
const encryptedMessage = encrypt.encryptWithPublicKey(publicKey, 'Super secret message');
// If you try and "crack the code", you will just get gibberish
console.log(encryptedMessage.toString());
const privateKey = fs.readFileSync(__dirname + '/id_rsa_priv.pem', 'utf8');
const decryptedMessage = decrypt.decryptWithPrivateKey(privateKey, encryptedMessage);
// Convert the Buffer to a string and print the message!
console.log(decryptedMessage.toString());
const crypto = require('crypto')
const hash = crypto.createHash('sha256')
const fs = require('fs')
const encrypt = require('./encrypt')
const decrypt = require('./decrypt')
const data = {
firstName: 'George',
lastName: 'Davituri',
location: 'Tbilisi.Georgia',
socialSecurityNumber: 'Are you kidding? Never put sensitive information in digitally signed message \
since type of cryptography does not hide the data'
}
const dataString = JSON.stringify(data)
// Sets the value on the hash object!
hash.update(dataString)
// Hashed data in Hexidecimal format.
const hashedData = hash.digest('hex')
const senderPrivateKey = fs.readFileSync(__dirname + '/id_rsa_priv.pem', 'utf-8')
const signedMessage = encrypt.encryptWithPrivateKey(senderPrivateKey, hashedData)
const packageOfDataToSend = {
algorithm: 'sha256',
originalData: data,
signedAndEncryptedData: signedMessage
}
module.exports.packageOfDataToSend = packageOfDataToSend
const crypto = require('crypto')
const fs = require('fs')
const decrypt = require('./decrypt')
const receivedData = require('./signMessage').packageOfDataToSend
const hash = crypto.createHash(receivedData.algorithm)
const publicKey = fs.readFileSync(__dirname + '/id_rsa_pub.pem', 'utf-8')
// ReceivedData: Hash value
const decryptedMessage = decrypt.decryptWithPublicKey(publicKey, receivedData.signedAndEncryptedData)
const decryptedMessageHex = decryptedMessage.toString()
const hashOfOriginal = hash.update(JSON.stringify(receivedData.originalData))
const hashOfOriginalHex = hash.digest('hex')
if (hashOfOriginalHex === decryptedMessageHex) {
console.log('Success! The data has not been tampered with and the sender is valid')
} else {
console.log('Uh oh.. Someone is trying to manipulate the data or someone else is sending this!')
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment