组织:中国互动出版网(http://www.china-pub.com/)
RFC文档中文翻译计划(http://www.china-pub.com/compters/emook/aboutemook.htm)
E-mail:[email protected]
译者:徐孜骏(happygogo [email protected])
译文发布时间:2001-7-14
版权:本中文翻译文档版权归中国互动出版网所有。可以用于非商业用途自由转载,但必须保留本文档的翻译及版权信息。
Network Working Group
Request for Comments: 2313
Category: Informational
B. Kaliski
RSA Laboratories East
March 1998
备忘录状态
本备忘录为Internet社区提供了信息。它没有讲述任何一种Internet标准.本备忘录的发布不受任何限制。
版权信息
Copyright (C) The Internet Society (1998). 保留所有权利。
略读
此篇文章描述了如何使用RSA公钥密码体系加密数据。
1、范围
此篇文档描述了如何使用RSA公钥密码体系加密数据。这将被用作数字签名和数字信封,且在PKCS#7中有描述:
此篇文档还描述了有关一个RSA公钥和私钥的语法。公钥语法被用于证书;私钥语法被用于PKCS#8中的私钥信息。公钥语法在X.509和PEM是完全相同的。这样X.509/PEM RSA密钥能被用于此篇文当中。
此篇文档还定义了三个签名算法,它们被用于签署X.509/PEM证书和CRL,PKCS#6扩展证书,和其他使用数字签名的对象(例如X.401消息标记)。有关消息散列和内容加密算法的细节并不属于此篇文档的范围,并且有关被文档要求的假随机位的来源也不在此文档范围中。
2、参考
3、定义
由于此篇文档的目的,下列定义将被使用。
4、标志和缩写
大写标志(例如BT)表示字符串和位串(就签名S而言),小写标志(例如c)表示整数。
ab 16进制8位组值 c 指数
BT 块类型 d 私人指数
D 数据 e 公开指数
EB 需加密块 k 模数的8位组长度
ED 被加密的数据 n 模数
M 消息 p, q 模数的素数组成
MD 消息散列 x 整数需加密块
MD' 比较的消息散列 y 整数被加密数据
PS 填充字符串 mod n 模 n
S 签名 X || Y X,Y的级连
||X|| X字节长
5、总的概述
下面的六个章节详细的叙述了密钥生成,密钥语法,加密过程,解密过程,签名算法和对象标识符。每个实体都要生成一对密钥:公钥和私钥。加密过程需要使用其中一个密钥,解密过程需要使用另一个密钥。所以加密过程或是一个公钥操作过程或是一个私钥操作过程,解密过程也一样。这两种过程都是把一个8位字符串转化成另一个8位字符串。这两个过程是互相相反的,如果一个过程使用了一个实体的公钥,那么另一个过程使用同一实体的私钥。加密和解密过程或是能实现典型的RSA转换,或是实现填充变换。
6、密钥生成
此章节描述RSA密钥生成。每个实体都需要选择一个正整数e作为它的公开指数。每个实体都需要私人的随机的选择两个不同的奇素数p和q,以便e和(p-1)*(q-1)互素。公开模数n是私人的素数p,q的乘积:n=p*q 。私人指数是一个正整数d,以便d*e-1可以被(p-1)*(q-1)整除。模数n的字节长为k,k满足2^(8(k-1)) <= n < 2^(8k)。模数长度k必须是至少12个字节,使之适应此文档中的块格式(见第8章)。
注意:
7、密钥语法
此章节给出了RSA公钥和私钥的语法
7.1 公钥语法
一个RSA公钥需要有ASN.1的RSAPublicKey类型:
RSAPublicKey ::= SEQUENCE {
modulus INTEGER, -- n
publicExponent INTEGER -- e }
(这个类型被定义于X.509中,保留在此处是为了兼容性。)
RSAPublicKey类型的字段有下列含义:
modulus是模数n;
publicExponent是公开指数e。
7.2 私钥语法
一个RSA私钥有一个ASN.1的RSAPrivateKey类型:
RSAPrivateKey ::= SEQUENCE {
version Version,
modulus INTEGER, -- n
publicExponent INTEGER, -- e
privateExponent INTEGER, -- d
prime1 INTEGER, -- p
prime2 INTEGER, -- q
exponent1 INTEGER, -- d mod (p-1)
exponent2 INTEGER, -- d mod (q-1)
coefficient INTEGER -- (inverse of q) mod p }
Version ::= INTEGER
RSAPrivateKey类型的字段有下列含义:
注意:
8、加密过程
此章节描述了RSA的加密过程。
加密过程包括4个步骤:加密块格式化,8位字符串到整数的转化,RSA计算,整数到8位字符串的转化。加密过程的输入为数据8位字符串,模数n,指数c。对于公钥操作来说,整数c是实体的公开指数e;对于私钥操作来说,整数c是实体的私人指数d。加密过程的输出为被加密的数据,一个8位字符串ED。
数据D的长度不应该长于k-11个8位字节,其必为正数,因为模数的长度k是至少12个8位字节。这种限制保证了填充串PS的长度至少为8个8位字节,这是一项安全措施。
注意:
8.1 加密块格式化
加密块是一个8位字节串EB,由块标记BT,填充块PS和数据D组成。
EB = 00 || BT || PS || 00 || D (1)
块标记BT是一个标记字节,表示加密块的结构。对于此文档的版本,它有00,01,或02值。私钥操作为00,或01;公钥操作为02。
填充串PS为k-3-||D||长的8位字节字符串。对于00型,填充串为00;对于01型,填充串为ff;对于02型,填充串为假散列生成的非0值。这使得加密块EB的长度为k。
注意:
8.2 8位字节串到整数的转换
加密块EB需要被转化为一个整数x,即整数加密块。从头到尾让EB1, ..., Ebk组成EB字节串。然后整数x应该满足:
k
x = SUM 2^(8(k-i)) EBi (2)
i = 1
换句话来说,EB的第一个字节在整数中意义最重大,最后一个字节的重要性最低。
注意:因为EB1 = 00并且 2^(8(k-1)) <= n,所以整数加密块x满足0 <= x < n。
8.3 RSA计算
整数加密块x需要被求c次方幂,然后模n,最后被赋给整数y,即整数被加密数据。
y = x^c mod n, 0 <= y < n
这是一个典型的RSA计算。
8.4 整数到字节串的转换
整数被加密数据y需要被转换成一个长度k的8位字节串ED,即被加密数据。被加密数据应该满足:
k
y = SUM 2^(8(k-i)) EDi (3)
i = 1
这里ED1, ..., Edk就是字节串ED的组成。
换句话说,ED的第一个字节在整数中最为重要,ED的最后一个字节重要性最低。
9、解密过程
此章节描述了RSA解密过程。
解密过程包含4个步骤:字节串到整数的转换,RSA计算,整数到字节串的转换,和需加密块解析。解密过程的输入是一个8位字节串ED,即被加密数据;模数n;指数c。对一个公钥操作来说,整数c是一个实体的公开指数e;对一个私钥操作来说,整数c是一个实体的私人指数d。解密过程的输出是一个8位字节串D,即原始数据。
如果被加密数据ED的长度不是k,则为错误。
简短来说,解密过程是根据加密过程来描述的。
9.1 字节串到整数的转换
被加密的数据ED根据等式(3)被转化成整数被加密数据y。
如果整数被加密数据不满足0 <= y < n,则为错误。
9.2 RSA计算
整数被加密数据y需要被求c次方幂,然后模n,最后被赋给整数x,即整数需加密块。
x = y^c mod n, 0 <= x < n
这是一个典型的RSA计算。
9.3 整数到字节串的转换
整数需加密块x根据等式(2)被转化成一个长度k的8位字节串EB,即需加密块。
9.4 需加密块解析
需加密块EB根据等式(1)被解析成一个由块标记BT,填充块PS和数据D组成的数据块。
如果有下列情况发生,则为错误:
10、签名算法
本章定义了3个基于被描述在第8、9章中的RSA加密过程的签名算法。签名算法主要被用于签署X.509/PEM证书,CRL,PKCS #6扩展证书,以及其他使用数字签名的对象,例如X.401消息环。算法并被特意用来构建PKCS #7的数字签名。第一个签名算法把MD2散列算法和RSA结合起来(简称MD2 with RSA);第二个签名算法把MD4散列算法和RSA结合起来(简称MD4 with RSA);第三个签名算法把MD5散列算法和RSA结合起来(简称MD5 with RSA)。
本章节描述了两个算法的签名过程和验证过程。所选的散列算法取决于签名算法,MD2或MD5。签名过程使用一个实体的私钥;而验证过程使用一个实体的公钥。签名过程把一个8位字节串(消息)转化成一个位串(签名);而验证过程检验一个位串(签名)是否为一个8位字节串(消息)的签名。
注意:被定义在此的签名算法和在PKCS #7中构建签名的方法(加密消息散列)之间的仅有的不同是此处的签名用位串表示,这和X.509 SIGNED宏是一致的。在PKCS #7中被加密的消息散列是8位字节串。
10.1 签名过程
签名过程包括4个步骤:消息散列,数据编码,RSA加密和8位字节串到位串的转换。签名过程的输入是一个8位字节串M,即消息;签名者的私人密钥。其输出是一个位串S,即签名。
10.1.1 消息散列
使用所选的消息散列算法来散列消息M,得到一个8位字节串MD,即消息散列。
10.1.2 数据编码
消息散列MD和消息散列算法标识符组成了以下描述的ASN.1类型DigestInfo的值,此类型将通过BER编码来生成一个8位字节串D,即原始数据。
DigestInfo ::= SEQUENCE {
digestAlgorithm DigestAlgorithmIdentifier,
digest Digest }
DigestAlgorithmIdentifier ::= AlgorithmIdentifier
Digest ::= OCTET STRING
类型DigestInfo的域有下列含义:
digestAlgorithm表示用于散列的算法(以及相关参数)。对应用程序来说,它标识了所选的散列算法,MD2,MD4或MD5。作为参考,以下是相关的对象标识符:
md2 OBJECT IDENTIFIER ::=
{ iso(1) member-body(2) US(840) rsadsi(113549)
digestAlgorithm(2) 2 } md4 OBJECT IDENTIFIER ::=
{ iso(1) member-body(2) US(840) rsadsi(113549)
digestAlgorithm(2) 4 } md5 OBJECT IDENTIFIER ::=
{ iso(1) member-body(2) US(840) rsadsi(113549)
digestAlgorithm(2) 5 }
对这些对象标识符来说,散列算法的参数域是空。
digest是消息散列过程的结果,例如消息散列MD。
注意:
10.1.3 RSA加密
正如在第7章中描述的数据D被签名者的RSA私钥加密,生成一个8位字节串ED,即被加密的数据。其块标记为01(见8.1节)。
10.1.4 8位字节串到位串的转换
被加密数据ED被转换成一个位串S,即签名。具体来说,被加密数据的第一个字节的第一位成为签名的第一个数据位,以此类推,直到被加密数据的最后一个字节的最后一位,它将变成签名的最后一个数据位。
注意:签名S的位长度是8的倍数。
10.2 验证过程
验证过程包括四个步骤:位串到字节串的转换,RSA解密,数据解码,消息散列和比较。验证过程的输入是字节串M,即消息;签名者的公钥;位串S,即签名。其输出是验证成功或失败的标记号。
10.2.1 位串到字节串的转换
签名S被转换成字节串ED,即被加密的数据。具体来说,假设S的位长度是8的倍数,S的第一位将变成字节串的第一个字节的第一位,以此类推,直到签名的最后一位变成字节串的最后一个字节的最后一位。如果签名的位长度不是8的倍数,则是错误。
10.2.2 RSA解密
正如在第8章节中描述的使用签名者的公钥对被加密数据ED进行解密,得到字节串D,即原始数据。如果在解密过程中恢复的块标记位不是01,则是错误的(见9.4节)。
10.2.3 数据解码
原始数据D将被BER解码为类型DigestInfo的ASN.1值,此值被分成消息散列MD和消息散列算法标识符。消息散列算法标识符决定了下一步所选的消息散列算法。如果消息散列算法标识符不是MD2,MD4或MD5消息散列算法,则为错误。
10.2.4 消息散列和比较
使用所选的消息散列算法对消息M进行散列,得到字节串MD`,即将进行比较的消息散列。如果MD`和MD相同,则表示验证成功,否则为失败。
11、对象标识符
本文档定义了5个对象标识符:pkcs-1,rsaEncryption,md2WithRSAEncryption,md4WithRSAEncryption和md5WithRSAEncryption。
对象标识符pkcs-1等同于本篇文档。
pkcs-1 OBJECT IDENTIFIER ::=
{iso(1) member-body(2) US(840) rsadsi(113549)pkcs(1) 1 }
对象标识符rsaEncryption等同于定义在第7章节中的RSA公/私钥和定义在第8、9章节中的RSA加/解密过程。
rsaEncryption OBJECT IDENTIFIER ::= { pkcs-1 1 }
rsaEncryption对象标识符被用于AlgorithmIdentifier类型的algorithm域的一个值。此类型的parameters域有算法特定的语法ANY DEFINED BY algorithm,在rsaEncryption算法中,其值为空。
对象标识符md2WithRSAEncryption,md4WithRSAEncryption和md5WithRSAEncryption各自表示定义在第10章节中的MD2 with RSA,MD4 with RSA和MD5 with RSA签名及验证过程。
md2WithRSAEncryption OBJECT IDENTIFIER ::= { pkcs-1 2 }
md4WithRSAEncryption OBJECT IDENTIFIER ::= { pkcs-1 3 }
md5WithRSAEncryption OBJECT IDENTIFIER ::= { pkcs-1 4 }
这些对象标识符被用于AlgorithmIdentifier类型中的algorithm域的一个值。此类型的parameters域有算法特定的语法ANY DEFINED BY algorithm,在此三个算法中,其值为空。
注意:X.509的对象标识符rsa也表示定义在第7章节中的RSA公钥,但并不表示私钥,并且表示不同的加/解密过程。一些应用程序期望将鉴别RSA公钥。这些公钥和本文档是兼容的,使用RSA公钥的rsaEncryption过程等同于使用rsaEncryption公钥的rsaEncryption过程。
安全考虑
安全内容在此备忘录中讨论。
修订版记录
版本1.0-1.3
此版本在1991的2月和3月被分发给RSA Data Security, Inc.的 Public-Key Cryptography Standards会议的参加者。
版本1.4
此版本是在1991.6.3的第一次公开发布的PKCS中的一部分内容,并被发行作为NIST/OSI Implementors的工作组文档SEC-SIG-91-18。
版本1.5
此版本包括了几处改变,其中有参考的更新和修订版记录的增加。下列是几处实质的改变:
代替1991.6.3的版本,它也被作为NIST/OSI Implementors的工作组文档SEC-SIG-91-18。
鸣谢
本文档基于RSA Data Security, Inc.的一个部门RSA Laboratories的撰稿。任何实质的使用本文档都必须感谢RSA Data Security, Inc.。RSA Data Security, Inc.要求所有对此文档的资料的阐述和参考都必须表示为RSA Data Security, Inc. PKCS #1。
作者地址
Burt Kaliski
RSA Laboratories East
20 Crosby Drive
Bedford, MA 01730
Phone: (617) 687-7000
EMail: [email protected]
版权声明
Copyright (C) The Internet Society (1998). All Rights Reserved.
This document and translations of it may be copied and furnished to others, and derivative works that comment on or otherwise explain it or assist in its implementation may be prepared, copied, published and distributed, in whole or in part, without restriction of any kind, provided that the above copyright notice and this paragraph are included on all such copies and derivative works. However, this document itself may not be modified in any way, such as by removing the copyright notice or references to the Internet Society or other Internet organizations, except as needed for the purpose of developing Internet standards in which case the procedures for copyrights defined in the Internet Standards process must be followed, or as required to translate it into languages other than English. The limited permissions granted above are perpetual and will not be revoked by the Internet Society or its successors or assigns.
This document and the information contained herein is provided on an "AS IS" basis and THE INTERNET SOCIETY AND THE INTERNET ENGINEERING TASK FORCE DISCLAIMS ALL WARRANTIES, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO ANY WARRANTY THAT THE USE OF THE INFORMATION HEREIN WILL NOT INFRINGE ANY RIGHTS OR ANY IMPLIED WARRANTIES OF MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE.