[インデックス 13044] ファイルの概要
このコミットは、Go言語のcrypto/aes
パッケージにおけるコメントと定数の修正に関するものです。具体的には、AES暗号化アルゴリズムの数学的基盤となる既約多項式の記述に誤りがあったため、それを訂正しています。
コミット
- コミットハッシュ:
36675daa0f417622ce94b14ccb8de169fa51f295
- 作者: Russ Cox rsc@golang.org
- コミット日時: Mon May 7 16:45:34 2012 -0400
- コミットメッセージ:
crypto/aes: fix comment Fixes #3589. R=golang-dev, iant CC=golang-dev https://golang.org/cl/6190044
GitHub上でのコミットページへのリンク
https://github.com/golang/go/commit/36675daa0f417622ce94b14ccb8de169fa51f295
元コミット内容
commit 36675daa0f417622ce94b14ccb8de169fa51f295
Author: Russ Cox <rsc@golang.org>
Date: Mon May 7 16:45:34 2012 -0400
crypto/aes: fix comment
Fixes #3589.
R=golang-dev, iant
CC=golang-dev
https://golang.org/cl/6190044
---
src/pkg/crypto/aes/const.go | 4 ++--
1 file changed, 2 insertions(+), 2 deletions(-)
diff --git a/src/pkg/crypto/aes/const.go b/src/pkg/crypto/aes/const.go
index f0b4eabf6e..aee73a7c52 100644
--- a/src/pkg/crypto/aes/const.go
+++ b/src/pkg/crypto/aes/const.go
@@ -11,11 +11,11 @@ package aes
// http://www.csrc.nist.gov/publications/fips/fips197/fips-197.pdf
// AES is based on the mathematical behavior of binary polynomials
-// (polynomials over GF(2)) modulo the irreducible polynomial x⁸ + x⁴ + x² + x + 1.
+// (polynomials over GF(2)) modulo the irreducible polynomial x⁸ + x⁴ + x³ + x + 1.
// Addition of these binary polynomials corresponds to binary xor.
// Reducing mod poly corresponds to binary xor with poly every
// time a 0x100 bit appears.
-const poly = 1<<8 | 1<<4 | 1<<3 | 1<<1 | 1<<0 // x⁸ + x⁴ + x² + x + 1
+const poly = 1<<8 | 1<<4 | 1<<3 | 1<<1 | 1<<0 // x⁸ + x⁴ + x³ + x + 1
// Powers of x mod poly in GF(2).
var powx = [16]byte{
変更の背景
このコミットは、Go言語の標準ライブラリであるcrypto/aes
パッケージ内のコメントと、それに付随する定数定義の誤りを修正することを目的としています。AES (Advanced Encryption Standard) は、有限体(ガロア体)上の多項式演算に基づいて構築されており、その中核となるのが特定の「既約多項式」です。
元のコードでは、この既約多項式がx⁸ + x⁴ + x² + x + 1
と記述されていましたが、これは誤りでした。正しいAESの既約多項式はx⁸ + x⁴ + x³ + x + 1
です。この誤りはコメントだけでなく、その多項式をビット演算で表現したpoly
定数のコメントにも影響していました。
この修正は、Go issue #3589で報告された問題に対応するものです。このような数学的な誤りは、コードの機能自体に直接的なバグを引き起こすものではない場合でも、ドキュメントの正確性や、将来のメンテナンス、あるいはアルゴリズムの理解において混乱を招く可能性があるため、非常に重要です。特に暗号ライブラリにおいては、仕様の正確な実装と記述が信頼性の基盤となります。
前提知識の解説
AES (Advanced Encryption Standard)
AESは、現在最も広く使用されている対称鍵ブロック暗号の一つです。米国標準技術研究所 (NIST) によってFIPS PUB 197として標準化されました。ブロック長は128ビットで、鍵長は128ビット、192ビット、256ビットのいずれかを選択できます。AESは、SPN (Substitution-Permutation Network) 構造に基づいており、複数のラウンドで構成されます。各ラウンドでは、バイト置換 (SubBytes)、行シフト (ShiftRows)、列混合 (MixColumns)、鍵加算 (AddRoundKey) の4つの基本的な変換が適用されます。
有限体 (Galois Field, GF)
有限体(ガロア体)は、要素の数が有限である体(四則演算が定義され、特定の性質を満たす代数構造)です。暗号学では、特にGF(2^n)の形の有限体が頻繁に用いられます。AESでは、GF(2^8)という有限体上で演算が行われます。
GF(2^8)の要素は、係数がGF(2)(つまり0または1)である7次以下の多項式として表現できます。例えば、x^7 + x^6 + x^5 + x^4 + x^3 + x^2 + x + 1
のような多項式です。GF(2)における加算は排他的論理和(XOR)に対応し、乗算は通常の多項式乗算を行った後、特定の「既約多項式」で割った余りを取ることで定義されます。
既約多項式 (Irreducible Polynomial)
既約多項式は、ある体(この場合はGF(2))上で、それ自身と定数以外の多項式の積として因数分解できない多項式のことです。有限体GF(2^n)を構成する際には、n次既約多項式を法(モジュロ)として多項式演算を行います。この既約多項式は、有限体における「素数」のような役割を果たし、演算結果が常に有限体内に収まることを保証します。
AESでは、GF(2^8)を構成するために、以下の8次既約多項式が使用されます。
m(x) = x⁸ + x⁴ + x³ + x + 1
この多項式は、AESのMixColumns変換やSubBytes変換の逆変換など、多くの内部演算の基盤となります。
技術的詳細
AESの数学的基盤は、GF(2^8)上の多項式演算にあります。この有限体は、GF(2)上の8次既約多項式 m(x) = x⁸ + x⁴ + x³ + x + 1
を法として構成されます。
src/pkg/crypto/aes/const.go
ファイル内のpoly
定数は、この既約多項式をビット列として表現したものです。
多項式 x⁸ + x⁴ + x³ + x + 1
をビット列で表現すると、各項の係数が1であるビット位置が1になります。
x⁸
は 2^8 = 256x⁴
は 2^4 = 16x³
は 2^3 = 8x¹
は 2^1 = 2x⁰
(定数項1) は 2^0 = 1
これらを合計すると、256 + 16 + 8 + 2 + 1 = 283
となります。
バイナリ表現では、100011011
となります。
Go言語のコードでは、これをビットシフト演算で表現しています。
1<<8 | 1<<4 | 1<<3 | 1<<1 | 1<<0
これは、それぞれのビット位置に1を立てることを意味し、結果として上記のバイナリ値(100011011)に対応します。
元のコードでは、コメントとpoly
定数のコメント部分で x²
(1<<2) が誤って含まれていました。
x⁸ + x⁴ + x² + x + 1
は 1<<8 | 1<<4 | 1<<2 | 1<<1 | 1<<0
に対応し、これは 256 + 16 + 4 + 2 + 1 = 279
となります。バイナリ表現では 100010111
です。
このコミットは、コメントと定数のコメント部分の両方で、x²
を x³
に修正することで、AESのFIPS 197標準で定義されている正しい既約多項式に合致させています。この修正は、コードの実行には影響しませんが、ドキュメントとしての正確性を保証し、AESの数学的基盤を正しく反映するために不可欠です。
コアとなるコードの変更箇所
diff --git a/src/pkg/crypto/aes/const.go b/src/pkg/crypto/aes/const.go
index f0b4eabf6e..aee73a7c52 100644
--- a/src/pkg/crypto/aes/const.go
+++ b/src/pkg/crypto/aes/const.go
@@ -11,11 +11,11 @@ package aes
// http://www.csrc.nist.gov/publications/fips/fips197/fips-197.pdf
// AES is based on the mathematical behavior of binary polynomials
-// (polynomials over GF(2)) modulo the irreducible polynomial x⁸ + x⁴ + x² + x + 1.
+// (polynomials over GF(2)) modulo the irreducible polynomial x⁸ + x⁴ + x³ + x + 1.
// Addition of these binary polynomials corresponds to binary xor.
// Reducing mod poly corresponds to binary xor with poly every
// time a 0x100 bit appears.
-const poly = 1<<8 | 1<<4 | 1<<3 | 1<<1 | 1<<0 // x⁸ + x⁴ + x² + x + 1
+const poly = 1<<8 | 1<<4 | 1<<3 | 1<<1 | 1<<0 // x⁸ + x⁴ + x³ + x + 1
// Powers of x mod poly in GF(2).
var powx = [16]byte{\
コアとなるコードの解説
変更はsrc/pkg/crypto/aes/const.go
ファイル内の2箇所にあります。
-
コメントの修正:
-// (polynomials over GF(2)) modulo the irreducible polynomial x⁸ + x⁴ + x² + x + 1. +// (polynomials over GF(2)) modulo the irreducible polynomial x⁸ + x⁴ + x³ + x + 1.
この行は、AESが使用する既約多項式を説明するコメントです。元のコメントでは
x²
の項が含まれていましたが、これがx³
に修正されました。これにより、コメントがFIPS 197で定義されている正しい既約多項式x⁸ + x⁴ + x³ + x + 1
を正確に反映するようになりました。 -
poly
定数のコメントの修正:-const poly = 1<<8 | 1<<4 | 1<<3 | 1<<1 | 1<<0 // x⁸ + x⁴ + x² + x + 1 +const poly = 1<<8 | 1<<4 | 1<<3 | 1<<1 | 1<<0 // x⁸ + x⁴ + x³ + x + 1
poly
定数自体の値1<<8 | 1<<4 | 1<<3 | 1<<1 | 1<<0
は変更されていません。この値は元々正しい既約多項式x⁸ + x⁴ + x³ + x + 1
をビット表現したものでした。しかし、その行の末尾にあるコメントが、誤った多項式x⁸ + x⁴ + x² + x + 1
を示していました。この修正により、poly
定数の値と、それを説明するコメントが一致するようになりました。
このコミットは、コードの動作に影響を与えるものではなく、あくまでドキュメンテーションの正確性を高めるための修正です。しかし、暗号ライブラリにおいては、このような数学的記述の正確性が非常に重要であり、信頼性確保の一環として行われました。
関連リンク
- Go issue #3589: https://github.com/golang/go/issues/3589
- Go CL 6190044: https://golang.org/cl/6190044
参考にした情報源リンク
- FIPS PUB 197 (Advanced Encryption Standard): https://www.csrc.nist.gov/publications/fips/fips197/fips-197.pdf
- 特に、セクション4.1 "The Bytes" およびセクション4.2 "The Polynomials" を参照。AESの数学的基盤、特にGF(2^8)の構成と既約多項式について詳細に記述されています。