今年の6月、ブロック暗号化の新しい標準がロシアで採用されました-GOST R 34.12-2015。 この標準には、古くからある「MOST」と呼ばれるGOST 28147-89に加えて、順列の固定セットがあり、ブロックコード「Grasshopper」の説明が含まれています。 この投稿で彼についてお話します。
GOST 28147-89とは異なり、新しいコードはFeistelネットワークではなく、いわゆる SPネットワーク:いくつかの同一のラウンドで構成される変換。各ラウンドは非線形変換と線形変換、およびキーマッピング操作で構成されます。 Feistelネットワークとは異なり、SPネットワークを使用する場合、入力ブロックは半分ではなく全体が変換されます。 このような構造はAESライク(AESに類似)とも呼ばれますが、後者とは異なり、Grasshopperには独自の「チップ」がいくつかあります。
- シフトレジスタを使用して線形変換を実装できます。
- キースキャンはFeistelネットワークを使用して実装されます。Feistelネットワークでは、元のアルゴリズムのラウンド変換が関数として使用されます。
入力バッタブロックは128ビット長で、キーは256ビット長です。
コンバージョン数
暗号化は、同じタイプのラウンドのいくつかを順番に使用することに基づいており、各ラウンドには、ラウンドキーによる加算、置換ブロックによる変換、線形変換の3つの変換が含まれます。
次のラウンドの128ビット入力ベクトルは、ラウンドキーを使用してビット単位で追加されます。

非線形変換とは、128ビットの固定置換入力ベクトルを各8ビットのサブベクトルに適用することです。

Grasshopperは、Stribogハッシュ関数と同じルックアップを使用します。
私が言ったように、線形変換は、通常のブロック暗号(マトリックス)だけでなく、RSLOS(16回移動する線形フィードバックシフトレジスタ)でも実装できます。

レジスタ自体は、8次の既約多項式を法とするガロア体上で実装されます。

:

ラウンド変換は次のように表現できます。

ラウンドキー生成
ここで、マスターキーからラウンドキーを生成する手順を検討します。 最初の2つは、マスターキーを半分に分割することによって取得されます。 次に、ラウンドキーの次のペアを生成するために、Feistelネットワークの8回の反復が使用されます。次に、アルゴリズムの線形変換を通過したカウンターシーケンスがラウンドキーとして使用されます。



キースイープラウンドは次のように表すことができます。

そして、ラウンドキーを生成するための全体の手順は次のとおりです。

暗号化と復号化
その結果、1つの128ビット入力ブロックの暗号化は次の式で記述されます。

また、ブロック図の形式では、次のように表すことができます。

復号化は、基本的な変換を元に戻し、逆の順序で適用することで実装されます。

参照資料
- 標準の初期の説明はここで利用可能です 。
- また、 参照実装をダウンロードすることもできます。
- さらに、Markku-Juhani Saarinenはgithubに独自の実装を持っています。