📄 rfcrfc2040.txt
字号:
组织:中国互动出版网(http://www.china-pub.com/)
RFC文档中文翻译计划(http://www.china-pub.com/compters/emook/aboutemook.htm)
E-mail:ouyang@china-pub.com
译者:金凤(phoenix_jin take.a.bow@263.net)
译文发布时间:2001-9-10
版权:本中文翻译文档版权归中国互动出版网所有。可以用于非商业用途自由转载,但必须
保留本文档的翻译及版权信息。
Network Working Group R. Baldwin
Request for Comments: 2040 RSA Data Security, Inc.
Category: Informational R. Rivest
MIT Laboratory for Computer Science
and RSA Data Security, Inc.
October 1996
RC5,RC5-CBC,RC5-CBC-PAD和RC5-CTS算法
( RFC2040 ——The RC5, RC5-CBC, RC5-CBC-Pad, and RC5-CTS Algorithms )
本备忘录的状态
本文档讲述了一种Internet社区的Internet标准跟踪协议,它需要进一步进行讨论和建
议以得到改进。请参考最新版的“Internet正式协议标准” (STD1)来获得本协议的标准化
程度和状态。本备忘录的发布不受任何限制。
版权声明
Copyright (C) The Internet Society (2001).
目录
1.实现概述 2
2.总览 3
3.术语和符号 3
4. RC5密钥的描述 4
4.1 创建一个RC5密钥 4
4.2 销毁一个RC5密钥 5
4.3 设置一个RC5密钥 5
5.设置一个RC5密钥 6
5.1 初始常量定义 7
5.2 接口定义 7
5.3 转换密钥从字节到字 8
5.4 初始化扩展密钥表 8
5.5 混合密钥 8
6. RC5块密码的描述 9
6.1 加载A和B的值 9
6.2 重申轮函数 10
6.3 存储A和B的值 10
7. RC5-CBC和RC5-CBC-Pad模式的描述 11
7.1 创建密码对象 11
7.2 撤消密码对象 12
7.3 为密码对象设置初始向量 13
7.5 消息的处理部分 14
7.5.1 输出缓冲区大小的检查 15
7.5.2 将明文分成块 15
7.6 最后块的处理 16
8. RC5-CTS的描述 17
9.测试程序和向量 18
9.1 测试程序和向量 18
9.2 测试向量 22
9.3 测试结果 23
10.安全考虑 25
11. ASN.1标识符 26
12.参考 26
13.作者地址 27
1.实现概述
这个文档定义了四种形式的密码算法拥有足够的信息以确保不同实现间的协同工作
能力。第一种是原始的RC5块加密,RC5密码使用固定的输入长度使用一个依赖密钥的转
换产生一个固定长度的输出块。第二种是,RC5-CBC,是RC5的块密码链接模式。它能处
理长度是RC5块尺寸倍数的消息。第三种是,RC5-CBC-Pad,处理任意长度的明文,尽管
密文将比明文长但长度至多长一个RC5块。RC5-CTS密码是RC5算法的密文挪用模式,处
理任意长度的明文且密文的长度匹配明文的长度。
RC5密码是1994由麻萨诸塞技术研究所的Ronald L. Rivest教授发明的。它是一种非
常快速且简单的算法由块尺寸,轮数,和密钥长度参数化。这些参数能被调整以满足不同的
安全目的,性能和出口能力。
合并的RSA数据安全已经归档了RC5密码的专利的申请和RC5,RC5-CBC,
RC5-CBC-Pad,RC5-CTS并分类了各种变更。
2.总览
这个备忘录是对存在的出版资料的重述。RC5的描述是遵从Rivest教授原始的RC5
论文中的符号和解释顺序。CBC模式出现在参考著作中例如Bruce Schneier写的。CBC-Pad
模式与公钥加密标准(PKCS #5)相同。参考C代码被包括只是为了清楚等同于英语的描述。
密码将以一种倒置的面向对象的风格来解释。首先,RC5密钥将伴随着密钥扩展算
法出现。接着RC5块密码将被解释,最后,将规定RC5-CBC和RC5-CBC-Pad密码。为了
简短,只有加密过程被描述。解密可以通过转化加密的步骤来实现。
此处的面向对象的描述应该使得实现交互性系统更加容易,尽管并不像参考文献中
的功能描述那样简单。有两个对象类,密钥和密码算法。两个类用同一种方式共享创建和撤
消这些对象的操作确保秘密信息没有被返回给存储管理者。
密钥也拥有一个“set”操作拷贝一个秘密密钥到对象。密码对象的“set”操作定义
了轮数,和初始向量。
在这个备忘录描述了对于密码对象四个操作。绑定一个密钥到密码对象,为每一个
密码对象设置一个新的初始向量没有改变密钥,一个消息的加密部分(对于长的消息要执行
多次),和处理消息的最后一个部分可以进行填充或检查消息的长度。
总之,密码将根据这些操作被解释:
RC5_Key_Create - 创建一个密钥对象.
RC5_Key_Destroy - 撤消一个密钥的对象.
RC5_Key_Set - 绑定一个用户密钥到密钥对象.
RC5_CBC_Create - 创建一个密码对象.
RC5_CBC_Destroy - 撤消一个密码对象.
RC5_CBC_Encrypt_Init - 绑定一个密钥对象到一个密码对象.
RC5_CBC_SetIV - 设置一个初始向量不用改变密钥.
RC5_CBC_Encrypt_Update - 一个消息的处理部分.
RC5_CBC_Encrypt_Final - 消息末尾的处理.
3.术语和符号
术语“word”指的是一个特殊长度位数的字符串既可以作为一个无符号整数也可以
作为一个位向量。例如一个“word”可以是32位也可以是64位取决于需要的RC5密码块的
的尺寸。一个32位字将产生一个64位的块。为了取得最好的性能RC5子长度应和CPU的寄
存器的长度相匹配。术语“byte”指8位二进制位数。
下面的变量在此备忘录中将以如下定义使用:
W 这个变量表示的是RC5以二进制位数计算的字的尺寸。是块尺寸的一半在此备忘录
中字的尺寸采用的是32和64。
WW 此变量是RC5以字节计算的字尺寸。
B 此变量是以位计算的块尺寸。是2倍的字尺寸。当RC5被用作64位的块密码。B是
64,W是32。0<B<257。在简单的代码中,B被用作一个代替密码系统参数的变量,
但是这个使用应该是上下文明显的。
BB 此变量是以字节计算的块尺寸。BB=B/8。
b 这个变量是密钥的字节长度。B0<=b<256。
K 作为一个 b个字节长的密钥序列,通过K[0],...,K[b-1]索引。
R 此变量是一个内部RC5转换的轮数。0<=R<256。
T 此变量是一个扩展密钥表的字数。总是2*(R+1)。 1<T<513。
S 作为扩展密钥表的字数组,通过S[0],..,S[T-1]索引。
N 此变量是明文消息的字节长度。
P 作为名文消息以一个N字节数组形式存储,通过P[0],..,P[N-1]索引。
C 作为密文输出以一个字节数组形式存储,通过C[0],C[1],...索引。
I 作为CBC模式的初始向量以一个字节数组形式存储,通过I[0],..,I[BB-1]索引。
4. RC5密钥的描述
像大多数密码块,RC5将一个小的用户密钥扩展为一个内部密钥表。用户密钥的字节
长度是密码的参数之一。因此RC5的用户密钥对象必须能拥有可变长度密钥。一个C的可能
的结构是:
/* RC5的用户密钥对像的定义. */
typedef struct rc5UserKey
{
int keyLength; /* In Bytes. */
unsigned char *keyBytes;
} rc5UserKey;
对密钥的基本操作是创建,销毁和设置。为了避免将密钥资料暴露给一个应用的其他
部分,,密钥的销毁操作应该在将分配给密钥的空间释放给存储管理者之前将该存储空间置
零。一个一般的密钥对象可以支持其他的操作像产生一个新的随机密钥和从协商的密钥信息
中获取密钥。
4.1 创建一个RC5密钥
创建一个密钥,密钥对象的存储空间必须被分配和初始化。下面的C代码假设一个
称作“malloc”的函数将从堆返回一个未初始化的存储空间块,或0指出一个错误。
/* 分配和初始化一个RC5用户密钥.
* 如果有问题返回0.
*/
rc5UserKey *RC5_Key_Create ()
{
rc5UserKey *pKey;
pKey = (rc5UserKey *) malloc (sizeof(*pKey));
if (pKey != ((rc5UserKey *) 0))
{
pKey->keyLength = 0;
pKey->keyBytes = (unsigned char *) 0;
}
return (pKey);
}
4.2 销毁一个RC5密钥
为了销毁一个密钥,存储空间必须被置零和被释放给一个存储管理者。以下C代码
假设称作“free”的函数将返回一个存储块给堆。
/* 置零且释放一个RC5用户密钥.
*/
void RC5_Key_Destroy (pKey)
rc5UserKey *pKey;
{
unsigned char *to;
int count;
if (pKey == ((rc5UserKey *) 0))
return;
if (pKey->keyBytes == ((unsigned char *) 0))
return;
to = pKey->keyBytes;
for (count = 0 ; count < pKey->keyLength ; count++)
*to++ = (unsigned char) 0;
free (pKey->keyBytes);
pKey->keyBytes = (unsigned char *) 0;
pKey->keyLength = 0;
free (pKey);
4.3 设置一个RC5密钥
设置一个密钥对象将密钥拷贝到一个从堆分配的存储空间。
/* 设置RC5用户密钥的值.
* 拷贝密钥字节以便调用者能置零和释放原来的值.
* 如果出现问题返回0
*/
int RC5_Key_Set (pKey, keyLength, keyBytes)
rc5UserKey *pKey;
int keyLength;
unsigned char *keyBytes;
{
unsigned char *keyBytesCopy;
unsigned char *from, *to;
int count;
keyBytesCopy = (unsigned char *) malloc (keyLength);
if (keyBytesCopy == ((unsigned char *) 0))
return (0);
from = keyBytes;
to = keyBytesCopy;
for (count = 0 ; count < keyLength ; count++)
*to++ = *from++;
pKey->keyLength = count;
pKey->keyBytes = keyBytesCopy;
return (1);
}
5.设置一个RC5密钥
这部分描述了密钥扩展算法。作为特殊的定义,示例代码假设块的大小为64位。几
个编程参数依赖于块大小。
/*定义 RC5 为一个 64 位块密码. */
/* The "unsigned int" will be 32 bits on all but */
/* the oldest compilers, which will make it 16 bits. */
/* On a DEC Alpha "unsigned long" is 64 bits, not 32. */
#define RC5_WORD unsigned int
#define W (32)
#define WW (W / 8)
#define ROT_MASK (W - 1)
#define BB ((2 * W) / 8) /* Bytes per block */
/* Define macros used in multiple procedures. */
/* These macros assumes ">>" is an unsigned operation, */
/* and that x and s are of type RC5_WORD. */
#define SHL(x,s) ((RC5_WORD)((x)<<((s)&ROT_MASK)))
#define SHR(x,s,w) ((RC5_WORD)((x)>>((w)-((s)&ROT_MASK))))
#define ROTL(x,s,w) ((RC5_WORD)(SHL((x),(s))|SHR((x),(s),(w))))
5.1 初始常量定义
两个常量,Pw和Qw,定义为可以使用任意大小的W表达式如下:
Pw=Odd((e-2)*2**W)
Qw=Odd((phi-1)*2**W)
e是自然对数的底(2.71828...),phi是黄金比例(1.61803...),2**W是2的W
此方,Odd(x)等于x如果x是奇数或等于x+1如果x是偶数。W等于16,32和64,Pw和
Qw常量是下面的16进制值:
#define P16 0xb7e1
#define Q16 0x9e37
#define P32 0xb7e15163
#define Q32 0x9e3779b9
#define P64 0xb7e151628aed2a6b
#define Q64 0x9e3779b97f4a7c15
#if W == 16
#define Pw P16 /* Select 16 bit word size */
#define Qw Q16
#endif
#if W == 32
#define Pw P32 /* Select 32 bit word size */
#define Qw Q32
#endif
#if W == 64
#define Pw P64 /* Select 64 bit word size */
#define Qw Q64
#endif
5.2 接口定义
密钥扩展规则转换b-byte密钥,K,为一个扩展密钥,S,是一个T=2*(R+1)个字的
序列。扩展算法使用了两个常量是来自常量e和phi.这些被用于初始化S,然后使用K进行
修改。使用这个规则的一个C代码程序头如下:
/* Expand an RC5 user key.
*/
void RC5_Key_Expand (b, K, R, S)
int b; /* Byte length of secret key */
char *K; /* Secret key */
int R; /* Number of rounds */
RC5_WORD *S; /* Expanded key buffer, 2*(R+1) words */
{
5.3 转换密钥从字节到字
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -