Comment implémenter le chiffrement et le déchiffrement en utilisant AES (Advanced Encryption Standard) en JavaScript.
Pourquoi AES (Advanced Encryption Standard)?
Sécurité: Les algorithmes concurrents devaient être jugés sur leur capacité à résister aux attaques, par rapport aux autres chiffres soumis, bien que la force de sécurité devait être considérée comme le facteur le plus important dans la compétition.
Coût: Destinés à être publiés sur une base globale, non exclusive et sans redevance, les algorithmes candidats devaient être évalués en termes d'efficacité de calcul et de mémoire.
AES est une méthode de cryptage et de décryptage très simple et puissante. Veuillez voir mon exemple ci-dessous qui sera très facile à utiliser dans votre code prêt.
Il suffit d'appeler encryptMessage
et decryptMessage
fnuction. J'ai déjà fourni l'exemple en cours d'exécution ci-dessous.
Comment appeler ces méthodes:
code.encryptMessage('Welcome to AES !','your_password');
code.decryptMessage('U2FsdGVkX1/S5oc9WgsNyZb8TJHsuL7+p4yArjEpOCYgDTUdkVxkmr+E+NdJmro9','your_password')
let code = (function(){
return{
encryptMessage: function(messageToencrypt = '', secretkey = ''){
var encryptedMessage = CryptoJS.AES.encrypt(messageToencrypt, secretkey);
return encryptedMessage.toString();
},
decryptMessage: function(encryptedMessage = '', secretkey = ''){
var decryptedBytes = CryptoJS.AES.decrypt(encryptedMessage, secretkey);
var decryptedMessage = decryptedBytes.toString(CryptoJS.enc.Utf8);
return decryptedMessage;
}
}
})();
console.log(code.encryptMessage('Welcome to AES !','your_password'));
console.log(code.decryptMessage('U2FsdGVkX1/S5oc9WgsNyZb8TJHsuL7+p4yArjEpOCYgDTUdkVxkmr+E+NdJmro9','your_password'))
<!DOCTYPE html>
<html>
<head>
<title>E2EE</title>
<script src="https://cdnjs.cloudflare.com/ajax/libs/crypto-js/3.1.2/rollups/aes.js"></script>
</head>
<body>
</body>
</html>
Vous pouvez également référencer mon référentiel de code github pour plus de références.
https://github.com/shedagemayur/JavaScriptCode/tree/master/AES
function encrypt(message = '', key = ''){
var message = CryptoJS.AES.encrypt(message, key);
return message.toString();
}
function decrypt(message = '', key = ''){
var code = CryptoJS.AES.decrypt(message, key);
var decryptedMessage = code.toString(CryptoJS.enc.Utf8);
return decryptedMessage;
}
console.log(encrypt('Hello World'));
console.log(decrypt('U2FsdGVkX1/0oPpnJ5S5XTELUonupdtYCdO91v+/SMs='))
<script src="https://cdnjs.cloudflare.com/ajax/libs/crypto-js/3.1.2/rollups/aes.js"></script>
Pourquoi voudriez-vous implémenter AES en JavaScript? ce serait extrêmement lent par rapport à une implémentation native (ou wasm). Heureusement, vous avez accès à ne implémentation native directement dans le navigateur (même IE11 si vous changez quelques choses). C'est très rapide (des centaines de fois plus rapide selon certains benchmarks publiés il y a quelque temps sur le blog Webkit ) et il ne nécessite pas de bibliothèques de 50kb.
Utilisation de GCM dans cet exemple mais vous pouvez utiliser le mode CTR si vous n'avez pas besoin de l'authentification:
const key = await crypto.subtle.generateKey({name: 'AES-GCM', length: 128}, true, ['encrypt', 'decrypt'])
const text = "confidential message"
// IV must be the same length (in bits) as the key
const iv = await crypto.getRandomValues(new Uint8Array(16))
const cyphertext = await crypto.subtle.encrypt({name: 'AES-GCM', tagLength: 32, iv}, key, new TextEncoder().encode(text))
Cela se traduira par cyphertext
contenant un ArrayBuffer avec la chaîne cryptée et une balise d'authentification de 4 octets (qui est spécifique à GCM, d'autres modes AES produiront simplement les données cryptées). Vous pouvez le déchiffrer tout aussi facilement, tant que vous avez la clé et l'IV utilisés pour le chiffrement.
const cleartext = await crypto.subtle.decrypt({name: 'AES-GCM', tagLength: 32, iv}, key, cyphertext)
console.log(new TextDecoder().decode(cleartext))
le code ci-dessous a été travaillé pour moi
encryptMessage: function(messageToencrypt = '', secretkey = ''){
var encryptedMessage = CryptoJS.AES.encrypt(messageToencrypt, secretkey);
return encryptedMessage.toString();
},
decryptMessage: function(encryptedMessage = '', secretkey = ''){
var decryptedBytes = CryptoJS.AES.decrypt(encryptedMessage, secretkey);
var decryptedMessage = decryptedBytes.toString(CryptoJS.enc.Utf8);
return decryptedMessage;
}
Merci
Si vous créez une application react ou nodejs, vous pouvez simplement utiliser cette bibliothèque ncrypt-js pour crypter et décrypter vos données.
Voir l'exemple sur codesandbox
usage:
es5
var ncrypt = require('ncrypt-js'); // or var { encrypt, decrypt } = require('ncrypt-js);
let encryptData = ncrypt.encrypt('super secret data', 'secret_key');
// or
// let encryptData = encrypt('super secret data', 'secret_key');
console.log(encryptData); // 11ab949601eb136f58ac3fe846e30d76.f9ce133b20adc35eef32af95957547abbb6fbfc5cb91cd14f5b0a088bd031883963cde1a56fd62fe2aeb75451a065d21
var decryptedData = ncrypt.decrypt(encryptData);
// or
// var decryptedData = decrypt(encryptData);
console.log(decryptedData); // super secret data
es6
import ncrypt from 'ncrypt-js'; // or import { encrypt, decrypt } from 'ncrypt-js';
const encryptData = ncrypt.encrypt('super secret data', 'secret_key');
// or
// const encryptData = encrypt('super secret data', 'secret_key');
console.log(encryptData); // 11ab949601eb136f58ac3fe846e30d76.f9ce133b20adc35eef32af95957547abbb6fbfc5cb91cd14f5b0a088bd031883963cde1a56fd62fe2aeb75451a065d21
const decryptedData = ncrypt.decrypt(encryptData);
// or
// const decryptedData = decrypt(encryptData);
console.log(decryptedData); // super secret data