web-dev-qa-db-ja.com

JavaScript AES暗号化および復号化(Advanced Encryption Standard)

JavaScriptでAES(Advanced Encryption Standard)を使用して暗号化と復号化を実装する方法。

なぜAES(Advanced Encryption Standard)なのですか?

セキュリティ:競合するアルゴリズムは、他の提出された暗号と比較して、攻撃に対抗する能力について判断されましたが、セキュリティの強さが競争で最も重要な要素と見なされました。

Cost:グローバルで非独占的でロイヤルティフリーのベースでリリースされることを目的としており、候補アルゴリズムは計算効率とメモリ効率を評価する必要がありました。

4
Mayur S

AESは非常にシンプルで強力な暗号化および復号化方法です。準備ができたコードで非常に使いやすい、以下の例を参照してください。

encryptMessageおよびdecryptMessage fnuctionを呼び出すだけです。以下の実行例はすでに提供しています。

これらのメソッドを呼び出す方法:

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>

詳細については、mygithubコードリポジトリを参照することもできます。

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

なぜJavaScriptにAESを実装したいのですか?ネイティブ(またはwasm)実装に比べて非常に遅くなります。幸い、あなたは ブラウザーのネイティブ実装の権利 にアクセスできます(いくつか変更した場合はIE11でも)。これは非常に高速で( Webkitブログにしばらく前に掲載されたいくつかのベンチマーク)によると数百倍高速です )、50kbのライブラリは必要ありません。

この例ではGCMを使用していますが、認証が不要な場合はCTRモードを使用できます。

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

その結果、cyphertextには、暗号化された文字列と4バイトの認証タグを含むArrayBufferが含まれます(GCMに固有で、他のAESモードは暗号化されたデータを生成するだけです)。暗号化に使用するキーとIVがあれば、簡単に復号化できます。

const cleartext = await crypto.subtle.decrypt({name: 'AES-GCM', tagLength: 32, iv}, key, cyphertext)
console.log(new TextDecoder().decode(cleartext))
2
Touffy

以下のコードは私のために働いた

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;
}

ありがとう

0
user10134933

Reactまたはnodejsアプリを構築している場合は、このライブラリ ncrypt-js を使用してデータを暗号化および復号化できます。

codesandboxの例を参照

使用法:

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