0%

安全算法介绍

md5

MD5消息摘要算法(英语:MD5 Message-Digest Algorithm),一种被广泛使用的密码散列函数,可以产生出一个128位(16个字符(BYTES))的散列值(hash value)

1996年后被证实存在弱点,可以被加以破解,对于需要高度安全性的资料,专家一般建议改用其他算法,如SHA-2。2004年,证实MD5算法无法防止碰撞攻击,因此不适用于安全性认证,如SSL公开密钥认证或是数字签名等用途。

缺陷

2009年,中国科学院的谢涛和冯登国仅用了220.96的碰撞算法复杂度,破解了MD5的碰撞抵抗,该攻击在普通计算机上运行只需要数秒钟[3]。2011年,RFC 6151 禁止MD5用作密钥散列消息认证码

sha

  • **SHA-0**:1993年发布,当时称做安全散列标准(Secure Hash Standard),发布之后很快就被NSA撤回,是SHA-1的前身。

  • **SHA-1**:1995年发布,SHA-1在许多安全协议中广为使用,包括TLSGnuPGSSHS/MIMEIPsec,是MD5的后继者。但SHA-1的安全性在2010年以后已经不被大多数的加密场景所接受。2017年荷兰密码学研究小组CWI和Google正式宣布攻破了SHA-1[1]

  • **SHA-2**:2001年发布,包括SHA-224、SHA-256、SHA-384、SHA-512、SHA-512/224、SHA-512/256。SHA-2目前没有出现明显的弱点。虽然至今尚未出现对SHA-2有效的攻击,但它的算法跟SHA-1基本上仍然相似。

  • **SHA-3**:2015年正式发布,由于对MD5出现成功的破解,以及对SHA-0和SHA-1出现理论上破解的方法,NIST感觉需要一个与之前算法不同的,可替换的加密散列算法,也就是现在的SHA-3。

sha 家族函数对比

