はじめに
Next.js で画像の暗号化と複合化を行う際に、AES-256-CFB から AES-128-CTR に変更したところ、処理速度が劇的に向上しました。本記事では、AES-256-CFB と AES-128-CTR の違いや、なぜ処理が速くなったのかを解説しつつ、実際の実装方法についても紹介します。
背景
API で受け取った暗号化データを指定された AES キーで複合化する処理を実装していたのですが実装したところ処理が非常に重く、複合化に時間がかかっていました。
ライブラリを変えてみたり、処理のフローを変えてみたりと、さまざまなアプローチを試しましたが、思うような改善が得られず...
最終的に、AES-256-CFB から AES-128-CTR に変更してみたところ、劇的に処理が高速化しました。このことについて備忘録として残しておきます。
そもそもAESとは?
AES(Advanced Encryption Standard)は、データを暗号化するための共通鍵暗号方式の一つであり、高速かつ強力な暗号アルゴリズムとして広く利用されています。AESには、複数の動作モードがあり、用途に応じて適切なモードを選択することが重要です。
⭐︎128ビットと256ビットの違い
おそらく複合化に時間がかかっていた原因はここでしたので⭐︎をつけました
256ビットで10枚の画像データを複合化するのに大体6秒かかってましたが
128ビットに変更することで0.5秒ほどに時間が短縮され驚愕しましたTT
AES には主に 128 ビット、192 ビット、256 ビットの鍵長があり、鍵の長さが長いほどセキュリティは強固になります。しかし、その分計算コストが増加します。
AES-128: 128 ビットの鍵を使用し、処理が高速。
AES-256: 256 ビットの鍵を使用し、より強固な暗号化が可能だが、計算負荷が高くなる。
AES-256 は鍵の長さが 2 倍ですが、暗号化・復号時に余計な計算が増え、処理が遅くなります。今回の変更では、セキュリティよりも処理速度の向上を優先し、AES-128 を採用しました。
CFB(Cipher Feedback)モードとは?
AES-CFB は、データを一つずつ暗号化していく仕組みを持っています。例えば、文章を暗号化するとき、最初の文字が暗号化されたら、その結果を使って次の文字を暗号化します。そのため、一つの暗号ブロックが前のブロックに影響を与えるため、処理を並行して実行するのが難しくなります。また、途中のデータが壊れてしまうと、それ以降のデータも解読できなくなる可能性があります。
CTR(Counter)モードとは?
AES-CTR は、データの暗号化を一つずつではなく、すべてのブロックを独立して処理します。具体的には、カウンター(番号のようなもの)を使い、各ブロックに異なる値を加えて暗号化します。この方法だと、一つのブロックが他のブロックに影響を与えないため、並列処理が可能になります。また、途中のデータが壊れても、影響を受けるのはその部分だけで、それ以降のデータには影響しません。そのため、CFBよりも高速に動作します。
おそらくここはそれほど影響はなかったのですがお守りとしてつけました。
AES-128とAES-256の使い分け
どういう時にどちらを選べばいいのかまとめてみたのでこちらも参考にしてみてください
AES-256が必要なケース
- 極めて機密性の高いデータ(例:政府機関、金融機関、医療データ)
- 将来的な暗号強度を考慮(量子コンピュータの発展を見据えて)
- 長期保存するデータ(長年にわたって安全を確保したい)
AES-128で十分なケース
- 画像や動画の暗号化
- リアルタイム処理が必要な場合(負荷を抑えたい)
- 一般的なWebアプリケーションでのデータ保護
- 転送時の一時的な暗号化(安全に転送後は解読する)
余談
AES-128を突破するには量子コンピュータを使って
ブルートフォース(総当たり攻撃の意味、かっこいい)を行う必要があるらしいです
突破された事例は今のところないみたいです
では、何通りの攻撃をする必要があるのか調べたところ下記でした
2^128 = 340澗2823溝6692穣938𥝱4634垓6337京4607兆4317億6821万1456
ちなみに256の方は下記。無量大数の単位、存在は知ってたけど初めてみました...。
2^256 = 無量大数892無量大数3731不可思議6195那由他4235阿僧祇7098恒河沙5008極6879載785正3269澗9846溝6564穣564𥝱394垓5758京4007兆9131億2963万9936
今回自分はある公式アニメのサイトを作成していて、漫画ビュワーのページにGCSに置いた画像を表示させるようにしていました。画像が保存されないよう対策として暗号化複合化を施したのですが、これをみると128でも十分すぎましたね。
余談の余談で量子コンピュータで総当たり攻撃するのにいくらの費用がかかるんだろうと気になって調べた結果
現時点では非常に高額であり、具体的な金額を明示することは難しいです。これは、量子コンピュータ技術がまだ発展途上であり、商業的に利用可能な大規模な量子コンピュータが存在しないためです。
量子暗号通信の研究開発に27.5億円を計上した例があり、少なくともそれ以上かかるといえます
27.5億円!?!?
そんなにかかるなら全部126bitでいいじゃん...?と思ったのですが
今後の技術発展のことも考えて生まれたのが256bitだそうです
なるほど、それならそれこそ国家機密とか、バレたら長期間莫大な損害を被る銀行や大企業の顧客情報にAES-256bitを使って安心したいのは納得かも?
今回は以上です
普段触れない領域のことを知れてよかったです
30億はたいて公式漫画の画像を保存しにくる猛者が来ないことを祈ります