web-dev-qa-db-fra.com

Cryptage et décryptage AES JavaScript (Advanced Encryption Standard)

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.

4
Mayur S

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

3
Mayur S
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>
4
user10153501

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))
2
Touffy

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

0
user10134933

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
0
ajimae