SHA函数对比
算法和变体 输出散列值长度
(bits)
中继散列值长度
(bits)
资料区块长度
(bits)
最大输入消息长度
(bits)
循环次数 使用到的运算符 碰撞攻击
(bits)
性能示例[3]
(MiB/s)
MD5(作为参考) 128 128
(4 × 32)
512 无限[4] 64 And, Xor, Rot, Add (mod 232), Or ≤18
(发现碰撞)
335
SHA-0 160 160
(5 × 32)
512 264 − 1 80 And, Xor, Rot, Add (mod 232), Or <34
(发现碰撞)
-
SHA-1 160 160
(5 × 32)
512 264 − 1 80 <63[5]
(发现碰撞[6]
192
SHA-2 SHA-224
SHA-256
224
256
256
(8 × 32)
512 264 − 1 64 And, Xor, Rot, Add (mod 232), Or, Shr 112
128
139
SHA-384
SHA-512
SHA-512/224
SHA-512/256
384
512
224
256
512
(8 × 64)
1024 2128 − 1 80 And, Xor, Rot, Add (mod 264), Or, Shr 192
256
112
128
154
SHA-3 SHA3-224
SHA3-256
SHA3-384
SHA3-512
224
256
384
512
1600
(5 × 5 × 64)
1152
1088
832
576
无限[7] 24[8] And, Xor, Rot, Not 112
128
192
256
-
SHAKE128
SHAKE256
d (arbitrary)
d (arbitrary)
1344
1088
min(d/2, 128)
min(d/2, 256)
-

CRC

循环冗余校验(英语:Cyclic redundancy check,通称“CRC”)是一种根据网络数据包或电脑文件等数据产生简短固定位数校验码的一种散列函数,主要用来检测或校验数据传输或者保存后可能出现的错误。

常用CRC(按照ITU-IEEE规范)

名称 多项式 表示法:正常或者翻转
CRC-1
(用途:硬件,也称为奇偶校验位
0x1 or 0x1 (0x1)
CRC-5-CCITT ITU G.704标准) 0xB(0x??)
CRC-5-USB (用途:USB信令包) 0x5 or 0x14 (0x9)
CRC-7 (用途:通信系统) 0x9 or 0x48 (0x11)
CRC-8-ATM (用途:ATM HEC, PMBUS (参见SMBUS org[1])) 0x7或0xE0 (0xC1)
CRC-8-CCITT (用途:1-Wire 总线 0x8D
CRC-8-Dallas/Maxim (用途:1-Wire bus 0x31或0x8C
CRC-8 0xD5(0x??)
CRC-10 0x233(0x????)
CRC-12 (用途:通信系统) 0x80F或0xF01 (0xE03)
CRC-16-Fletcher 参见Fletcher's checksum 用于Adler-32 A & B CRC
CRC-16-CCITT X25, V.41, Bluetooth, PPP, IrDA 0x1021或0x8408 (0x0811)
CRC-16-IBM (用途:Modbus) 0x8005或0xA001 (0x4003)
CRC-16-BBS (用途:XMODEM协议) 0x8408(0x????)
CRC-32-Adler 参见Adler-32 参见Adler-32
CRC-32-MPEG2 参见IEEE 802.3 参见IEEE 802.3
CRC-32-IEEE 802.3 0x04C11DB7或0xEDB88320 (0xDB710641)
CRC-32C(Castagnoli) 0x1EDC6F41或0x82F63B78 (0x05EC76F1)
CRC-64-ISO
(用途: ISO 3309)
0x000000000000001B或0xD800000000000000 (0xB000000000000001)
CRC-64-ECMA-182

(参见ECMA-182 p.63)
0x42F0E1EBA9EA3693或0xC96C5795D7870F42 (0x92D8AF2BAF0E1E85)
CRC-128 IEEE-ITU标准。被MD5 & SHA-1取代
CRC-160 IEEE-ITU标准。被MD5 & SHA-1取代

常用的 CRC-16-IBM(crc16_sdlc), CRC-16-CCITT CRC-32-IEEE 802.3 CRC-32C(Castagnoli)

1
2
3
4
5
6
7
#define CRC_MODE_16_CCITT   (0x0 << CRCCTL_MODE_SHIFT)   //0x1021
#define CRC_MODE_8_0x31     (0x1 << CRCCTL_MODE_SHIFT)   //0x0131
#define CRC_MODE_8_0x07     (0x2 << CRCCTL_MODE_SHIFT)   //0x0107
#define CRC_MODE_8_0x5D     (0x3 << CRCCTL_MODE_SHIFT)   //0x015D
#define CRC_MODE_16_SDLC    (0x4 << CRCCTL_MODE_SHIFT)   //0x8005
#define CRC_MODE_32         (0x5 << CRCCTL_MODE_SHIFT)   //0x04c11db7
#define CRC_MODE_32C        (0x6 << CRCCTL_MODE_SHIFT)   //0x1EDC6F41

DES


4 . 5 表明了 DES 加密的整个机制。对于任意加密方案,总有两个输入:明文和密钥。 DES 的明文长为 64 位,密钥长为 56 位。从图中左半部分,可见明文的处理经过了三个阶段。首先, 64 位的明文经过初始置换 P 而被重新排列。然后进行 16 轮相同函数的作用,每轮作用都有置换和代替。最后一轮迭代的输出有 64 位,它是输入明文和密钥的函数。其左半部分和右半部分互换产生预输出。最后预输出再被与初始置换 P 互逆的置换 IP-1 作用产生 64 位的密文。除了初始和末尾的置换, DES 的结构与图4.3 所示的Feistel 密码结构完全相同。图 4.5 的右半部分给出了使用 56 位密钥的过程。首先,密钥经过一个置换后,再经过循环左移和一个置换分别得到各轮的子密钥用于各轮的迭代。每轮的置换函数都一样,但是由于密钥的循环移位使得各轮子密钥互不相同。 097

DES 在穷举攻击之下相对比较脆弱,一台 PC可以破坏 DES 的时间大约为一年,如果多台 PC 并行工作,时间将大大缩短。今天的超级计算机应该可以在一个小时内找到密钥。增大密钥大小是防止使用简单蛮力攻击的有效方法, 128 位或更大的位是有效的。即使设法加快了 1 万亿的攻击系统,使用 128 位密钥破解代码仍然需要 10 万年以上的时间才能攻破。 100

因此很多人在想办法用某种算法替代它。一种方案是设计全新的算法,如 AES 。还有一种方案,能够保护已有软件和硬件的投资,那就是用 DES 进行多次加密,且使用多个密钥。我们以这种替代方案的一个简单例子开始,再讨论已被广泛接受的三重DES(3DES) 算法。 154

3DES

使用三个密钥的三重 DES 158

3DES 加密就是进行 3 次 DES 加密。DES 密钥长度为 56 位,所以 3DES 密钥长度为 56 * 3 = 168 位。

3DES 有一个“奇怪”的地方,并不是用 DES 加密 3 次,而是加密-解密-加密,中间有一次解密的过程。IBM 公司之所以这么设计,目的是为了让三重 DES 能兼容普通的 DES。如果三重加密中密钥都完全相同,那么就退化成了普通的 DES 了。(加密一次解密一次就抵消了)所以也就具备了向下兼容性。

  • 如果 3 次都用相同的密钥,则退化成了 DES。
  • 如果第一次和第三次用相同的密钥,第二次用不同的密钥,这种三重 DES 称为 DES-EDE2 。EDE 是加密(Encryption) -> 解密(Decryption) -> 加密(Encryption) 的缩写。
  • 如果 3 次都用不同的密钥,则称 DES-EDE3。

3DES 解密的过程和加密的过程正好相反,按照密钥的逆序解密。

缺点:

3DES 由于处理速度不高,除了兼容之前的 DES 以外,目前基本不再使用它了。

AES

AES (Advanced Encrytion Standard) 是取代前任标准 DES 而成为新标准的一种对称密码算法。
漫游对称加密算法 (halfrost.com)

AES128, AES192,AES256

模式

CBC ECB CFB OFB CTR CTS XTS CCM GCM

ECB

ECB 模式是分组模式里面最简单的,也是最没有安全性的。所以使用的人很少
ECB 模式全称“Electronic CodeBook”模式,在 ECB 模式中,将明文分组加密之后的结果直接就是密文分组,中间不做任何的变换。

CBC

CBC 模式的全称是 Cipher Block Chaining 模式,密文分组链接模式。名字中也展示它的实质,像链条一样相互链接在一起。

CTS

CTS 模式(Cipher Text Stealing 模式)
在分组密码中,当明文长度不能被分组长度整除的时候,最后一个分组就需要进行填充,CTS 模式是使用最后一个分组的前一个密文分组数据来进行填充的,它通常和 ECB 模式以及 CBC 模式配合使用。根据最后一个分组的发送顺序不同,CTS 模式有几种不同的变体(CBC-CS1、CBC-CS2、CBC-CS3),下面举一个 CBC-CS3 的例子

CFB

CFB 模式的全程是 Cipher FeedBack 模式(密文反馈模式)。在 CFB 模式中,前一个密文分组会被送到密码算法的输入端。所谓反馈,这里指的就是返回输入端的意思。

如果把 CBC 单个分组加密抽出来和 CFB 分组对比,如下:

从上图中我们可以看到,在 ECB 和 CBC 模式中,明文分组都是要通过加密算法处理的,但是 CFB 模式明文分组是没有经过加密算法直接加密的。CFB 模式中,明文和一串比特序列 XOR 以后就变成了密文分组。

CFB 与流密码

CFB 整个过程很像一次性密码本,如果把明文分组前的加密部分全部都看成一个随机比特序列,那么就和一次性密码本的流程一样了。这个由算法生成的比特序列称为密钥流。在 CFB 模式中,密码算法就相当于用来生成密钥流的伪随机数生成器,初始化向量相当于是伪随机数生成器的种子。也因为它是伪随机数,所以 CFB 是不具备一次性密码本绝对无法被破译的性质的。所以说,CFB 是一种使用分组密码来实现流密码的方式之一

OFB

OFB 模式的全程是 Output-FeedBack 模式(输出反馈模式)。在 OFB 模式中,密码算法的输出会反馈到密码算法的输入中。这里可以类比 CFB 模式。

OFB 也不直接对明文进行加密,也是通过利用明文和一串比特序列进行异或运算来得到密文。

OFB 与 CFB 对比

OFB 模式和 CFB 模式的区别仅仅在于密码算法的输入。OFB 模式是密码算法的输入是前一个密码算法的输出,所以称为输出反馈模式。CFB 模式是把前一个,密文分组输入到密码算法中,所以称为输入反馈模式。

从上图中我们可以看到,CFB 模式加密的过程是无法跳过某个分组对后面的分组加密的。因为它需要按照顺序进行加密。密文分组会重新输入到加密算法中。

而 OFB 模式就不同,加密算法和密文分组完全是分开的,也就是说只要生成好每次 XOR 运算所需的密钥流,就可以“跳跃”加密任意分组了。这个看来,生成密钥流的操作和进行 XOR 运算的操作是可以并行的。

CTR

CTR 模式的全程是 CounTeR 模式(计数器模式)。CTR 模式是一种通过将逐次累加的计数器进行加密来生成密钥流的流密码。
计数器每次都会生成不同的 nonce 来作为计数器的初始值。这样保证每次的值都不同。这种方法就是用分组密码来模拟生成随机的比特序列。

OFB 与 CTR 对比

CTR 模式和 OFB 模式都属于流密码。我们单独看两个加密过程,差异在输入到加密算法中的值不一样。CTR 模式输入的值是计数器累加的值,而 OFB 模式输入的值是上一次输出的值。


CTR 模式加密和解密都用了完全相同的结构,这样对程序实现来说,方便很多。更进一步,由于 CTR 模式每个密钥有累加的关系,所以可以通过这个关系,对任意一个分组进行加密和解密。因为只要初始的密钥确定以后,后面的每个密钥都确定了。这样看来,CTR 也是支持并行计算的。

XTS

android文件加密的实现中使用了aes-256-xts模式:

用于面向分组的存储设备的 XTS-AES 模式 167

基于扇区的设备上的数据进行加密的方法 167

可以发现,如同 CTR 模式一样, XTS-AES 模式适合并行执行。因为没有链接,多个分组可以同时加密或解密。与 CTR 不同的是, XTS-AES 模式包含一个时变值(参数)以及一个计数器(参数 j)171

本质上,参数 j 的功能类似 CTR 模式里的计数器,以保证一个数据单元内不同位置的相同明文分组加密为不同的密文分组。参数从数据单元的层面上说相当于时变值,以保证两个不同的数据 168单元内相同位置相同明文分组加密为不同的密文分组。更一般地,它可以保证位于不同位置的相同数据单元加密为不同的密文数据单元169

XTS 与CBC

XTS 相比 ECB CBC解决的两个问题是:

  1. 相同的数据块得到的密文不可以相同
  2. 不同数据块可以独立加密和解密

CCM 和 GCM

分组密码链-消息认证码 (CCM) 工作模式 296
Galois/计数器 (GCM) 工作模式由 NIST 作为 NIST SP800-38D 标准提出,基于并行化设计,因此可以提供高效的吞吐率和低成本、低延迟。其本质是消息在变型的 CTR 模式下加密,密文结果与密钥以及消息长度信息在 GF(2128) 域上相乘。该标准同时还制定了仅支持 MAC 的工作模式,即GMAC 。 298

认证加密: CCM 和 GCM

认证加密 (AE) 是指在通信中同时提供保密性和认证(完整性)的加密系统。许多应用和协议中都同时需要这两种形式的安全性保证,但这两类安全系统一直都分开设计,直到近几年才合并在一起考虑。 295

组成 CCM 的关键算法是 AES 加密算法 (参见第 6 章)、CTR 工作模式 (参见第 7 章) 和 CMAC认证算法 (参见 12 . 6 节) ,在加密和 MAC 算法中共用一个密钥 K . CCM 加密过程的输入包括三部分:
(1)将要被认证和加密的数据,即明文消息 P 数据块。
(2)将要被认证但不需加密的相关数据 A ,例如在协议进行时,协议头必须以明文传递,但需要认证保护。
(3)临时量 N 作为负载和相关数据的补充,对于每条消息在协议生命期内, N 的取值唯一,这以防止重放攻击或其他相应的攻击。 296

CCM (counter with CBC-MAC)定义在分组长度为128位的加密算法中,如,AES 的分组长度为128。组成AES-CCM算法的关键组成是CTR工作模式以及CMAC认证算法。Wifi 的WPE协议中使用了AES-CCM。在HMAC中我们介绍CCM是属于一种E&M(认证并且加密)

GCM基于并行化设计,因此可以提供高效的吞吐率和低成本、低时延。本质是消息在变形的CTR模式下加密,密文结果与密钥以及消息长度在GF(2^128)域上相乘,计算流程如下所示。其输入输出和CCM基本一致。

android 用户密码(锁屏密码) 导出为(data_ce)密码的过程使用了GCM模式

小结

模式 名称 特点 说明
ECB 模式 Electronic Codebook 运算快速,支持并行运算,需要填充 不推荐使用
CBC 模式 Cipher Block Chaining 支持并行运算,需要填充 推荐使用
CFB 模式 Cipher Feedback 支持并行运算,不需要填充 不推荐使用
OFB 模式 Output Feedback 迭代运算使用流密码模式,不需要填充 不推荐使用
CTR 模式 Counter 迭代运算使用流密码模式,支持并行运算,不需要填充 推荐使用
XTS 模式 XEX-based tweaked-codebook 不需要填充 用于本地硬盘存储解决方案中

RC4 (PRNG)

流密码 (PRNG)

RC4是 Ron RivestRSA 公司在 1987 年设计的一种流密码。它是一个可变密钥长度、面向字节操作的流密码。该算法以随机置换作为基础。每输出一字节的结果仅需要 8~16 条机器操作指令,软件实现的该密码运行很快。 RC4 应用很广,例如,它用于作为 EEE802 . 11 无线局域网标准一部分的 WEP(Wired Equivalent Privacy) 协议和新的WiFi 受保护访问协议 (WPA) 中。作为可选,它也被用于 Secure Shell(SSH)Kerberos 中。 198

RC4算法非常简单,易于描述:用 1~256 个字节 (8~2048 位)的可变长度密钥初始化一个256个字节的状态向量 S , S 的元素记为 S[0] , S[1] ,…, S[255] ,从始至终置换后的 S 包含从 0~255 所有的 8 位数。对于加密和解密,字节 k 是从 S255 个元素中按一种系统化的方式选出的一个元素生成的。每生成一个 k 值,S中的元素个体就被重新置换一次。 198

TRNG

真随机数发生器 200

真随机数发生器 (TRNG) 使用不可预测源来产生随机数。大多数是通过测量不可预测的自然过程来实现的,如电离辐射的脉冲检测、气体放电管、漏电电容等。 Intel 开发出一种芯片通过放大无驱动电阻的电压对热噪声进行采样。 LavaRnd 是一项开放的项目,目标是通过廉价的相机、开源的代码和廉价的硬件来产生真随机数。该系统使用密封的饱和式 CCD 作为混沌源来产生种子,然后用软件将种子加工成各种形式的真随机数。RFC4086__ 列出了如下可能的随机源,这些都很容易用于计算机来产生真随机序列。

  • 声音/图像输入许多计算机具有对现实世界模拟信号进行数据化的输入设备,这些信号有来自麦克风的声音或来自照相机的声像输入。如果声音数字化设备没有音源插入或者照相机没打开镜头盖那么来自这些设备的输入本质上是热噪声。如果系统具有足够的增益来检测任何信号,这种输入可以提供高质量的随机位。
  • 磁盘驱动由于紊乱的空气波动,磁盘驱动在转动时有很小的随机波动 。加上一个底层磁盘时间寻找仪器就能产生一系列包含随机性的度量值。这样的数据通常都是高度相关的,所以需要有效的处理过程。然而,十年前的实验就表明,做过处理后,即使是当时低速计算机上的低速磁盘驱动器也能容易地每分钟产生 100 位或更多优质的随机数据。 200

PRNG 与 TRNG 比较

8.5 总结了 PRNGTRNG 的主要差异。 PRNG 很有效,意味着它们能在短时间内生成许多数字: PRNG 是确定性的,意味着对于一个给定的数字序列若序列的开始点已知,一段时间后会再生。若你的应用程序需要很多数字,有效性是一个很好的特性:若你在后面的阶段会重复相同的数字序列,确定性是很易实现的。 PRNG 通常是周期性的,这意味着序列最终会复制它自己。
TRNG需要相当长时间生成数字,通常没有 PRNG 效率高。这在许多应用中会遇到困难。例如,银行或国家安全部门的密码系统每秒需要产生数百万的随机位。 TRNG 也没有确定性,意味着即使相同的序列出现若干次,一个给定的数字序列也不能复制。 TRNG 没有周期性。 201

HMAC

HMAC 算法除了需要信息摘要算法外,还需要一个密钥
目前主要集合了 MD 和 SHA 两大系列消息摘要算法。其中 MD 系列的算法有 HmacMD2、HmacMD4、HmacMD5 三种算法;SHA 系列的算法有 HmacSHA1、HmacSHA224、HmacSHA256、HmacSHA384、HmacSHA512 五种算法。


HMAC 算法 291
M为 HMAC 的消息输入 291
K为密钥 291

普通散列算法和 HMAC 算法的区别

  • 普通散列算法就是通过 hash 对要输出的数据进行摘要,接收到数据时,再同样对源数据进行散列,与给定的散列值比较,看收到的数据与计算的 hash 值是否一致就可以了。
  • HMAC 算法就可以用一把发送方和接收方都有的密钥 key 进行计算,而没有这个密钥 key 的第三方是无法计算出正确的散列值的,这样就可以防止数据的来源方被篡改。

RSA

  • _p,q_:我们随机挑选的两个大质数;
  • _N_:是由两个大质数_p_和_q_相乘得到的。_N = p * q_;
  • _r_:由欧拉函数得到的_n_的值,_n = φ(N) = φ(p)φ(q) = (p-1)(q-1)_。
  • _e_:随机选择和和r互质的数字,实际中通常选择 65537;
  • _d_: d 是以欧拉定理为基础求得的 e 关于 n 的模反元素,_ed = 1 (mod r)_;

此时我们的 (N , e) 是公钥,*(N, d)* 为私钥,A会把公钥 (N, e) 传给B,然后将 (N, d) 自己藏起来。一对公钥和私钥就产生了

加密

(N , e) 是公钥,*(N, d)* 为私钥
B 持有公钥
B 对消息进行加密
C = Me mod N (M的e次方 mod N)

解密

A 持有私钥 (N, d) , 对消息进行解密
M = Cd mod N (C的d次方 mod N)

RSA 算法举例

9.6 RSA 算法举例 219

RSA算法使用乘方运算,明文以分组为单位进行加密,每个分组的二进制值均小于 N 218

采用分组的方法对消息分成块, 挨个进行加密解密

9.7 RSA 的加解密过程示例 220

模算术里的求幂运算在 RSA 中,加密和解密都需要计算某整数的模 n 整数次幂,如果先求出整数的幂,再对取模,那么中间结果会非常大。幸运的是,正如前面的例子所示,我们可利用模算术的下列性质来计算模幂运算: 220

签名

  1. A计算消息m的消息摘要,记为 h(m)
  2. A使用私钥 (n,d)h(m) 加密,生成签名s, s满足:s=(h(m))d mod n;
    由于A是用自己的私钥对消息摘要加密,所以只用使用s的公钥才能解密该消息摘要,这样A就不可否认自己发送了该消息给B
  3. A发送消息和签名 (m,s) 给B

验签

  1. B计算消息m的消息摘要(计算方式和A相同),记为 h(m)
  2. B使用A的公钥 (n,e) 解密s,得到 H(m), H(m) = se mod n
  3. B比较H(m)h(m),相同才能证明验签成功

ECDSA 椭圆曲线

ECC相关算法解析 - 知乎 (zhihu.com)

q 一个素数
a , b Zq上的整数,通过等式 y2=x3+ax+b 定义椭圆曲线
G 满足椭圆曲线等式的基点,表示为 G=(xg , yg)
n 点 G 的阶,即 n 是满足 nG=0 的最小正整数。这也等于曲线上点的个数 316

生成公钥 私钥

构造一条椭圆曲线E,在曲线上选择一点G作为生成元,并求G的阶为n,要求n必须为质数。
A选择一个私钥k (k < n),生成公钥 Q = kG
公钥组(双方协同信息) E Q G

加密 (公钥加密)

明文编码为MM为曲线上一点,并选择一个随机数rr < n*, *n*为*G*的阶)
B计算点*C1
C2 即两段密文

  • C1 = M + rQ
  • C2 = rG
    B 把 C1 C2 发给 A

私钥解密

为获得明文M, 只需 C1-kC2

C1 - k*C2 = M + rQ - krG = M + rkG - krG = M

签名

  1. 选择一条椭圆曲线 Ep(a,b),和基点 G;
  2. 选择私有密钥 k(k<n,n 为 G 的阶),利用基点 G 计算公开密钥 Q=kG
  3. 产生一个随机整数 r(r<n),计算点 R=rG
  4. 密文为 message,计算 SHA1(message) 做为 hash;
  5. 计算 S≡r^-1  *(Hash + k * R.x)(mod n); 这里的 R.x 为 R 的横坐标
  6. (R.x, S) 做为签名值

验签

  1. 接收方在收到消息 m 和签名值 (R.x, S) 后,进行以下运算
  2. 计算明文 hash:hash = SHA(m)
  3. 计算 P 点:P = S^-1 *(hash*G + R.x*Q)
  4. 若 P 点的横坐标 P.x == R.x, 则说明校验成功。

ECC VS  RSA

优点:

  • 安全性能更高

  • 160位ECC与1024位RSA、DSA有相同的安全强度

  • 处理速度更快

    • 在私钥的处理速度上,ECC远 比RSA、DSA快得多
  • 带宽要求更低, 存储空间更小

    • ECC的密钥尺寸和系统参数与RSA、DSA相比要小得多

证书

CA 用自己的私钥签署证书,如果用户知道相应的公钥,则用户就可以验证证书是 CA 签署的。 339

获得一个用户证书 CA 生成的用户证书具有以下特点:

  • 任何可以访问 CA 公钥的用户均可获得证书中的用户公钥。
  • 只有 CA 可以修改证书。 339

如果所有用户都属于同一个 CA ,则说明用户普遍信任 CA ,所有用户的证书均被存放于同一个目录中,所有用户都可以进行存取。另外,用户也可以直接将其证书传给其他用户。一旦拥有了A的证书, B 即可确信用 A 的公钥加密的消息是安全的、不可能被窃取,同时,用 A 的私钥签名的消息也不可能仿造。 339