AES-GCM

AES-GCM（Advanced Encryption Standard - Galois/Counter Mode）は、データの機密性と完全性を同時に保護する暗号化アルゴリズムです。AWS Encryption SDKで使用可能なほか、AppleのCryptoKitフレームワークでもAES-GCMがサポートされています。また、FPGAやASICでの実装も可能で、高性能な暗号化ソリューションとして広く採用されています。

GCMは、対称鍵暗号ブロック暗号の動作モードとして、高速通信チャネルにおいて安価なハードウェアリソースで高いスループットを実現できます。これは、認証付き暗号化（AEAD）の一種であり、データの機密性と完全性を同時に提供します。

## AES-GCMの特徴

1. **暗号化キーの長さ**: AES-GCMは、256ビット、192ビット、128ビットの暗号化キーをサポートしています。

2. **初期化ベクトル（IV）**: 通常、12バイト（96ビット）の長さです。任意の長さのIVを受け入れることができます。

3. **認証タグ**: 16バイト（128ビット）の長さです。

4. **ペイロードとAAD**: GCMは、最大約64 GBまでの機密データの認証を保証し、実質的に無制限の長さの追加認証データ（AAD）を処理できます。

5. **暗号化と認証の同時処理**: AES-GCMは、暗号化と認証を同時に行うことができる認証付き暗号化（AEAD）方式です。

6. **高速処理**: FPGAやASICでの実装により、高いスループットを実現できます。さらに、ARM環境での最適化により、モバイルデバイスでのパフォーマンスも向上しています。


## AES-GCMの動作原理

1. **カウンターモード（CTR）**: AES-GCMは、AESブロック暗号をカウンターモードで使用します。これにより、ストリーム暗号のように動作し、任意の長さのメッセージを暗号化できます。

2. **Galoisフィールド乗算**: GCMは、暗号文とAADを使用してGaloisフィールド上で乗算を行い、認証タグを生成します。具体的には、GF(2^128)上での演算を使用します。

3. **GHASH関数**: この関数は、Galoisフィールド乗算を使用して、暗号文とAADから認証タグを計算します。

4. **初期化ベクトル（IV）の重要性**: IVは、同じキーを使用する場合でも、毎回異なる暗号文を生成するために使用されます。IVの再利用は深刻なセキュリティ上の問題を引き起こす可能性があるため、注意が必要です。


## AES-GCMの実装

AES-GCMは、ソフトウェアだけでなく、ハードウェアでも効率的に実装できます。FPGAやASICでの実装には、以下のような利点があります：

1. **高速処理**: ハードウェア実装により、ソフトウェア実装と比較して大幅に高速な暗号化・復号が可能です。

2. **低レイテンシ**: FPGAやASICでの実装は、低レイテンシの暗号化処理を実現します。

3. **並列処理**: ハードウェア実装では、複数のAES-GCM操作を並列に実行できます。

4. **電力効率**: 専用ハードウェアを使用することで、汎用プロセッサよりも電力効率が向上します。

5. **セキュリティ強化**: ハードウェア実装は、一部のサイドチャネル攻撃に対する耐性を向上させることができます。

## セキュリティ上の考慮事項

1. 適切なキー長の選択：アプリケーションのセキュリティ要件に応じて、128ビット、192ビット、または256ビットのキー長を選択します。
2. IVの再利用は絶対に避けるべきです。これは、同じキーとIVの組み合わせを使用すると、暗号文の XOR が平文の XOR になり、情報漏洩につながる可能性があるためです。
3. 認証タグの長さ：セキュリティを最大化するために、常に最大長（16バイト）の認証タグを使用することが推奨されます。
4. 実装の選択：スループットとリソース使用のバランスを考慮し、適切なIP coreバージョンを選択します。
5. ハードウェアアクセラレーション：可能な場合は、AES-NIやARMの暗号化命令セットなどのハードウェアアクセラレーションを使用して、サイドチャネル攻撃のリスクを軽減します。

## AES-GCMの批判的見解

一部の暗号専門家は、AES-GCMに対して批判的な見解を持っています。主な懸念点は以下の通りです：

1. **AESの脆弱性**: AESはS-Boxを使用しており、これがキャッシュタイミング攻撃に対して脆弱である可能性があります。

2. **GHASHの脆弱性**: GHASHの初期化方法が問題視されており、ノンス（一度だけ使用される数）の再利用によってHの値が漏洩し、永続的なメッセージ偽造が可能になる可能性があります。

3. **ブロックサイズの制限**: AESは256ビットキーを使用しても128ビットブロックサイズしか持たないため、一部の構築に制限があります。

4. **マルチユーザーセキュリティの懸念**: 多数のユーザーが同じAES-GCMを使用する場合、Hの再利用によるセキュリティリスクが懸念されています。

これらの批判は、AES-GCMの使用を完全に否定するものではありませんが、実装時には十分な注意が必要であることを示唆しています。

