From 1ab5255bfa2aff83774132965842e357eb8494e4 Mon Sep 17 00:00:00 2001 From: Tykayn Date: Tue, 9 Feb 2021 18:26:13 +0100 Subject: [PATCH] use crypto lib --- .../ciphering/ciphering.component.ts | 65 ++++++++++++------- 1 file changed, 42 insertions(+), 23 deletions(-) diff --git a/src/app/features/shared/components/ui/static-pages/ciphering/ciphering.component.ts b/src/app/features/shared/components/ui/static-pages/ciphering/ciphering.component.ts index 9c723664..faa3a095 100644 --- a/src/app/features/shared/components/ui/static-pages/ciphering/ciphering.component.ts +++ b/src/app/features/shared/components/ui/static-pages/ciphering/ciphering.component.ts @@ -1,17 +1,21 @@ import { Component, OnInit } from '@angular/core'; - -const forge = require('node-forge'); - +// eslint-disable-next-line @typescript-eslint/no-var-requires +const crypto = require('crypto'); +// documentation: +// https://medium.com/@spatocode/symmetric-encryption-in-javascript-bcb5fd14c273 +// https://nodejs.org/api/crypto.html @Component({ selector: 'app-ciphering', templateUrl: './ciphering.component.html', styleUrls: ['./ciphering.component.scss'], }) export class CipheringComponent implements OnInit { - public plainText = 'le texte à chiffrer'; + public plainText = 'le texte à chiffrer, coucou !'; public cipheredText = ''; - public salt = forge.random.getBytesSync(128); - public key = forge.random.getBytesSync(128); + algorithm = 'aes-192-cbc'; + public salt = crypto.randomBytes(16); + public initial_vector = crypto.randomBytes(16); + public key = ''; public otherCipheredText: any; constructor() {} @@ -21,27 +25,42 @@ export class CipheringComponent implements OnInit { } encrypt(someText) { - // generate a random key and IV - // Note: a key size of 16 bytes will use AES-128, 24 => AES-192, 32 => AES-256 - // const key = forge.random.getBytesSync(16); - // const iv = forge.random.getBytesSync(16); + this.key = crypto.scryptSync(someText, 'salt', 24); + this.initial_vector = crypto.randomBytes(16); - /* alternatively, generate a password-based 16-byte key - var salt = forge.random.getBytesSync(128); - var key = forge.pkcs5.pbkdf2('password', salt, numIterations, 16); - */ + const cipher = crypto.createCipheriv(this.algorithm, this.key, this.initial_vector); + + cipher.on('readable', () => { + this.cipheredText = cipher.read().toString('hex'); + console.log(cipher.read().toString('hex')); + }); + + let output = ''; - // encrypt some bytes using CBC mode - // (other modes include: ECB, CFB, OFB, CTR, and GCM) - // Note: CBC and ECB modes use PKCS#7 padding as default - // const cipher = forge.cipher.createCipher('AES-CBC', this.key); - // cipher.start({ iv: this.salt }); - // cipher.update(forge.util.createBuffer(someText)); - // cipher.finish(); - // const encrypted = cipher.output; - // this.cipheredText = encrypted.toHex(); this.cipheredText = someText; // outputs encrypted hex console.log(this.cipheredText); } + + decrypt(sometext) { + const decipher = crypto.createDecipheriv(this.algorithm, this.key, this.initial_vector); + + decipher.on('readable', () => { + this.otherCipheredText = decipher.read().toString('utf8'); + + console.log('otherCipheredText decrypt', this.otherCipheredText); + }); + + decipher.write(sometext, 'hex'); + decipher.end(); + } + + convertTextToInt(someText) { + let output = ''; + + for (let i = 0; i < someText.length; i++) { + output += someText[i].charCodeAt(0); + } + return output; + } }