はじめに
情報セキュリティを勉強しており、AES暗号化の基礎について書いてみようと思います。
とはいえ、このページにたどり着く人は、とりあえず暗号化できる方法を知りたい人かと思うので、ちゃちゃっとやり方を記載することにします。
本来であれば、暗号化のオプションの指定もありますが、ここでは初級編としてとりあえず、動く最低限だけ記載しておきます。
AESとは
- Advanced Encryption Standard
- 現在(2020年)のアメリカで採用・標準化されている暗号化方式
- 暗号時と復号時に同じ暗号鍵(パスフレーズ)を使う、共通化暗号方式の1つです。
なんてことはないですね。
データをパスフレーズで暗号化/復号化するだけです。
暗号化されたデータが漏れてしまっても、暗号鍵がわからなければただのゴミデータですねぇ。
当然、クラッカーの方々は、暗号鍵を狙ってくるわけですけどね。
サンプル
テスト環境
- OS: Windows 10 Home
- ブラウザ: Firefox 75.0 / Chrome81.0.4044.129 (64bit)
使用モジュール
- crypt-js (4.0.0)
今回は、古くからオープンソースで使われているモジュールを使おうと思います。
cdnjs にもあるので、そのまま参照することにします。
ソースコード
とりあえず、すぐに試せるように、html として記載しておきます。ソースコードエリアを copy して、html ファイルとして保存してもらえれば動作します。
- 動作確認:2020-05-03
<!DOCTYPE html>
<html lang="ja">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>[プログラム] AES 暗号化</title>
<style> input { width: 500px; } </style>
<script src="https://cdnjs.cloudflare.com/ajax/libs/crypto-js/4.0.0/crypto-js.min.js"></script>
</head>
<body>
<p>
<input type="text" name="data" id="data" placeholder="" value="Hello World!">
<label for="">データ / Data</label>
</p>
<p>
<input type="text" name="pass_phrase" id="pass_phrase" value="0123456789ABCDEF0123456789ABCDEF">
<label for="">パスフレーズ / Path Phrase</label>
</p>
<p>
<input type="submit" id="execute" value="実行">
</p>
<div id="output"></div>
<script>
window.onload = () => {
let buttonExecute = document.getElementById('execute')
buttonExecute.addEventListener('click', () => {
execute()
});
}
function execute () {
// パスフレーズ(暗号鍵)
let passPhrase = document.getElementById('pass_phrase').value;
// 暗号化したい元のデータ
let data = document.getElementById('data').value;
let utf8_plain = CryptoJS.enc.Utf8.parse(data);
// 暗号化
let encrypted = CryptoJS.AES.encrypt( utf8_plain, passPhrase );
// 復号化
let decrypted = CryptoJS.AES.decrypt( encrypted , passPhrase );
let txt_dexrypted = decrypted.toString(CryptoJS.enc.Utf8);
// 表示
document.getElementById("output").innerHTML =
"key : " + passPhrase +"<br />" +
"data : " + data + "<br />" +
"encrypted : " + encrypted + "<br />" +
"decrypted : " + txt_dexrypted;
}
</script>
</body>
</html>
解説
(8行目)モジュールの読み込み
<script src="https://cdnjs.cloudflare.com/ajax/libs/crypto-js/4.0.0/crypto-js.min.js"></script>
AES暗号化のための、 javascript モジュールは「crypto-js」を使いました。
CDNから、直接読み込んでます。
(34~35行目)パスフレーズ
// パスフレーズ(暗号鍵)
let passPhrase = document.getElementById('pass_phrase').value;
(36~38行目)暗号化したいデータ
// 暗号化したい元のデータ
let data = document.getElementById('data').value;
let utf8_plain = CryptoJS.enc.Utf8.parse(data);
今時は、UFT-8で統一しておいたほうが便利なので UTF-8 に変換しています。
(39~40行目)暗号化
// 暗号化
let encrypted = CryptoJS.AES.encrypt( utf8_plain, passPhrase );
実行結果は、base64 でエンコードされた文字列です。
(41~43行目)復号化
// 復号化
let decrypted = CryptoJS.AES.decrypt( encrypted , passPhrase );
let txt_dexrypted = decrypted.toString(CryptoJS.enc.Utf8);
暗号化されたデータを、復号化します。復号化直後のデータはバイナリなので UTF-8 で元の文字列に変更しています。


コメント