RC5
RFC 2040 The RC5, RC5-CBC, RC5-CBC-Pad, and RC5-CTS Algorithms
ブロック暗号
keyが0byteから
word長16bit, 32bit, 64bit用に32bit, 64bit, 128bit のがあるのであまり使われなかったかもしれない
RFC 2040
RC5、RC5-CBC、RC5-CBC-Pad、およびRC5-CTSアルゴリズム
このメモのステータス
このメモはインターネットコミュニティ向けの情報を提供します。このメモは、いかなる種類のインターネット標準も規定するものではありません。このメモの配布は無制限です。
謝辞
有益なご提案をいただいたSteve Dusse、Victor Chang、Tim Mathews、Brett Howard、Burt Kaliskiに感謝いたします。
1. 概要
この文書では、異なる実装間の相互運用性を確保するために十分な詳細さをもって、4つの暗号を定義します。最初の暗号は、生のRC5ブロック暗号です。RC5暗号は、固定サイズの入力ブロックを受け取り、鍵に依存する変換を用いて固定サイズの出力ブロックを生成します。2番目の暗号であるRC5-CBCは、RC5の暗号ブロック連鎖(CBC)モードです。RC5ブロックサイズの倍数の長さのメッセージを処理できます。3番目の暗号であるRC5-CBC-Padは、任意の長さの平文を処理しますが、暗号文は平文よりも最大で1つのRC5ブロック分長くなります。
RC5-CTS暗号は、RC5の暗号文窃盗(Cipher Text Stealing)モードで、任意の長さの平文を処理し、暗号文の長さは平文の長さと一致します。
RC5暗号は、マサチューセッツ工科大学のロナルド・L・リベスト教授によって1994年に発明されました。ブロックサイズ、ラウンド数、鍵長によってパラメータ化された、非常に高速でシンプルなアルゴリズムです。これらのパラメータは、セキュリティ、パフォーマンス、そして輸出可能性といった様々な目標に合わせて調整可能です。
RSA Data Security Incorporatedは、RC5暗号に関する特許出願と、RC5、RC5-CBC、RC5-CBC-Pad、RC5-CTS、および各種の派生暗号の商標保護を申請しています。
2. 概要
このメモは、既存の出版物を再述したものです。RC5の説明は、Rivest教授によるオリジナルのRC5論文2の表記法と説明順序に従っています。CBCモードは、Bruce Schneier著6などの参考文献に記載されています。CBC-Padモードは、公開鍵暗号標準(PKCS )第5版PKCS #5と同じです。サンプルCコード8は、説明を分かりやすくするためにのみ記載されており、英語の説明と同等です。
暗号は、ボトムアップ型のオブジェクト指向方式で説明します。まず、RC5鍵と鍵拡張アルゴリズムを示します。次に、RC5ブロック暗号について説明し、最後にRC5-CBC暗号とRC5-CBC-Pad暗号について規定します。簡潔にするため、暗号化プロセスのみを説明します。復号は、暗号化の手順を逆に実行することで実現します。
ここで紹介するオブジェクト指向的な説明は、相互運用可能なシステムの実装を容易にするはずですが、参考文献に記載されている機能説明ほど簡潔ではありません。オブジェクトには、鍵と暗号アルゴリズムという2つのクラスがあります。どちらのクラスも、秘密情報がメモリマネージャに返されないようオブジェクトを作成および破棄する操作を共有しています。
鍵には、秘密鍵をオブジェクトにコピーする「set」操作もあります。暗号オブジェクトの「set」操作は、ラウンド数と初期化ベクトルを定義します。
このメモでは、暗号オブジェクトの4つの操作について説明しています。鍵を暗号オブジェクトにバインドする操作、鍵を変更せずに暗号オブジェクトの新しい初期化ベクトルを設定する操作、メッセージの一部を暗号化する操作(長いメッセージの場合は複数回実行される)、そしてメッセージの最後の部分を処理する操作です。
パディングを追加したり、メッセージの長さをチェックしたりする操作です。
まとめると、暗号は以下の操作に基づいて説明されます。
RC5_Key_Create - 鍵オブジェクトを作成する。
RC5_Key_Destroy - 鍵オブジェクトを破棄します。
RC5_Key_Set - ユーザー鍵を鍵オブジェクトにバインドします。
RC5_CBC_Create - 暗号オブジェクトを作成します。
RC5_CBC_Destroy - 暗号オブジェクトを破棄します。
RC5_CBC_Encrypt_Init - 鍵オブジェクトを暗号オブジェクトにバインドします。
RC5_CBC_SetIV - 鍵を変更せずに新しいIVを設定します。
RC5_CBC_Encrypt_Update - メッセージの一部を処理します。
RC5_CBC_Encrypt_Final - メッセージの末尾を処理します。
3. 用語と表記
「ワード」とは、特定の長さのビット列を指し、符号なし整数またはビットベクトルとして演算できます。例えば、「ワード」は、RC5暗号のブロックサイズに応じて32ビットまたは64ビット長になります。32ビットのワードは64ビットのブロックサイズになります。最高のパフォーマンスを得るには、RC5のワードサイズをCPUのレジスタサイズと一致させる必要があります。「バイト」とは8ビットを指します。
以下の変数は、このメモ全体で以下の意味で使用されます。
W RC5のワードサイズ(ビット単位)。ブロックサイズの半分です。このメモで扱うワードサイズは32と64です。
WW RC5のワードサイズ(バイト単位)。
B RC5のブロックサイズ(ビット単位)。ワードサイズの2倍です。 RC5 を 64 ビットブロック暗号として使用する場合、B は 64、W は 32 です。0 < B < 257 です。サンプルコードでは、B は暗号システムパラメータではなく変数として使用されていますが、文脈からこの使用法は明らかです。
BB RC5 のブロックサイズ(バイト単位)です。BB = B / 8 です。
b 秘密鍵のバイト長です。0 <= b < 256 です。
K 秘密鍵は、K[0], ..., K[b-1] でインデックス付けされた b バイトのシーケンスとして扱われます。
R RC5 内部変換のラウンド数です。
0 <= R < 256 です。
T 拡張鍵テーブル内のワード数です。常に 2*(R + 1) です。 1 < T < 513。
S これは拡張鍵テーブルであり、S[0], ..., S[T-1] でインデックスされたワード列として扱われます。
N これは平文メッセージのバイト長です。
P これは平文メッセージであり、P[0], ..., P[N-1] でインデックスされたNバイト列として扱われます。
C これは暗号文出力であり、C[0], C[1], ... でインデックスされたバイト列として扱われます。
I これはCBCモードの初期化ベクトルであり、I[0], ..., I[BB-1] でインデックスされたバイト列として扱われます。
4. RC5 鍵の説明
ほとんどのブロック暗号と同様に、RC5 は小さなユーザー鍵を内部鍵のテーブルに展開します。ユーザー鍵のバイト長は暗号のパラメータの 1 つであるため、RC5 ユーザー鍵オブジェクトは可変長の鍵を保持できる必要があります。C 言語で可能な構造体は以下のとおりです。
code:key object
/* RC5 ユーザー鍵オブジェクトの定義 */
typedef struct rc5UserKey
{
int keyLength; /* バイト単位 */
unsigned char *keyBytes;
} rc5UserKey;
鍵に対する基本的な操作は、作成、破棄、および設定です。鍵のデータがアプリケーションの他の部分に公開されるのを防ぐため、破棄操作では、鍵をメモリマネージャに解放する前に、その鍵に割り当てられたメモリをゼロクリアします。一般的な鍵オブジェクトは、新しいランダム鍵の生成や鍵合意情報からの鍵の導出など、他の操作をサポートする場合があります。