🌿 [talks] Introdução Rápida a Criptografia Assimétrica
July 1, 2022•297 words
Versão textual da tech talk de introdução à criptografia assimétrica.
Conceitos
- Criptografia
- Criptografia Assimétrica
- Exemplos: Aplicativos de Mensagens
Ambiente
- Node.js >= 14 <= 18
- TypeScript
- Jest
Instruções podem ser encontradas aqui.
Demonstração
// src/AsymmetricCrypto.test.ts
import { AsymmetricCrypto } from "./AsymmetricCrypto"
/**
* Async-Await (ou callbacks)
* Node.js Event Loop
*/
it("should enable secure message exchange between Ana and Bob", async () => {
const asymmetricCrypto = new AsymmetricCrypto()
const anaKeys = await asymmetricCrypto.generateKeyPair()
const bobKeys = await asymmetricCrypto.generateKeyPair()
/**
* Aqui ocorreria a Exchange de Keys
* (Ana envia a publica para o Bob e vice-versa)
*/
// Ana envia mensagem para Bob
const cryptedMessage = asymmetricCrypto.encrypt("Hello", bobKeys.publicKey)
expect(cryptedMessage.toString()).not.toEqual("Hello")
// Bob recebe mensagem de Ana
const message = asymmetricCrypto.decrypt(cryptedMessage, bobKeys.privateKey)
expect(message.toString()).toEqual("Hello")
// Bob responde mensagem para Ana
const cryptedReply = asymmetricCrypto.encrypt("Hello, Ana", anaKeys.publicKey)
expect(cryptedReply.toString()).not.toEqual("Hello, Ana")
// Ana recebe a resposta de Bob
const reply = asymmetricCrypto.decrypt(cryptedReply, anaKeys.privateKey)
expect(reply.toString()).toEqual("Hello, Ana")
})
Implementação
// src/AsymmetricCrypto.ts
import { generateKeyPair as cryptoGenerateKeyPair, publicEncrypt, privateDecrypt } from "node:crypto"
import { promisify } from 'node:util'
export type KeyPair = {
privateKey: string
publicKey: string
}
export class AsymmetricCrypto {
public async generateKeyPair(): Promise<KeyPair> {
const { privateKey, publicKey } = await promisify(cryptoGenerateKeyPair)('rsa', {
modulusLength: 4096,
publicKeyEncoding: {
type: 'spki',
format: 'pem'
},
privateKeyEncoding: {
type: 'pkcs8',
format: 'pem'
}
})
return {
privateKey,
publicKey
}
}
public encrypt(message: string, recipientKey: string): Buffer {
return publicEncrypt(recipientKey, Buffer.from(message))
}
public decrypt(encryptedMessage: Buffer, privateKey: string): Buffer {
return privateDecrypt(privateKey, encryptedMessage)
}
}
Menções
🌿 Budding são ideias que já revisei ou editei um pouco. Estão começando a tomar forma, mas ainda precisam de refinamento. Saiba mais.