被签名的数据为字节数组。
对给出的被签名原数据进行HASH运算,HASH结果按PKCS#1标准进行填充:
B = 00 01 ff ff … ff 00 30 … H[00],H[01],…,H[13]
其中H[00],…,H[13]为HASH结果。
再使用用户的私钥对填充后的数据块作RSA运算,得到的结果即为PKCS#1格式签名值。当使用1024位的RSA算法进行签名时,签名结果长度为128字节(与密钥长度相同)。
-------------------------------------------------------------------------------------------------------------------------------------------------
1) 用SHA-1摘要算法对需要签名的数据(DATA)进行HASH运算,生成20字节HASH结果:
H = SHA(DATA) H为20字节
2) 按PKCS#1标准对HASH结果作填充;
B = 00 01 ff ff … ff 00
30 21 30 09 06 05 2B 0E 03 02 1A 05 00 04 14
H[00],H[01],…,H[13]
3) 使用私钥(记作pvk)对填充后的数据块作RSA运算,生成128字节签名结果:
SIGN = RSApvk(B) SIGN为128字节
从接收签名结果记为SIGN,签名原数据为DATA,验签公钥为pbk,则验证签名的流程为:
1) 使用公钥对签名结果作RSA公钥解密运算并去掉填充:
H’ = RSApbk(SIGN)
2) 对签名原数据作HASH运算:
H = SHA(DATA)
3) 比较H与H’,如相等,则验证正确,否则验证错误。
PKCS#7签名是在PKCS#1签名的基础上增加了签名者信息等内容后,并进行DER编码后的数据结构。其结构如表1所示:
表1 PKCS#7数字签名格式表
PKCS#7 数 字 签 名 格 式 |
|
版本号 |
1 |
信息摘要算法标识 |
|
被签名内容信息 |
数据类型 |
被签名内容(可选) |
|
证书 |
签名者证书和签发者证书(可选) |
CRLs |
证书作废链(可选) |
签名者信息 |
版本号(1) |
证书序列号 |
|
信息摘要算法标识 |
|
签名时间(可选) |
|
签名算法标识 |
|
签名值 |
在数字签名结果中可以包含被签名数据(称为Attach方式)或不包含被签名数据(称为Detach方式);在数字签名结果中可以包含签名者证书也可以不包含签名者证书。
“签名值”是通过私钥对“被签名内容”和其它可认证属性进行签名运算的结果。因此,在上述签名格式中的证书、CLRs、被签名内容等可以从已生成的签名结果中删除或重新插入。一般情况下,签名格式根据下面的需要进行选择:
1) 需要保存在数据库中的数字签名与被签名原数据采用分离的方式进行存放,即在“被签名内容信息”内不含实际的“被签名内容”,被签名内容存放在数据库其它地方。
2) 不包含签名者证书,可以减少签名数据大小,但在验证时需要查找证书。
3) 需要在网络上传输(例如与其它系统交换数据)的数字签名,在签名包中可以包含被签名数据和签名者证书。
数字签名前要对数据使用SHA-1或SM3数据摘要算法作HASH运算,再用用户的签名私钥作RSA运算,结果即为对数据的“数字签名”。下面的DATA为待签名数据,HASH(…)为HASH函数,SIGN(…)为签名运算函数,DS为签名结果。数字签名过程为:
1)对数据作HASH运算:
H = SHA(DATA) H为20字节
2)按PKCS#1标准对HASH结果作填充;
B = 00 01 00 ff ff … ff 00 30 … H[00],H[01],…,H[13]
3)使用用户的私钥(pvk)对填充后的数据块作RSA运算。
DS = RSApvk(B) DS为128字节
4)按PKCS#7标准格式对签名进行编码,得到的结果记为signedData。
设待验证的签名为signedData,签名原数据为DATA,则验证签名的流程为:
1)从signedData中提取签名者证书序列号等信息,按证书序列号获取签名者证书并检验证书的有效性(在签名中提取证书或通过LDAP下载证书);
2)从证书中提取签名者公钥(pbk),使用公钥对签名结果作RSA公钥解密运算并去掉填充:
H’ = RSApbk(DS)
3)对签名原数据作HASH运算:
H = SHA(DATA)
4)比较H与H’,如相等,则验证正确,否则验证错误。
数字信封用于通信双方交换数据。发送方生成一个随机的报文密钥,使用报文密钥对发送内容进行加密(对称算法),再用接收方的公钥对报文密钥加密,最后将加密的报文密钥和加密的发送内容按PKCS#7标准,编码组成一个“数字信封”。发送方还可以为发送内容附加签名。
数字信封的格式,见表2、表3:
表2 数字信封格式(不带签名)
数 字 信 封 格 式 (不带签名) |
|
版本号 |
0 |
接收者信息 |
版本号 |
证书序列号 |
|
对密钥的加密算法标识 |
|
加密的报文密钥 |
|
加密内容信息 |
数据类型 |
数据加密算法标识 |
|
加密的内容 |
表3 数字信封格式(带签名)[G2]
数 字 信 封 格 式 (带签名) |
|
版本号 |
0 |
接收者信息 |
版本号 |
证书序列号 |
|
对密钥的加密算法标识 |
|
加密的报文密钥 |
|
信息摘要算法 |
算法标识 |
加密内容信息 |
数据类型 |
数据加密算法标识 |
|
加密的内容(使用报文密钥加密) |
|
证书 |
签名者证书和签发者证书(可选) |
签名者信息 |
版本号(1) |
签名者证书序列号 |
|
签名时间 |
|
签名算法 |
|
加密的签名值(使用报文密钥加密) |
|
其它属性 |
数字信封制作过程:
1)随机生成报文密钥mk;
2)用接收方公钥对mk加密(按PKCS#1标准);
3)使用mk对发送内容加密;
4)如果需要签名,则执行如下步骤:
a) 对发送内容作数字签名(见数字签名过程,但不作编码);
b) 使用mk为密钥对签名进行加密;
5)按格式编码构成数字信封。
接收方从数字信封中解出所需的内容,并验证发送方的签名(如果有的话)。
解数字信封的过程:
1)使用接收者自已的私钥解出mk;
2)使用mk为密钥解密传送的内容;
3)如果存在签名,则执行:
a) 使用mk为密钥解出签名值;
b) 验证签名。