1.1 PKCS#1签名

被签名的数据为字节数组。对给出的被签名原数据进行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字节(与密钥长度相同)。

------------------------------------------------------------------------------------------

•PKCS#1签名就是按照PKCS#1标准中的编码标准,先将原文摘要按照一定标准进行封装和补位再做签名运算,
如SHA1withRSA签名:RSA(Padding(DigestAlgorithmIdentifier+hash(msg)))这种格式称为PKCS1Padding,
NoPadding的签名则没有补位,直接对摘要值做签名运算:RSA(hash(msg))。
•裸签名(RAWSign),裸签名不严格的讲,包含PKCS1Padding签名和NoPadding格式的签名,严格的讲,应该专指NoPadding的签名。
•RAW签名,属于PKCS#1标准的签名,验签时也可以支持验证NoPadding的签名。
签名流程:

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字节

1.2 PKCS#1验签

从接收签名结果记为SIGN,签名原数据为DATA,验签公钥为pbk,则验证签名的流程为:

1) 使用公钥对签名结果作RSA公钥解密运算并去掉填充:  H’ = RSApbk(SIGN)

2) 对签名原数据作HASH运算:H = SHA(DATA)

3) 比较H与H’,如相等,则验证正确,否则验证错误。

2.1 PKCS#7签名

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。

2.2   PKCS#7验签

设待验证的签名为signedData,签名原数据为DATA,则验证签名的流程为:

1)从signedData中提取签名者证书序列号等信息,按证书序列号获取签名者证书并检验证书的有效性(在签名中提取证书或通过LDAP下载证书);

2)从证书中提取签名者公钥(pbk),使用公钥对签名结果作RSA公钥解密运算并去掉填充: H’ = RSApbk(DS)

3)对签名原数据作HASH运算: H = SHA(DATA)

4)比较H与H’,如相等,则验证正确,否则验证错误。

3.1     数字信封

数字信封用于通信双方交换数据。发送方生成一个随机的报文密钥,使用报文密钥对发送内容进行加密(对称算法),再用接收方的公钥对报文密钥加密,最后将加密的报文密钥和加密的发送内容按PKCS#7标准,编码组成一个“数字信封”。发送方还可以为发送内容附加签名。

数字信封的格式,见表2、表3:

表2  数字信封格式(不带签名)

数 字 信 封 格 式 (不带签名)

版本号

0

接收者信息

版本号

证书序列号

对密钥的加密算法标识

加密的报文密钥

加密内容信息

数据类型

数据加密算法标识

加密的内容

表3  数字信封格式(带签名)[G2]

数 字 信 封 格 式 (带签名)

版本号

0

接收者信息

版本号

证书序列号

对密钥的加密算法标识

加密的报文密钥

信息摘要算法

算法标识

加密内容信息

数据类型

数据加密算法标识

加密的内容(使用报文密钥加密)

证书

签名者证书和签发者证书(可选)

签名者信息

版本号(1)

签名者证书序列号

签名时间

签名算法

加密的签名值(使用报文密钥加密)

其它属性

数字信封制作过程:

1)随机生成报文密钥mk;

2)用接收方公钥对mk加密(按PKCS#1标准);

3)使用mk对发送内容加密;

4)如果需要签名,则执行如下步骤:

a) 对发送内容作数字签名(见数字签名过程,但不作编码);

b) 使用mk为密钥对签名进行加密;

5)按格式编码构成数字信封。

3.2 解数字信封

接收方从数字信封中解出所需的内容,并验证发送方的签名(如果有的话)。

解数字信封的过程:

1)使用接收者自已的私钥解出mk;

2)使用mk为密钥解密传送的内容;

3)如果存在签名,则执行:

a) 使用mk为密钥解出签名值;

b) 验证签名。