## 代替案の検討

AES-GCMの潜在的な問題点を考慮し、一部の専門家は以下のような代替案を提案しています：

1. **XChaCha20-Poly1305**: 長期キーでのメッセージ暗号化に適しており、ハードウェアアクセラレーションなしでも高速で定時実行が可能です。

2. **Gimli置換**: IoTなどの軽量暗号化に適しており、メッセージコミットメントプロトコルの構築が可能です。

3. **AES-GCM-SIV**: LINEのセキュリティR&Dチームが最適化を行ったこのアルゴリズムは、AES-GCMの一部の問題点を解決しつつ、高いパフォーマンスを維持することができます。最新の研究では、FPGAプラットフォーム上でAES-GCMとほぼ同等の性能を発揮することが示されています。

これらの代替案は、AES-GCMの一部の問題点を解決しつつ、高いセキュリティレベルを維持することができます。LINEのセキュリティR&Dチームが、ARM環境向けにAES-GCM-SIVアルゴリズムの最適化を行いました。これにより、サーバーサイドプロジェクトやLINEクライアント（AndroidとiOS）でのメッセージステッカー暗号化など、より広範な用途での使用が可能になったそうです。AES-GCM-SIVは、AES-GCMと比較して約95%のスループットを達成し、LUT数で約4%多くの面積を消費するだけで、ビットあたりのエネルギー消費も同程度でした。これにより、ノンス（一度だけ使用される数）誤用耐性という追加のセキュリティ利点を得ながら、AES-GCMの主要コンポーネントの再利用性も向上しています。

## 結論

AES-GCMは広く採用されており、適切に使用すれば十分なセキュリティを提供します。FPGAやASICでの実装、さらにはARM環境での最適化により、高速で効率的な暗号化ソリューションを実現できます。最新の研究では、AES-GCM-SIVがFPGAプラットフォーム上でAES-GCMとほぼ同等の性能を発揮しつつ、より高いセキュリティを提供できることが示されています。

しかし、その設計には一部の専門家から批判的な意見もあります。実装時には、これらの潜在的な問題点を認識し、適切な対策を講じることが重要です。また、アプリケーションの要件に応じて、XChaCha20-Poly1305、Gimli置換、AES-GCM-SIVなどの代替案も検討する価値があります。

暗号技術は常に進化しており、今後も新しい暗号化アルゴリズムや改良版が登場する可能性があります。セキュリティ専門家の意見を常に注視し、最新のベストプラクティスに従っていきたいですね。

## 参考文献
1. [Why AES-GCM Sucks](https://soatok.blog/2020/05/13/why-aes-gcm-sucks/) (アクセス日: 2024-08-19)
2. [CAST Inc. - AES-GCM Authenticated Encrypt/Decrypt Engine IP Core](https://www.cast-inc.com/security/encryption-primitives/aes-gcm) (アクセス日: 2024-08-19)
3. [FIPS 197, Advanced Encryption Standard (AES)](https://csrc.nist.gov/publications/detail/fips/197/final)
4. [AES test suite: The Advanced Encryption Standard Algorithm Validation Suite (AESAVS)](https://csrc.nist.gov/publications/detail/sp/800-38d/final)
5. [Apple Developer Documentation - AES.GCM](https://developer.apple.com/documentation/cryptokit/aes/gcm)
6. [PyCryptodome Documentation - AES](https://pycryptodome.readthedocs.io/en/latest/src/cipher/aes.html) (アクセス日: 2024-08-19)
7. [AWS CloudHSM User Guide - key wrap cloudhsm-aes-gcm](https://docs.aws.amazon.com/cloudhsm/latest/userguide/cloudhsm_cli-key-wrap-cloudhsm-aes-gcm.html) (アクセス日: 2024-08-19)
8. [AES GCM (Python)](https://asecuritysite.com/encryption/aes_gcm) (アクセス日: 2024-08-19)
9. [Intel IPP Crypto - AES-GCM Functions](https://www.intel.com/content/www/us/en/docs/ipp-crypto/developer-guide-reference/2021-9/aes-gcm-functions.html) (アクセス日: 2024-08-19)
10. [Xiphera - AES-GCM](https://xiphera.com/symmetric-encryption/aes-gcm/) (アクセス日: 2024-08-19)
11. [How we optimized the AES-GCM-SIV encryption algorithm](https://engineering.linecorp.com/en/blog/AES-GCM-SIV-optimization) (アクセス日: 2024-08-19)
12. [Galois/Counter Mode - Wikipedia](https://en.wikipedia.org/wiki/Galois/Counter_Mode) (アクセス日: 2024-08-19)
13. [Performance comparison of AES-GCM-SIV and AES-GCM algorithms for authenticated encryption on FPGA platforms](https://ieeexplore.ieee.org/abstract/document/8335570/) (アクセス日: 2024-08-19)