米葫芦网

PKCS #5: 基于口令的密码系统规范 版本2.0

热度:8℃ 发布时间:2024-11-17 18:10:33

本备忘录的状态
本文档为Internet社区提供信息。它并未定义任何Internet标准。本备忘录的发布
不受任何限制。
版权声明
Copyright(C)TheInternetSociety(2000).AllRightsReserved.
摘要
本备忘录代表源自RSA实验室的公钥密码系统标准(PKCS)系列的PKCS#5v2.0的再版,
变更控制仍保留在PKCS过程。该文档的主体,除了安全性考虑一节,都是直接从那个规范
中获得的。
本文档提供基于口令的密码系统的实现建议,覆盖密钥导出函数,加密方案,消息鉴别
方案,及与该技术等同的ASN.1语法。
建议的意图是供计算机和通信系统的一般程序使用,因此包括了相当数量的灵活性。它
们非凡为敏感信息的保护设计,例如PKCS#8[25]中的私钥。期望有基于这些规范的应用标
准和实现轮廓可能包括附加的约束。
其它基于口令的密码技术,例如基于口令的密钥实体认证和密钥建立协议[4][5][26]不在
本文档范围。口令的选取原则也不在本文档范围。

目录
1介绍 2
2记法 3
3概览 3
4盐和迭代次数 4
4.1盐 4
4.2迭代计数 5
5密钥导出函数 5
5.1PBKDF1 6
5.2PBKDF2 6
6.加密程序 7
6.1PBES1 8
6.2PBES2 9
7.消息验证方式 10
7.1PBMAC1 10
8.安全考虑 11
9.作者地址 11
附录AASN.1语法 11
A.1PBKDF1 11
A.2PBKDF2 11
A.3PBES1 12
A.4 PBES2 13
A.5 PBMAC1 13
B.支撑技术 14
B.1 伪随机函数 14
B.2 加密方法 15
B.3消息认证方法 17
C.ASN.1模块 17
知识产权考虑 20
修订记录 21
参考书目 21
全部版权声明 24
1介绍
本文档为基于口令的密钥系统的实现提供建议,包括了下列的方面:
- 密钥导出函数
- 加密方案
- 消息鉴别方案
- 与该技术等同的ASN.1语法
建议的意图是供计算机和通信系统的一般程序使用,照此包括了相当数量的灵活性。它
们非凡为敏感信息的保护设计,例如PKCS#8[25]中的私钥。期望有基于这些规范的应用标
准和实现轮廓可能包括附加的约束。
其它基于口令的密码技术,例如基于口令的密钥实体认证和密钥建立协议[4][5][26]不在
本文档范围。口令的选取原则也不在本文档范围。
本文档取代PKCS#5v1.5[24],但包含的技术是与之兼容的。
2记法
C 密文,一个字节串
c 迭代次数,一个正整数
DK 导出密钥,一个字节串
DkLen 导出密钥的字节长度,一个正整数
EM 编码,一个字节串
Hash 基础的哈希函数
HLen伪随机函数输出的字节长度,一个正整数
l 导出密钥的块长度,一个正整数
IV 初始向量,一个字节串
K 加密密钥,一个字节串
KDF 密钥导出函数
M 消息,一个字节串
P 口令,一个字节串
PRF 基础的伪随机函数
PS 填充串
psLen 填充串的字节长度,一个正整数
S 盐,一个字节串
T 消息鉴别码,一个字节串
T_1,…,T_1,U_1,…,U_c
中间数,一个字节串
01,02,…,08
值为1,2,…,8的字节
xor 两个字节串的按位异或
字节长度操作符
级联操作符
<i..j> 子串抽取操作符:抽取字节i到j,0<=i<=j
3概览
在公钥密钥学的许多应用中,用户安全性最终取决于一个或多个秘密文本值或口令。口
令不是直接可用作任何传统密码系统的密钥,相反,需要对口令进行一些处理才能用它
进行密码操作。此外,由于口令通常是从一个相对小的空间选取的,处理中要求非凡的
考虑以防止搜索攻击。
基于口令的密码术的一个通用方法,由Morris和Thompson描述,用于口令表的保
护,是把口令与盐结合以产生密钥。可把盐看作是对从口令导出的一个大密钥集合的索
引,不需要保密。尽管攻击者有可能构造一个可能口令表(称作“字典攻击”),但构造
一个可能密钥表是很困难的,因为每个口令将有许多可能的密钥。对手将不得不为每一
个盐单独搜索口令。
基于口令的密码术的另一个方法是构建相对昂贵的密钥导出技术,由此增加穷举搜
索的代价。作法之一是在密钥导出技术中包括一个迭代次数,指示迭代多少次密钥导出
的一些基本函数。一个适度的迭代次数,比如说1000,对合法方来说不可能是计算密
钥时的负担,但对对手来说是一个很大的负担。
盐和迭代次数构成了PKCS#5v1.5中基于口令加密的基础,在这里同样为各种密
码操作所采用。这样,这里定义的基于口令的密钥导出是口令、盐和迭代次数的一个函
数,其中后两个量不需要保密。
从基于口令的密钥导出函数,定义基于口令的加密和消息鉴别方案就简单了。正如
PKCS#5v1.5中,这里的基于口令的加密方案是基于一个基本的、传统加密方案,传统
方案的密钥是从口令导出的。相似地,基于口令的消息鉴别方案也基于一个基本的传统
方案。这两个层次的方法使基于口令的技术按照基于的基础技术模块化。
期待基于口令的密钥导出函数找到除了这里定义的加密和消息鉴别方案以外的其
它应用。比如,用密钥导出函数的一个单个应用导出一个密钥集合。集合中的密钥作为
密钥导出函数的输出的子串得到。该方法可在面向会话的协议中用作密钥建立的一部
分。另外一个应用是口令检查,密钥导出函数的输出被存储(同盐和迭代次数一道)用于
后续的验证口令的目的。
在本文档中,口令被视作一个任意长度的字节串,对其作为文本串的解释不作指定。
但为了互操作性,建议应用遵循某些通用的文本编码规则。ASCII和UTF-8[27]是两种
可能的选择。(ASCII是UTF-8的一个子集。)
尽管口令的选择不在本文档的范围,已有指导原则发布[17],可供考虑。
4盐和迭代次数
由于盐和迭代次数是本文档定义的技术的中心,有理由进行一些深入的讨论。
4.1盐
基于口令的密码技术中的盐传统上用于产生对应于一给定口令的一个大集合的密钥,依
据该盐值从中随机选取一个密钥。运用一密钥导出函数选择集合中的一个密钥,即:
DK=KDF(P,S)
其中DK是导出密钥,P是口令,S是盐。这有两个好处:
1. 预计算和口令字典相对应的所有密钥甚至最相像密钥是困难的。例如,假如盐
是64位长,对每个口令来说,将有多达2^64个密钥。在基于口令的操作被执
行并且得知盐后,对手只有搜索口令。
2. 同一个密钥不可能被选择两次。再者,假如盐是64位长,依据生日悖论,在
大约2^32个密钥已被产生之前,密钥间“碰撞”的机率并不大。这解决了对
相同密钥的多个用户之间相互影响的顾虑,可能适用于某些加密和认证技术。
在基于口令的的加密中,加密消息的一方只需在从一口令导出加密密钥时选择一个
大的、足够随机的盐就能保证获得这些好处。产生消息鉴别码的一方能以类似的方式得
到这些保证。
但解密消息或验证消息鉴别码的一方不能确定另一方提供的盐实际上是随机产生
的。例如,有可能盐是从另一个基于口令的操作中拷贝的,试图利用同一个密钥的多个
用户间的相互影响。假设两个合法方交换一段加密过的消息,其中加密密钥是从一个共
享口令使用盐导出的80位的密钥。对手能从密文中取出盐,并把它提供给另一方,尽
管它本来适用于40位的密钥。假如一方用40位的密钥提示了解密的结果,对手可能解
出40位密钥。在40位密钥是80位密钥头一半的情况下,对手然后能很轻易地解开80
位密钥的剩下40位。
为了防止这样的攻击,或者应仔细分析同一个密钥的多个用户之间的相互影响,或
者盐应包含能明确区分不同操作的数据。例如,盐可以有一个附加的、非随机的字节,
指定导出密钥是用于加密、消息认证,或一些其它操作。
基于以上这些,对盐的选择作以下推荐:
1. 假如不考虑用支持一给定口令的基于口令的加密和认证技术的拥有同一
个密钥(或该密钥的一个前缀)的多个用户之间的相互影响的话,那么盐可
以随机产生,接收到盐的一方不必检查是否符合特定格式。盐应至少八字
节(64位)长。
2. 否则,除了至少八字节长的随机部分外,盐应包括能明确区分不同操作和
不同密钥长度的数据,而该数据应能被接收盐的一方检查或重新生成。比
如,盐应包含一个附加的、非随机的字节指定导出密钥的用途。另一种办
法是,它可以是指定有关导出密钥的具体信息的结构的编码,比如加密或
认证技术,以及在由口令导出的不同密钥中的序列号。附加数据的非凡格
式留给应用定义。
注重,假如没有随机数或伪随机数发生器,产生盐(或它的随机部分)的一个确定性
的替代法是对口令和待处理的消息M应用一个基于口令的密钥导出函数。例如,盐可
用S=KDF(P,M)的密钥导出函数计算。但假如已知消息M属于一个小的消息空间(例
如"Yes"或"No"),不推荐使用该方法,因为可能盐的数量很小。
4.2迭代计数
迭代计数传统上用于增加从一口令生成密钥的代价,从而增加攻击的难度。对于本
文档的方法,推荐最小1000迭代。这将显著增加对口令穷举搜索的代价,但对导出单
个密钥的代价没有明显的影响。
5密钥导出函数
密钥导出函数从一个基础密钥和其它参数产生一个导出密钥。在基于口令的密钥导出
函数中,基础密钥是口令,其它参数是一盐值和一迭代次数,正如第3节描述的。
这里定义的基于口令的密钥导出函数的主要应用在于第6节的加密策略和第7节的消息
验证策略。由于这些函数的独立定义,其它的应用肯定是可能的。
本节详述两个函数:PBKDF1和PBKDF2。推荐新的应用使用PBKDF2;PBKDF1只为
同已有应用兼容,对新的应用不推荐使用。
这里定义的密钥导出函数的一个典型应用可能包括以下几步:
1. 选择一个盐S和一个迭代次数c,如第4节所述。
2. 选择导出密钥的字节长度,dkLen。
3. 将密钥导出函数应用于口令、盐、迭代次数和密钥长度以生成一个导出密钥。
4. 输出导出的密钥。
通过改变盐可从一个口令导出任意数量的密钥,正如第3节描述的那样。
5.1PBKDF1
PBKDF1应用一个散列函数导出密钥,散列函数可以是MD2、MD5或SHA-1。导出密钥的
长度受散列函数输出的长度的限制,MD2和MD5是16字节,SHA-1是20字节。PBKDF1同PKCS#5
v1.5的密钥导出过程相兼容。
建议PBKDF1只用于同已有应用的兼容,因为它产生的密钥对某些应用来说不够大。
PBKDF1(P,S,c,dkLen)
可选项: Hash 基本散列函数
输入:P 口令,字节串
S 盐,一八字节串
c 迭代次数,正整数
dkLen导出密钥的意定字节长度,正整数,MD2或MD5最多16,SHA-1
最多20
输出: DK 导出密钥,dkLen字节
步骤:
1. 假如对于MD2和MD5,dkLen>16,或对于SHA-1,dkLen>20,(即dkLen大于散列函
数的输出长度),输出“derivedkeytoolong”并停止。
2. 对口令P和附加盐S的串联应用基本散列函数,重复c次,然后抽取第一个dkLen
字节以产生一导出密钥DK:
T_1=Hash(PS),
T_2=Hash(T_1),
...
T_c=Hash(T_{c-1}),
DK=Tc<0..dkLen-1>
3. 输出导出密钥DK。
5.2PBKDF2
PBKDF2应用一个伪随机函数(例子见附录B.1)以导出密钥。导出密钥的长度本质上是没
有限制的。(但是,导出密钥的最大有效搜索空间受限于基本伪随机函数的结构。进一步的
讨论参见附录B.1。)对新的应用推荐使用PBKDF2。
PBKDF2(P,S,c,dkLen)
可选项: RPF 基本伪随机函数(hLen表示伪随机函数输出的字节长度)
输入: P 口令,一字节串
S 盐,字节串
c 迭代次数,正整数
dkLen 导出密钥的意定字节长度,正整数,最大约(2^32-1)*hLen
输出: DK 导出密钥,长度dkLen字节
步骤:
1. 假如dkLen>(2^32-1)*hLen,输出“derivedkeytoolong”并停止。
2. 假设l是导出密钥的hLen个字节块的个数,r表示最后一个块的字节数。
l=CEIL(dkLen/hLen),
r=dkLen-(l-1)*hLen.
这里,CEIL(x)是“ceiling”函数,即,大于或等于x的最小整数。
4. 对于导出密钥的每一块,运用函数F于口令P、盐S、迭代次数c和块索引以计算
块:
T_1=F(P,S,c,1),
T_2=F(P,S,c,2),
...
T_l=F(P,S,c,l),
这里函数F定义为基本伪随机函数PRF应用于口令P和盐S的串联和块索引i
的前c次循环的异或和。
F(P,S,c,i)=U_1xorU_2xor...xorU_c
其中
U_1=PRF(P,SINT(i)),
U_2=PRF(P,U_1),
...
U_c=PRF(P,U_{c-1}).
这里,INT(i)是整数i的四字节编码,高字节在先。
3. 串联各块,抽取前dkLen字节以产生导出密钥DK:
DK=T_1T_2...T_l<0..r-1>
4. 输出导出密钥DK。
注重:函数F的构造遵循“belt-and-suspenders”方法。U_i次循环被递归计算以消
除敌手的并行度;它们被异或到一起以减少有关递归退化到一个小的值集的担忧。
6.加密程序
在对称设置中,加密程序包括加密操作的解密操作,其中加密操作在一个密钥作用下从
一个消息产生密文,而解密操作在同一个密钥作用下从密文恢复消息。在基于口令的加密策
略中,密钥就是口令。
基于口令的加密方法的一个典型应用是私钥保护方法,其中消息包括私钥信息,如
PKCS#8中的那样。这里定义的加密策略在那种情况下是合适的加密算法。
本节详述的两个策略是PBES1和PBES2。PBES2推荐给新的应用,PBES1只为了同已有
应用的兼容。
6.1PBES1
PBES1结合了PBKDF1函数和一个基础的块加密,可以是CBC模式下的DES或RC2?。PBES1
同PKCS#5v1.5中加密策略相兼容。
6.1.1加密操作
在口令P作用下加密消息M以产生密文C,包括以下步骤:
1. 产生一八字节盐S和一迭代次数c,如第4节所述。
2. 应用PBKDF1密钥导出函数(5.1节)到口令、附加盐S和迭代次数,以产生长度为16字
节的导出密钥DK:
DK=PBKDF1(P,S,c,16).
3. 分割导出密钥DK成由DK的前8字节组成的加密密钥K,和一包含下8个字节的初始化
向量IV:
K=DK<0..7>,
IV=DK<8..15>.
4. 连接M和一填充串PS,以形成一编码消息EM:
EM=MPS,
其中填充串PS由8-(Mmod8)个字节组成,每个的值是8-(Mmod8).填充串PS满
足以下的表达式:
PS=01,ifMmod8=7;
PS=0202,ifMmod8=6;
...
PS=0808080808080808,ifMmod8=0.
编码消息的字节长度将是8的倍数,从编码消息中可以无歧义地恢复出消息M。(填充规则
来自于RFC1423。
5. 在加密密钥K和初始向量IV下,用基本块密码算法以CBC模式加密编码消息EM,以产
生密文C。对于DES,密钥K应被看作一56位DES密钥并且奇位忽略的64位编码。对
于RC2,“有效密钥位“应为64位。
6. 输出密文C。
盐S和迭代次数c应以一AlgorithmIdentifier值传递给执行解密的一方。(见附录A.3)
6.1.2解密操作
PBES1的解密操作包括以下步骤,在口令P的作用下解密密文C以恢复消息M:
1. 获取八字节盐S和迭代次数c。
2. 应用PBKDF1密钥导出函数(5.1节)于口令P、附加盐S和迭代次数以产生长度为16字
节的导出密钥:
DK=PBKDF1(P,S,c,16)
3. 分割导出密钥DK,由DK的前8字节组成一加密密钥K,和由下8字节组成的初始向量
IV:
K=DK<0..7>,
IV=DK<8..15>.
4. 在加密密钥K和初始向量IV作用下,用基本块密码算法(DES或RC2)以CBC模式解密密
文,以恢复编码消息EM。假如密文的字节长度不是8的倍数,输出“解密错”并停止。
5. 把编码消息EM分割成一消息M和一填充串PS:
EM=MPS,
其中填充串PS由psLen个字节组成,每个的值是psLen,其中psLen介于1和8之间。假如
不可能以这种方式分割编码消息EM,输出“解密错”并停止。
6.输出恢复的消息M。
6.2PBES2
PBES2结合一个基于口令的密钥导出函数,在PKCS#5的本版本中应为PBKDF2(5.2节)和一
基本的加密策略(例子见附录B.2)。基本加密策略的密钥长度和任何其它参数依靠于策略。
新的应用推荐使用PBES2。
6.2.1加密操作
PBES2的加密操作包括以下步骤,应用一选择的密钥导出函数KDF和一选择的基本加密策略,
以在口令P的作用下加密消息M以产生密文C:
1. 如第4节所述,选择一盐S和一迭代次数c。
2. 为基本加密方法的导出密钥选择字节长度dkLen。
3. 应用选择的密钥导出函数于口令P、盐S和迭代次数c,以产生长度dkLen字节的导出
密钥。
4. 在导出密钥K的作用下用基本加密方法加密消息M以产生密文C(依靠于基本策略,这一
步可能包括诸如初始向量和填充等参数的选择)。
5. 输出密文C。
6. 盐S和迭代次数、密钥长度dkLen、密钥导出函数的标识符和基本的加密策略可以一
AlgorithmIdentifier值传给执行解密的一方(见附录A.4)。
6.2.2解密操作
PBES2的解密操作包括以下步骤,在口令的作用解密密文C以恢复消息M:
1. 获取该操作所用的盐S。
2. 为密钥导出函数获取迭代次数。
3. 获取基本加密方法的导出密钥的字节长度dkLen。
4. 应用选择的密钥导出函数于口令P、盐S和迭代次数以产生长度为dkLen字节的导出密
钥DK:
DK=KDF(P,S,c,dkLen)。
5. 用基本加密方法在导出密钥DK的作用下解密密文C以恢复消息M。假如解密函数输出“解
密错”,那么输出“解密错”并停止。
6. 输出恢复的消息M。
7.消息验证方式
消息验证策略包括一个MAC(消息验证码)产生操作和一个MAC验证函数操作,其中MAC产生
操作在一个密钥作用下从一个消息产生一个消息验证码,MAC验证操作在同一个密钥下验证
MAC。在基于口令和消息验证策略中,密钥就是口令。
该节详述的一个策略是:PBMAC1。
7.1PBMAC1
PBMAC1结合了一个基于口令的密钥导出函数,对于PKCS#5的本版本中应为PBKDF2(5.2节),
和基本的消息验证策略(例子见附录B.3)。基本消息验证策略的密钥长度和任何其它参数都
依靠于策略。
7.1.1MAC生成
PBMAC1的MAC生成操作应用一选择的密钥导出函数KDF和一选择的基本消息验证策略,在
口令P下处理消息M以产生一消息验证码T,包括以下步骤:
1. 如第4节所述,选择一盐S和一迭代次数c。
2. 为基本消息验证函数的导出密钥选择字节长度dkLen。
3. 应用选择的密钥导出函数于口令P、盐S和迭代次数c,以产生一长度为dkLen字节的
导出密钥DK:
DK=KDF(P,S,c,dkLen)。
4. 在导出密钥DK作用下,用基本消息验证策略处理消息M,以产生一消息验证码T。
5. 输出消息验证码T。
盐S、迭代次数c、密钥长度L、密钥导出函数的标识符,和基本消息验证策略可以一
AlgorithmIdentifier值传递给执行验证的另一方。
7.1.2MAC验证
PBMAC1的MAC验证操作在口令P的作用下处理消息M以验证一消息验证码T,包括以下步骤:
1. 获取盐S和迭代次数c。
2. 为基本消息验证方式的导出密钥获取密钥的字节长度dkLen.
3. 应用选择的密钥导出函数于口令P、盐S和迭代次数c,以产生长度为dkLen字节的导
出密钥DK:
DK=KDF(P,S,c,dkLen).
4. 在导出密钥DK下用基本消息验证方式处理消息M以产生一消息验证码T。
5. 假如消息验证码证实,输出“correct”,否则输出“incorrect”。
8.安全考虑
基于口令密码术在它能提供的安全上通常受限,非凡在本文档定义的那些方法,离线口令搜
索是可能的情况。在盐和迭代次数的使用能增加攻击的复杂度的同时,很好地选择口令是基
本的,应把相应的指导原则考虑进去。假如口令存储的话,口令被很好地保护也是重要的。
通常,从不同用户的一个口令导出的密钥也应不同,以减少意料之外的干扰的可能性。对于
使用同一算法的基于口令的加密方法,随机盐已足够确保产生不同的密钥。在某些其它情况
正如第4节所述的,结构化的盐是必须的。当选择盐值时第4节中的建议就加以考虑。
9.作者地址
BurtKaliski
RSALaboratories
20CrosbyDrive
Bedford,MA01730USA
EMail:bkaliski@rsasecurity.com
附录AASN.1语法
该节定义密钥导出函数的ASN.1语法,加密方法、消息认证方法和支撑技术。这些定义的意
定应用包括PKCS#8和密钥治理、加密数据和集成保护数据的其它语法。
对象标识符pkcs-5标识OID树的弧,本节中PKCS#5特有的OID从中导出:
rsadsiOBJECTIDENTIFIER::={iso(1)member-body(2)us(840)113549}
pkcsOBJECTIDENTIFIER::={rsadsi1}
pkcs-5OBJECTIDENTIFIER::={pkcs5}
A.1PBKDF1
PBKDF1没有给出对象标识符,PBES1的对象标识符对已有应用已足够,对新的应用推荐使用
PBKDF2。
A.2PBKDF2
对象标识符id-PBKDF2标识PBKDF2密钥导出函数(5.2节)。
id-PBKDF2OBJECTIDENTIFIER::={pkcs-512}
在AlgorithmIdentifier中,同该OID相关联的参数域应有类型PBKDF2-params:
PBKDF2-params::=SEQUENCE{
saltCHOICE{
specifiedOCTETSTRING,
otherSourceAlgorithmIdentifier{{PBKDF2-SaltSources}}
},
iterationCountINTEGER(1..MAX),
keyLengthINTEGER(1..MAX)OPTIONAL,
prfAlgorithmIdentifier{{PBKDF2-PRFs}}DEFAULTalgid-hmacWithSHA1}
类型PKDF2-params域有以下含义:
- salt指定盐值,或盐值的来源。它应是一字节串,或是其OID在集合PBKDF2-SaltSources
的一算法ID,被PKCS#5保留给将来的版本。
Salt-Source方法被设计用于指示如何产生盐值,作为算法ID中的参数和应用数据,或两者
皆有。例如,它可能指示盐值产生于从指定有关导出密钥的具体信息的结构的编码,如第4节所
建议的。有些信息可能被带到别处,比如在加密算法ID。但是,这些功能被延迟到PKCS#5的将
来版本。
在该节中,一应用可能通过在指定的选择中选择盐值的非凡解释,达到节4.1提到的好处。
PBKDF2-SaltSourcesALGORITHM-IDENTIFIER::={...}
- iterationCount指定迭代次数。答应的最大迭代次数依靠于实现。期待实现轮廓(profile)
进一步约束范围。
- keyLength,可选项,是导出密钥的字节长度。答应的最大密钥长度依靠于实现;期待实现
轮廓(profile)进一步约束范围。提供该域只为了方便使用。假如顾虑一盐值用不同密钥长
度的操作的相互干扰???
- prf标识下层的伪随机函数。它应是一算法ID,其OID在集合PBKDF2-PRFs,在PKCS#5的
该版本应包括id-hmacWithSHA1(见附录B.1.1)和其它任何由应用定义的OID。
PBKDF2-PRFsALGORITHM-IDENTIFIER::=
{{NULLIDENTIFIEDBYid-hmacWithSHA1},...}
缺省的伪随机函数是HMAC-SHA-1:
algid-hmacWithSHA1AlgorithmIdentifier{{PBKDF2-PRFs}}::=
{algorithmid-hmacWithSHA1,parametersNULL:NULL}
A.3PBES1
依据密钥导出函数有下层散列函数和下层的块密码算法,使用不同的对象标识符标识
PBES1加密方法(6.1节),总结在下表:
散列函数 块密码算法 OID
MD2DESpkcs-5.1
MD2RC2pkcs-5.4
MD5DESpkcs-5.3
MD5RC2pkcs-5.6
SHA-1DESpkcs-5.10
SHA-1RC2pkcs-5.11
pbeWithMD2AndDES-CBCOBJECTIDENTIFIER::={pkcs-51}
pbeWithMD2AndRC2-CBCOBJECTIDENTIFIER::={pkcs-54}
pbeWithMD5AndDES-CBCOBJECTIDENTIFIER::={pkcs-53}
pbeWithMD5AndRC2-CBCOBJECTIDENTIFIER::={pkcs-56}
pbeWithSHA1AndDES-CBCOBJECTIDENTIFIER::={pkcs-510}
pbeWithSHA1AndRC2-CBCOBJECTIDENTIFIER::={pkcs-511}
对每一个OID,在AlgorithmIdentifier中同该OID相关联的参数域应具有类型
PBEParameter:
PBEParameter::=SEQUENCE{
saltOCTETSTRING(SIZE(8)),
iterationCountINTEGER}
类型PBEParameter的域有以下含义:
- salt指定盐值,一八字节串。
- iterationCount指定迭代次数。
A.4 PBES2
对象标识符id-PBES2标识PBES2加密方法(6.2节)。
id-PBES2OBJECTIDENTIFIER::={pkcs-513}
对每一个OID,在AlgorithmIdentifier中同该OID相关联的参数域应具有类型PBES2-params:
PBES2-params::=SEQUENCE{
keyDerivationFuncAlgorithmIdentifier{{PBES2-KDFs}},
encryptionSchemeAlgorithmIdentifier{{PBES2-Encs}}}
类型PBES2-params的域有以下含义:
-keyDerivationFunc标识下层的密钥导出函数。它应是一算法ID,其OID在集合PBES2-KDFs
中,对本版本的PKCS#5应包括id-PBKDF2(附录A.2)。
PBES2-KDFsALGORITHM-IDENTIFIER::=
{{PBKDF2-paramsIDENTIFIEDBYid-PBKDF2},...}
-encryptionScheme标识下层的加密方法。它应是一算法ID,其OID在集合PBES2-Encs,它
的定义留给应用程序。例示的下层加密方法在附录B.2中给出。
PBES2-EncsALGORITHM-IDENTIFIER::={...}
A.5 PBMAC1
对象标识符id-PBMAC1标识PBMAC1消息认证方法(节7.1)。
id-PBMAC1OBJECTIDENTIFIER::={pkcs-514}
在AlgorithmIdentifier中同该OID相关联的参数域应具有类型PBMAC1-params:
PBMAC1-params::=SEQUENCE{
keyDerivationFuncAlgorithmIdentifier{{PBMAC1-KDFs}},
messageAuthSchemeAlgorithmIdentifier{{PBMAC1-MACs}}}
keyDerivationFunc域同PBES2-params(附录A.4)的相应域有同样的含义,除了OID
集合是PBMAC1-KDFs。
PBMAC1-KDFsALGORITHM-IDENTIFIER::=
{{PBKDF2-paramsIDENTIFIEDBYid-PBKDF2},...}
messageAuthScheme域标识下层的消息认证方法。它应是一算法ID,其OID在集合
PBMAC1-MACs中,它的定义留给应用程序。例示的下层加密方法在附录B.3中给出。
PBMAC1-MACsALGORITHM-IDENTIFIER::={...}
B.支撑技术
本节给出支持5、6和7节中的基于口令的策略的下层函数和方法的几个例子。
尽管这些支撑技术适于应用实现,但都非强制的。期待将来开发PKCS#5的profile以指定
特定和支撑技术。
本节也给出支撑技术的对象标识符。对象标识符digestAlgorithm和encryptionAlgorithm标识
本节引用的某些算法OID都从其中导出。
digestAlgorithmOBJECTIDENTIFIER::={rsadsi2}
encryptionAlgorithmOBJECTIDENTIFIER::={rsadsi3}
B.1 伪随机函数
用于PBKDF2(5.2节)的一个例子伪随机函数是HMAC-SHA-1。
B.1.1HMAC-SHA-1
HMAC-SHA-1是同基于SHA-1散列函数的HMAC消息认证码相对应的伪随机函数。伪随
机函数同计算消息认证码的函数相同,只是输出是全长度的。(伪随机函数PRF的第一个变
量作为HMAC的“密钥”,第二个作为HMAC的“文本。在PBKDF2的情况下,“密钥”
就是口令,“文本”就是盐。)HMAC-SHA-1有一个可变的密钥长度和20-字节(160位)输出
值。
尽管HMAC-SHA-1的密钥的长度本质上是没有限制的,但伪随机函数输出的有效搜索空间
可能受限于函数的结构。非凡是,当密钥长于512位时,HMAC-SHA-1将首先杂凑到160
位。这样,即使从一个密钥产生一个包括几个伪随机函数输出的长导出密钥,导出密钥的有
效搜索空间将最多160位。尽管对其它密钥大小的非凡限制依靠于HMAC构造的细节,可以
保守地假设,对其它的密钥大小,有效搜索空间仍限制到160位。
(在基于口令的密码系统,160位的限制通常不应造成实际的限制,因为对口令的搜索空间
不可能大于160位。)
对象标识符id-hmacWithSHA1标识HMAC-SHA-1伪随机函数:
id-hmacWithSHA1OBJECTIDENTIFIER::={digestAlgorithm7}
在AlgorithmIdentifier同该OID相关联的参数域应有类型NULL。该对象标识符使用在对象集
合PBKDF2-PRFs(见附录A.2)。
注重,尽管HMAC-SHA-1作为消息认证码设计的,但在较强的假定下,它的安全验证(?)
很轻易被修改以满足对一伪随机函数的需要。
一散列函数也可能在某些假定下满足伪随机函数的需要。例如,直接应用一散列函数到“密
钥”和“文本”的串联可能是合适的,只要“文本”有合适的结构以预防某些攻击。但
HMAC-SHA-1更可取,因为它把“密钥”和“文本”看作单独的变量,不需要“文本”有
任何结构。
B.2 加密方法
PBES2(6.2节)的伪随机函数的例子有DES-CBC-Pad,DES-EDE2-CBC-Pad,RC2-CBC-Pad,
和RC5-CBC-Pad。
在本节给出的对象标识符预期在对象集合PBES2-Encs中应用(附录A.4)。
B.2.1 DES-CBC-Pad
DES-CBC-Pad是CBC模式下的单密钥DES,并使用RFC 1423的填充操作(见6.1.1节)。
DES-CBC-Pad有一个八字节的加密密钥和一个八字节的初始向量。密钥被看作是56位DES
密钥的64位编码,忽略奇偶校验位。
对象标识符desCBC(在NIST/OSIImplementors"Workshop协定中定义)标识DES-CBC-Pad
加密方法。
desCBCOBJECTIDENTIFIER::=
{iso(1)identified-organization(3)oiw(14)secsig(3)algorithms(2)7}
在AlgorithmIdentifier中同该OID相关联的参数域应有类型OCTETSTRING(SIZE(8)),指定
CBC模式的初始向量。
B.2.2DES-EDE3-CBC-Pad
DES-EDE3-CBC-Pad是CBC模式下的三密钥的三重DES,用RFC1423的填充操作。
DES-EDE3-CBC-Pad有一个24字节的加密密钥和一个八字节初始向量。密钥被看作是三个
八字节密钥的串联,每一个是一56位DES密钥的64位编码,忽略奇偶校验位。
对象标识符des-EDE3-CBC标识DES-EDE3-CBC-Pad加密方法:
des-EDE3-CBCOBJECTIDENTIFIER::={encryptionAlgorithm7}
在AlgorithmIdentifier中同该OID相关联的参数域应有类型OCTETSTRING(SIZE(8)),指定
CBC模式的初始向量。
注重:没有填充的DES-EDE3-CBC的OID在ANSIX9.52[1]给出;这里给出的OID由于指明
了填充而更可取。
B.2.3RC2-CBC-Pad
RC2-CBC-Pad是CBC模式下的RC2(tm)加密方法[21],使用RFC1423填充操作。
RC2-CBC-Pad
有一个从1到128字节的可变的密钥长度;一个从1到1024位的单独的“有效密钥位”参
数,它不依靠于密钥长度限制有效搜索空间;和一个八字节的初始向量。
对象标识符rc2CBC标识RC2-CBC-Pad加密方法:
rc2CBCOBJECTIDENTIFIER::={encryptionAlgorithm2}
在AlgorithmIdentifier中同该OID相关联的参数域应具有类型RC2-CBC-Parameter:
RC2-CBC-Parameter::=SEQUENCE{
rc2ParameterVersionINTEGEROPTIONAL,
ivOCTETSTRING(SIZE(8))}
类型RC2-CBCParameter的域有以下含义:
- rc2ParameterVersion是RC2的“有效密钥位”的一个RSASecurityInc.所有的编码。定
义了以下编码:
EffectiveKeyBitsEncoding
40160
64120
12858
b>=256b
假如rc2ParameterVersion域被忽略,缺省的“有效密钥位”是32。(这是为了同某些很老的
实现向后兼容。)
- iv是八字节的初始向量
B.2.4RC5-CBC-Pad
RC5-CBC-Pad是CBC模式下的RC5(tm)加密算法[20],并使用RFC1423填充操作的推广。
该方法完整的定义在[2].RC5-CBC-Pad有一个从0到256字节的可变的密钥长度,支持64
位和128位的块大小。对于前者,它有一个8字节的初始向量;对于后者,有一个16字节
的初始向量。RC5-CBC-Pad在加密操作中也有一个从8到127的可变数目的“轮次”。
注重,填充操作的推广是这样的。对64位块大小的RC5,填充串在RFC1423中定义。对
128位块大小的RC5,填充串由16-(Mmod16)个字节组成,每个字节的值是16-(Mmod
16)。
对象标识符rc5-CBC-PAD[2]标识RC5-CBC-Pad加密方法:
rc5-CBC-PADOBJECTIDENTIFIER::={encryptionAlgorithm9}
在AlgorithmIdentifier中同该OID相关联的参数域应有类型RC5-CBC-Parameters:
RC5-CBC-Parameters::=SEQUENCE{
versionINTEGER{v1-0(16)}(v1-0),
roundsINTEGER(8..127),
blockSizeInBitsINTEGER(64128),
ivOCTETSTRINGOPTIONAL}
类型RC5-CBC-Parameters的域有以下含义:
version是算法的版本,应为v1-0。
rounds是加密操作的轮次数,应在8与127之间。
blockSizeInBits是块大小的位数,应为64或128。
iv是初始向量,对64位RC5是一个8字节串,对128位RC5是一个16字节串。缺省是一
包含内容为0长度适当的字节串。
B.3消息认证方法
PBMAC1(7.1节)的消息认证方法的一个例子是HMAC-SHA-1。
B.3.1HMAC-SHA-1
HMAC-SHA-1是基于SHA-1散列函数[18]的HMAC消息消息认证方法[7]。HMAC-SHA-1
有可变的密钥长度和一20字节(160位)消息认证码。
对象标识符id-hmacWithSHA1(见附录B.1.1)标识HMAC-SHA-1消息认证方法。(伪随机
函数和消息认证方法的对象标识符是相同的,可通过上下文区分。)该标识符预期在对象集
合PBMAC1-Macs中应用(附录A.5)。
C.ASN.1模块
为了参考的目的,在以前各节中的ASN.1语法在这里作为ASN.1模块给出。
--PKCS#5v2.0ASN.1Module
--RevisedMarch25,1999
--Thismodulehasbeencheckedforconformancewiththe
--ASN.1standardbytheOSSASN.1Tools
PKCS5v2-0{iso(1)member-body(2)us(840)rsadsi(113549)
pkcs(1)pkcs-5(5)modules(16)pkcs5v2-0(1)}
DEFINITIONS::=BEGIN
--Basicobjectidentifiers
rsadsiOBJECTIDENTIFIER::={iso(1)member-body(2)us(840)113549}
pkcsOBJECTIDENTIFIER::={rsadsi1}
pkcs-5OBJECTIDENTIFIER::={pkcs5}
--Basictypesandclasses
AlgorithmIdentifier{ALGORITHM-IDENTIFIER:InfoObjectSet}::=
SEQUENCE{
algorithmALGORITHM-IDENTIFIER.&id({InfoObjectSet}),
parametersALGORITHM-IDENTIFIER.&Type({InfoObjectSet}
{@algorithm})OPTIONAL
}
ALGORITHM-IDENTIFIER::=TYPE-IDENTIFIER
--PBKDF2
PBKDF2AlgorithmsALGORITHM-IDENTIFIER::=
{{PBKDF2-paramsIDENTIFIEDBYid-PBKDF2},...}
id-PBKDF2OBJECTIDENTIFIER::={pkcs-512}
algid-hmacWithSHA1AlgorithmIdentifier{{PBKDF2-PRFs}}::=
{algorithmid-hmacWithSHA1,parametersNULL:NULL}
PBKDF2-params::=SEQUENCE{
saltCHOICE{
specifiedOCTETSTRING,
otherSourceAlgorithmIdentifier{{PBKDF2-SaltSources}}
},
iterationCountINTEGER(1..MAX),
keyLengthINTEGER(1..MAX)OPTIONAL,
prfAlgorithmIdentifier{{PBKDF2-PRFs}}DEFAULT
algid-hmacWithSHA1
}
PBKDF2-SaltSourcesALGORITHM-IDENTIFIER::={...}
PBKDF2-PRFsALGORITHM-IDENTIFIER::=
{{NULLIDENTIFIEDBYid-hmacWithSHA1},...}
--PBES1
PBES1AlgorithmsALGORITHM-IDENTIFIER::={
{PBEParameterIDENTIFIEDBYpbeWithMD2AndDES-CBC}
{PBEParameterIDENTIFIEDBYpbeWithMD2AndRC2-CBC}
{PBEParameterIDENTIFIEDBYpbeWithMD5AndDES-CBC}
{PBEParameterIDENTIFIEDBYpbeWithMD5AndRC2-CBC}
{PBEParameterIDENTIFIEDBYpbeWithSHA1AndDES-CBC}
{PBEParameterIDENTIFIEDBYpbeWithSHA1AndRC2-CBC},
...
}
pbeWithMD2AndDES-CBCOBJECTIDENTIFIER::={pkcs-51}
pbeWithMD2AndRC2-CBCOBJECTIDENTIFIER::={pkcs-54}
pbeWithMD5AndDES-CBCOBJECTIDENTIFIER::={pkcs-53}
pbeWithMD5AndRC2-CBCOBJECTIDENTIFIER::={pkcs-56}
pbeWithSHA1AndDES-CBCOBJECTIDENTIFIER::={pkcs-510}
pbeWithSHA1AndRC2-CBCOBJECTIDENTIFIER::={pkcs-511}
PBEParameter::=SEQUENCE{
saltOCTETSTRING(SIZE(8)),
iterationCountINTEGER
}
--PBES2
PBES2AlgorithmsALGORITHM-IDENTIFIER::=
{{PBES2-paramsIDENTIFIEDBYid-PBES2},...}
id-PBES2OBJECTIDENTIFIER::={pkcs-513}
PBES2-params::=SEQUENCE{
keyDerivationFuncAlgorithmIdentifier{{PBES2-KDFs}},
encryptionSchemeAlgorithmIdentifier{{PBES2-Encs}}
}
PBES2-KDFsALGORITHM-IDENTIFIER::=
{{PBKDF2-paramsIDENTIFIEDBYid-PBKDF2},...}
PBES2-EncsALGORITHM-IDENTIFIER::={...}
--PBMAC1
PBMAC1AlgorithmsALGORITHM-IDENTIFIER::=
{{PBMAC1-paramsIDENTIFIEDBYid-PBMAC1},...}
id-PBMAC1OBJECTIDENTIFIER::={pkcs-514}
PBMAC1-params::=SEQUENCE{
keyDerivationFuncAlgorithmIdentifier{{PBMAC1-KDFs}},
messageAuthSchemeAlgorithmIdentifier{{PBMAC1-MACs}}
}
PBMAC1-KDFsALGORITHM-IDENTIFIER::=
{{PBKDF2-paramsIDENTIFIEDBYid-PBKDF2},...}
PBMAC1-MACsALGORITHM-IDENTIFIER::={...}
--Supportingtechniques
digestAlgorithmOBJECTIDENTIFIER::={rsadsi2}
encryptionAlgorithmOBJECTIDENTIFIER::={rsadsi3}
SupportingAlgorithmsALGORITHM-IDENTIFIER::={
{NULLIDENTIFIEDBYid-hmacWithSHA1}
{OCTETSTRING(SIZE(8))IDENTIFIEDBYdesCBC}
{OCTETSTRING(SIZE(8))IDENTIFIEDBYdes-EDE3-CBC}
{RC2-CBC-ParameterIDENTIFIEDBYrc2CBC}
{RC5-CBC-ParametersIDENTIFIEDBYrc5-CBC-PAD},
...
}
id-hmacWithSHA1OBJECTIDENTIFIER::={digestAlgorithm7}
desCBCOBJECTIDENTIFIER::=
{iso(1)identified-organization(3)oiw(14)secsig(3)
algorithms(2)7}--fromOIW
des-EDE3-CBCOBJECTIDENTIFIER::={encryptionAlgorithm7}
rc2CBCOBJECTIDENTIFIER::={encryptionAlgorithm2}
RC2-CBC-Parameter::=SEQUENCE{
rc2ParameterVersionINTEGEROPTIONAL,
ivOCTETSTRING(SIZE(8))
}
rc5-CBC-PADOBJECTIDENTIFIER::={encryptionAlgorithm9}
RC5-CBC-Parameters::=SEQUENCE{
versionINTEGER{v1-0(16)}(v1-0),
roundsINTEGER(8..127),
blockSizeInBitsINTEGER(64128),
ivOCTETSTRINGOPTIONAL
}
END
知识产权考虑
RSASecuritymakesnopatentclaimsonthegeneralconstrUCtions
describedinthisdocument,althoughspecificunderlyingtechniques
maybecovered.Amongtheunderlyingtechniques,theRC5encryption
algorithm(AppendixB.2.4)isprotectedbyU.S.Patents5,724,428
[22]and5,835,600[23].
RC2andRC5aretrademarksofRSASecurity.
Licensetocopythisdocumentisgrantedprovidedthatitis
identifiedasRSASecurityInc.Public-KeyCryptographyStandards
(PKCS)inallmaterialmentioningorreferencingthisdocument.
RSASecuritymakesnorepresentationsregardingintellectualproperty
claimsbyotherparties.Suchdeterminationistheresponsibilityof
theuser.
修订记录
Versions1.0-1.3
Versions1.0-1.3被分发给在1991年1月和3月参加RSAData
SecurityInc.的公钥密码系统标准会议的与会者。
Version1.4
Version1.4是1991年6月3日PKCS的首次发行的一部分。该版本作为NIST/OSI
Implementors"Workshop文档SEC-SIG-91-20出版。.
Version1.5
Version1.5综合了几处编辑更正,包括对参考书目的修改和修订记录的增加。
Version2.0
Version2.0综合了文档结构方面的主要编辑更正,并引入了PBES2加密方法,PBMAC1消
息认证方法,和独立的基于口令的密钥导出函数。该版本继续支持版本1.5中的加密过程。
参考书目
[1]AmericanNationalStandardX9.52-1998,TripleDataEncryption
AlgorithmModesofOperation.Workingdraft,Accredited
StandardsCommitteeX9,July27,1998.
[2]Baldwin,R.andR.Rivest,"TheRC5,RC5-CBC,RC5-CBC-Pad,and
RC5-CTSAlgorithms",RFC2040,October1996.
[3]Balenson,D.,"PrivacyEnhancementforInternetElectronicMail:
PartIII:Algorithms,Modes,andIdentifiers",RFC1423,
February1993.
[4]S.M.BellovinandM.Merritt.Encryptedkeyexchange:
PassWord-basedprotocolssecureagainstdictionaryattacks.In
Proceedingsofthe1992IEEEComputerSocietyConferenceon
ResearchinSecurityandPrivacy,pages72-84,IEEEComputer
Society,1992.
[5]D.Jablon.Strongpassword-onlyauthenticatedkeyexchange.ACM
ComputerCommunicationsReview,October1996.
[6]Kaliski,B.,"TheMD2Message-DigestAlgorithm",RFC1319,April
1992.
[7]Krawczyk,H.,Bellare,M.andR.Canetti,"HMAC:Keyed-Hashing
forMessageAuthentication",RFC2104,February1997.
[8]RobertMorrisandKenThompson.Passwordsecurity:Acase
history.CommunicationsoftheACM,22(11):594-597,November
1979.
[9]ISO/IEC8824-1:1995:Informationtechnology-AbstractSyntax
NotationOne(ASN.1)-Specificationofbasicnotation.1995.
[10]ISO/IEC8824-1:1995/Amd.1:1995Informationtechnology-Abstract
SyntaxNotationOne(ASN.1)-Specificationofbasicnotation-
Amendment1-Rulesofextensibility.1995.
[11]ISO/IEC8824-2:1995Informationtechnology-AbstractSyntax
NotationOne(ASN.1)-Informationobjectspecification.1995.
[12]ISO/IEC8824-2:1995/Amd.1:1995Informationtechnology-Abstract
SyntaxNotationOne(ASN.1)-Informationobjectspecification-
Amendment1-Rulesofextensibility.1995.
[13]ISO/IEC8824-3:1995Informationtechnology-AbstractSyntax
NotationOne(ASN.1)-Constraintspecification.1995.
[14]ISO/IEC8824-4:1995Informationtechnology-AbstractSyntax
NotationOne(ASN.1)-ParameterizationofASN.1specifications.
1995.
[15]NationalInstituteofStandardsandTechnology(NIST).FIPSPUB
46-2:DataEncryptionStandard.December30,1993.
[16]NationalInstituteofStandardsandTechnology(NIST).FIPSPUB
81:DESModesofOperation.December2,1980.
[17]NationalInstituteofStandardsandTechnology(NIST).FIPSPUB
112:PasswordUsage.May30,1985.
[18]NationalInstituteofStandardsandTechnology(NIST).FIPSPUB
180-1:SecureHashStandard.April1994.
[19]Rivest,R.,"TheMD5Message-DigestAlgorithm",RFC1321,April
1992.
[20]R.L.Rivest.TheRC5encryptionalgorithm.InProceedingsofthe
SecondInternationalWorkshoponFastSoftwareEncryption,pages
86-96,Springer-Verlag,1994.
[21]Rivest,R.,"ADescriptionoftheRC2(r)EncryptionAlgorithm",
RFC2268,March1998.
[22]R.L.Rivest.Block-EncryptionAlgorithmwithData-Dependent
Rotations.U.S.PatentNo.5,724,428,March3,1998.
[23]R.L.Rivest.BlockEncryptionAlgorithmwithData-Dependent
Rotations.U.S.PatentNo.5,835,600,November10,1998.
[24]RSALaboratories.PKCS#5:Password-BasedEncryptionStandard.
Version1.5,November1993.
[25]RSALaboratories.PKCS#8:Private-KeyInformationSyntax
Standard.Version1.2,November1993.
[26]T.Wu.TheSecureRemotePasswordprotocol.InProceedingsof
the1998InternetSocietyNetworkandDistributedSystem
SecuritySymposium,pages97-111,InternetSociety,1998.
[27]Yergeau,F.,"UTF-8,atransformationformatofISO10646",RFC
2279,January1998.
ContactInformation&AboutPKCS
ThePublic-KeyCryptographyStandardsarespecificationsproducedby
RSALaboratoriesincooperationwithsecuresystemsdevelopers
worldwideforthepurposeofacceleratingthedeploymentofpublic-
keycryptography.Firstpublishedin1991asaresultofmeetings
withasmallgroupofearlyadoptersofpublic-keytechnology,the
PKCSdocumentshavebecomewidelyreferencedandimplemented.
ContributionsfromthePKCsserieshavebecomepartofmanyformal
anddefactostandards,includingANSIX9documents,PKIX,SET,
S/MIME,andSSL.
FurtherdevelopmentofPKCSoccursthroughmailinglistdiscussions
andoccasionalworkshops,andsuggestionsforimprovementare
welcome.Formoreinformation,contact:
PKCSEditor
RSALaboratories
20CrosbyDrive
Bedford,MA01730USA
pkcs-editor@rsasecurity.com
http://www.rsalabs.com/pkcs/
全部版权声明
Copyright(C)TheInternetSociety(2000).AllRightsReserved.
Thisdocumentandtranslationsofitmaybecopiedandfurnishedto
others,andderivativeworksthatcommentonorotherwiseeXPlainit
orassistinitsimplementationmaybeprepared,copied,published
anddistributed,inwholeorinpart,withoutrestrictionofany
kind,providedthattheabovecopyrightnoticeandthisparagraphare
includedonallsuchcopiesandderivativeworks.However,this
documentitselfmaynotbemodifiedinanyway,suchasbyremoving
thecopyrightnoticeorreferencestotheInternetSocietyorother
Internetorganizations,exceptasneededforthepurposeof
developingInternetstandardsinwhichcasetheproceduresfor
copyrightsdefinedintheInternetStandardsprocessmustbe
followed,orasrequiredtotranslateitintolanguagesotherthan
English.
Thelimitedpermissionsgrantedaboveareperpetualandwillnotbe
revokedbytheInternetSocietyoritssuccessorsorassigns.
Thisdocumentandtheinformationcontainedhereinisprovidedonan
"ASIS"basisandTHEINTERNETSOCIETYANDTHEINTERNETENGINEERING
TASKFORCEDISCLAIMSALLWARRANTIES,EXPRESSORIMPLIED,INCLUDING
BUTNOTLIMITEDTOANYWARRANTYTHATTHEUSEOFTHEINFORMATION
HEREINWILLNOTINFRINGEANYRIGHTSORANYIMPLIEDWARRANTIESOF
MERCHANTABILITYORFITNESSFORAPARTICULARPURPOSE.
Acknowledgement
FundingfortheRFCEditorfunctioniscurrentlyprovidedbythe
InternetSociety.



网友评论
评论
发 布

更多软件教程
  • 软件教程推荐
更多+
Greenfoot设置中文的方法

Greenfoot设置中文的方法

Greenfoot是一款简单易用的Java开发环境,该软件界面清爽简约,既可以作为一个开发框使用,也能够作为集成开发环境使用,操作起来十分简单。这款软件支持多种语言,但是默认的语言是英文,因此将该软件下载到电脑上的时候,会发现软件的界面语言是英文版本的,这对于英语基础较差的朋友来说,使用这款软件就会...

07-05

Egret UI Editor修改快捷键的方法

Egret UI Editor修改快捷键的方法

Egret UI Editor是一款开源的2D游戏开发代码编辑软件,其主要功能是针对Egret项目中的Exml皮肤文件进行可视化编辑,功能十分强大。我们在使用这款软件的过程中,可以将一些常用操作设置快捷键,这样就可以简化编程,从而提高代码编辑的工作效率。但是这款软件在日常生活中使用得不多,并且专业性...

07-05

KittenCode新建项目的方法

KittenCode新建项目的方法

KittenCode是一款十分专业的编程软件,该软件给用户提供了可视化的操作界面,支持Python语言的编程开发以及第三方库管理,并且提供了很多实用的工具,功能十分强大。我们在使用这款软件进行编程开发的过程中,最基本、最常做的操作就是新建项目,因此我们很有必要掌握新建项目的方法。但是这款软件的专业性...

07-05

Thonny设置中文的方法

Thonny设置中文的方法

Thonny是一款十分专业的Python编辑软件,该软件界面清爽简单,给用户提供了丰富的编程工具,具备代码补全、语法错误显示等功能,非常的适合新手使用。该软件还支持多种语言,所以在下载这款软件的时候,有时候下载到电脑中的软件是英文版本的,这对于英语基础较差的小伙伴来说,使用这款软件就会变得十分困难,...

07-05

最新软件下载