PKCS1签名、PKCS7签名、PKCS数字信封相关推荐

  1. PKCS1签名PKCS7签名PKCS7信封格式

    PKCS1签名&PKCS7签名&PKCS7信封格式 1.1.1.1  PKCS#1标准格式签名 1.1.1.1.1 PKCS#1签名格式 被签名的数据为字节数组. 对给出的被签名原数据 ...

  2. PKCS7带签名的数字信封

    结构体和示例说明 p7.pem文本内容示例: -----BEGIN PKCS7----- MIIFDAYKKoEcz1UGAQQCBKCCBPwwggT4AgEBMYIBJzCCASMCAQAwgZA ...

  3. 签名证书、数字签名和数字信封

    签名证书 作为文件形式存在的证书一般有这几种格式:   1.带有私钥的证书    由Public Key Cryptography Standards #12,PKCS#12标准定义,包含了公钥和私钥 ...

  4. 创建为ClickOnce清单签名的.pfx格式数字证书

    创建为ClickOnce清单签名的.pfx格式数字证书 使用vs2005自动创建的.pfx数字证书默认有效期只有一年,并且"颁发者"."颁发给"均为当前机器名和 ...

  5. Taproot升级在即!门限签名技术将给数字钱包带来什么?

    继四年前比特币隔离见证升级之后,今年十一月份的BTC Taproot升级将为比特币带来巨大的技术革新. Taproot是什么?GregoryMaxwell的原始Taproot提案标题是这样说的:Tap ...

  6. PKCS7数字信封简述

    1.数字信封的概念 数字信封,英文是Digital Envelope,望文生义,就可以知道将需要传递的数据,通过加密的方式包裹起来. 数字信封的准确定义,在<PKCS #7: Cryptogra ...

  7. java p7 数字签名,p7结构的数字信封 | 学步园

    PKCS7的数字信封格式分为两种:带签名的数字信封和不带签名的数字信封.由于这个数字信封的生成过程比较复杂,所以这两种格式比较容易记混,导致都搞不清楚一个数字信封里面到底是存储的什么内容了.下面我就详 ...

  8. 数字信封的介绍2.0:定义,优点,原理

    1.什么是数字信封? 数字信封是将对称密钥通过非对称加密(即:有公钥和私钥两个)的结果分发对称密钥的方法. PKCS#7中数字信封包含被加密的内容和被加密的用于加密该内容的密钥. 通常使用接收方的公钥 ...

  9. 数字签名与数字信封流程

    数字签名 数字签名(Digital Signature)(又称公钥数字签名.电子签章)是一种类似写在纸上的普通的物理签名,背后的思想是模仿传统手写签名,但是使用了公钥加密领域的技术实现,用于鉴别数字信 ...

最新文章

  1. run loop详解
  2. 我看team work
  3. [CQOI]九连环(FFT优化+高精)
  4. android软件自动启动软件下载,Android编程实现应用程序开机自启动的方法
  5. 为什么excel图片会变成代码_会EXCEL便可定制自己的办公管理软件(超简单,无代码)...
  6. SQL Server 2019中的行模式内存授予反馈
  7. [译]Razor内幕之介绍
  8. 标签条码打印机开发大纲
  9. Redis缓存雪崩,如何解决?
  10. paypal如何支付欧元_涨姿势!Paypal怎么用?
  11. 智点软件定制**服装工厂衣服加工计件工资软件的方案
  12. arduino 超声波测距原理_基础教程10 Arduino 超声波测距
  13. Java游戏吉他英雄_《吉他英雄》全系列十作美版下载
  14. 点击pv转化率_互联网中一些常用指标(PV、UV、蹦失率、转换率、退出率)
  15. Detecting Spacecraft Anomalies Using LSTMs and Nonparametric Dynamic Thresholding
  16. DesignWare USB 2.0 OTG Controller (DWC_otg) Device Driver File List
  17. 十二星座分手时会怎么说?
  18. Vuex - 持久化
  19. “华为云企业级Java编程规范”学习笔记
  20. 基于Hadoop安装spark集群

热门文章

  1. Linux各种文件系统(ext3,ReiserFS,jfs,xfs)的性能
  2. 谷粒商城:秒杀商品定时上架
  3. Java小游戏之捕鱼达人001.JavaGUI
  4. 50道简单python函数题_Python练习题 函数设计(55~67)一
  5. flex froggy 青蛙跳荷叶的小游戏答案
  6. 【C++】医学影像PACS管理系统源码支持三维图像后处理和重建
  7. Hive 观看时长秒数、毫秒数转化为时分秒格式
  8. python 中*/**的用法
  9. Redis 之 WRONGTYPE Operation against a key holding the wrong kind of value【bug解决】
  10. 科技云报道:2021年,隐私计算进入商业落地元年