《图解密码技术》阅读笔记
第一章
- 密码与信息安全常识
- 不要使用保密的密码算法:
- 密码算法的秘密早晚会公诸于世
- 试图通过密码算法本身的保密性来保证安全称之为隐蔽式安全,很蠢。
- 使用低强度的密码比不进行任何加密更危险
- 任何密码总有一天会被破解
- 不要使用保密的密码算法:
第二章
- 凯撒密码:
- 位移实现加密
- 知道位移量即可进行逆向移动解密(也可以暴力穷举破解)
- 替换密码:
- 将明文中所有字母变替换为另一套字母表
- 密钥空间:所有密钥的集合
- 频率分析:明文中字母出现的频率与密文中字母出现的频率是一致的
- 破译技巧:
- 高频字母和低频字母都能成为线索
- 字母连成单词
- Enigma
- 国防军密码本的“每日密码”通信密码
- 通信密码是3位,写两次共6位
- 每日密码加密后的通信密码和通信密码加密后的密文被拼接发送给对端
- 弱点:
- 将通信密码连续输入两次
- 通信密码是人为选定的
- 必须派发国防军密码本
第三章
- XOR(异或)
- 两个相同的数进行异或运算的结果一定为0
- 一次性密码本
- 即使可以遍历整个密码空间,遍历解密得到明文,也无法确认哪个是正确的明文
- 一次性密码是无条件安全的,在理论上是无法破译的
- 不实用:
- 密钥在两边配送
- 密钥保存
- 密钥重用
- 密钥同步
- 密钥生成
- DES
- DES是一种将64位明文加密成64位密文的对称密码算法
- 密钥长度是56bit(64bit,每隔7位有1bit错误检验bit)
- 轮:
- 将输入的数据(64bit)等分为左右两部分
- 将输入的右侧数据直接发送到输出的右侧
- 将输入的右侧发送到轮函数
- 轮函数根据右侧数据和子密钥,计算出一串看上去随机的bit序列
- 将上一步的bite序列与左侧数据进行XOR运算,并将结果作为输出的左侧
- Feistel网络:
- 将上述单轮的输出结果左右对调作为下一轮的输入再开启一轮计算,最后一轮计算结果不对调,直接输出,即为Feistel网络
- 特点:
- 轮数可以任意增加
- 加密时无论使用任何轮函数都能正常解密
- 加密和解密可以用完全相同的结构来实现
- 三重DES: 加密-解密-加密
- AES
- 选出Rijndael作为最终算法
- Rijndael:
- 分组长度和密钥长度可以分别以32bit为单位在128到256bit范围内进行选择,AES固定分组长度为128,密钥长度为128,192,256
- Rijndael加密:
- 同样由轮构成:SubBytes、ShiftRows、MixColumns、AddRoundKey,使用SPN架构
- 输入分组为128bit(16bytes)
- SubBytes:逐字节从替换表(S-Box)中替换
- ShiftRows:上一步处理完成后,以4字节为单位的行进行按一定规则向左平移,且每一行平移的字节数不同
- MixColumns:进行列计算
- AddRoundKey:将上一步的输出与轮密钥进行XOR
- 在Rijndael中以上4步一般重复10-14轮
第四章 分组密码的模式
- 分组密码与流密码
- 分组密码:每次之只能处理特定长度的一块数据的密码算法
- 流密码:对数据流进行持续处理,一般以1、8、32bit为单位进行加密解密
- 模式:对分组密码进行迭代使之能处理超长明文的迭代方法
- ECB模式:Electronic CodeBook(电子密码本模式)
- 将明文分组加密后的结果将直接成为密文分组,相同的明文对应相同的密文,因此也被称为电子密码本模式,最后一个分组小于分组长度时会进行填充
- 最大弱点是可以在不破译密文的情况下操纵明文
- 需要填充
- CBC模式: Cipher Block Chaining(密文分组链接模式)
- 首先将明文分组与前一个密文分组进行XOR运算,然后再进行加密
- 第一个分组和初始化向量(IV)进行XOR,初始化向量由每次加密随机产生
- 密文分组损坏只会影响最多2个分组的明文解密,密文分组缺失则影响整个解密
- 需要填充
- 对CBC模式的攻击:
- 对填充字段进行攻击
- 对初始化向量进行攻击
- SSL 3.0可以通过中间修改密文导致服务器无法正确解密,基于服务器反馈解密错误信息实现提示攻击(POODLE)
- 初始化向量必须使用不可预测的随机数,在TLS1.0中IV使用的不是不可预测随机数,而是上一次CBC模式加密时的最后一个分组。TLS 1.1以上的版本中,改为了必须显式的传送IV。
- CTS模式:对于明文长度不足的部分,使用最后一个分组的前一个密文数据来进行填充
- CFB模式:Cipher FeedBack(密文反馈模式)
- 前一个密文分组会被送回到密码算法的输入端,加密后的前一个分组的密文和明文XOR生成密文
- 同样需要初始化向量(IV)
- CFB模式中由密码算法所生成的比特序列称为密钥流,在CFB模式中密码算法就相当于用来生成密钥流的伪随机数生成器,初始向量相当于生成器的种子
- 在CFB模式中明文数据可以被逐比特加密
- 攻击方式:重放攻击
- 不需要填充
- OFB模式:Output-Feedback(输出反馈模式)
- 密码算法的输出会反馈到密码算法的输入
- 明文通过和密码算法输出值XOR来实现加密
- 需要初始化向量(IV)
- 特点:可以提前生成密钥流,直接用密钥流和明文XOR即可
- 不需要填充
- CTR模式:CounTeR(计算器模式)
- 通过将逐次累加的计数器进行加密来生成密钥流的流密码
- 计数器生成方法(128bit、16字节):前8字节为nonce(必须保证每次的值都不一样),后8字节为分组序号,累增
第五章 公钥密码
- 对称密钥的问题:如何将密钥安全的传递到两端?
- 预共享密钥
- 密钥分配中心
- Diffie-Hellman密钥交换
- 公钥密码
- RSA
- 实质是基于大质数分解难度保证安全性
- 加密:密文 = (明文^E)mod N
- E和N两个数组合成公钥
- 解密:明文 = (密文^D)mod N
- 生成密钥对的过程:
- 选择两个大质数p和q(判断一个数是否是大质数的方法由费马测试和米勒·拉宾测试),N = p x q
- 求L,L是p - 1和 q - 1的最小公倍数,L = lcm(p - 1,q - 1)
- 求E,1 < E <L,E和L的最大公约数为1(互质),该最大公约数的条件可以保证一定存在解密时需要使用的D
- 求D,1< D < L, E x D mod L = 1
- 无法防御中间人攻击
- 其他公钥密码
- EIGamal方式:
- 基于mod N下求离散对数的困难度保证安全性
- 密文长度会变成明文长度的两倍
- 椭圆曲线算法ECC:
- 将椭圆曲线上的点进行特殊的乘法运算
- EIGamal方式:
第六章 混合密码系统
- 使用对称密钥加密明文,用非对称密钥加密对称密钥的密钥
第七章 单向散列函数
- 单向散列函数的性质;
- 根据任意长度的消息计算出固定长度的散列值
- 能够快速计算出散列值
- 消息不同散列值也不同
- 弱抗碰撞性:要找到和该条消息具有相同散列值的消息非常困难
- 强抗碰撞性:要找到散列值相同的两条不同的消息是非常困难的
- 具备单向性:无法通过散列值反推消息
- 单向散列函数的应用:
- 基于口令的加密
- 消息认证码
- 数字签名
- 伪随机数生成器
- 一次性口令
- 具体例子:
- MD4、MD5,已被攻破
- SHA-1(160bit),已被攻破
- SHA-2:由SHA-256、SHA-512衍生,224、256、384、512
- RIPEMD-160:未被攻破,比特币
- SHA-3:Keccak
- Keccak:
- 海绵结构:输入数据在进行填充后要经过吸收阶段和挤出阶段
- 存在一个内部状态b = r + c参与计算
- 输入消息按长度r分割
- 分割后的输入消息送入Keccak-f[b]中进行计算输出值作为下一轮的b
- 将消息计算完成后吸收结束,开始挤出,将吸收结束后的计算输出值取长度r作为第一个输出分组,整个计算输出值作为下一轮的b输入,输出第二个分组,直到分组组合长度达到输出需求
- 对单向散列函数的攻击
- 暴力破解:利用文件的冗余性生成具有相同散列值的另一文件,破解弱抗碰撞性
- 生日攻击:构造两个散列值相同的文件,破解强对抗性
第八章 消息认证码(MAC)
- 输入包括任意长度的消息和共享密钥,输出固定长度的数据(MAC值)
- GCM 使用AES等128比特分组密码的CTR模式
- HMAC:使用单向散列函数构造消息认证码
- 计算步骤:
- 用0填充密钥,使密钥长度等于单向散列函数的分组长度
- 填充后的密钥和iPad(00110110循环到分组长度)XOR生成ipadkey
- ipadkey与消息组合,通过单向散列函数计算散列值
- 填充后的密钥与opad(01011100循环到分组长度)XOR生成opadkey
- opadkey与之前计算出来的散列值组合,再次通过单向散列函数计算散列值
- 得到MAC值
- 计算步骤:
- 对消息认证码的攻击
- 重放攻击
-防御:序号、时间戳nonce - 密钥推测攻击
- 暴力破解、生日问题
- 重放攻击
- 消息验证码无法解决的问题
- 对第三方证明
- 防止否认
第九章 数字签名
- 数字签名私钥生成的密文不用于保证机密性,而是被用于代表一种只有持有该密钥的人才能生成的信息,这样的信息一般被称为认证符号
- 应用实例:
- 安全信息公告
- 软件下载
- 公钥证书
- SSL/TLS
- 实现
- RSA
- EIGamal
- DSA
- ECDSA
- Rabin
- 攻击
- 中间人攻击
- 攻击散列函数
- 攻击公钥
- 伪造
第十章 证书
- 公钥(Public-Key Certificate):是由认证机构(certificate authority)对个人信息及公钥进行数字签名生成的数字签名信息
- 公钥基础设施(PKI)
- 组成要素:
- 用户:使用PKI的人
- 认证机构(CA):颁发证书的人
- 生成密钥对(也可以由用户生成)
- 在注册公钥是对本人身份进行认证
- 生成并颁发证书
- 作废证书
- 公钥注册和身份认证可以由注册机构(RA)来分担
- 仓库:保存证书的数据库
- 证书机构的工作
- 生成密钥对(由证书机构或者PKI用户自行生成RFC 7292)
- 注册证书:使用证书机构的私钥对证书进行签名
- 作废证书与CRL(证书作废清单)
- 证书的层级结构
- 证书链由上到下给下面做签名,根CA(root CA)自签名
- 对证书的攻击:
- 在公钥注册之前进行攻击
- 注册相似人名进行攻击
- 窃取认证机构的私钥进行攻击
- 伪装成认证机构进行攻击
- 钻CRL的空子
- 组成要素:
第11章 密钥
- 密钥管理
- 生成密钥
- 用随机数生成密钥
- 用口令生成密钥
- 配送密钥
- 预共享密钥
- 密钥分配中心
- 公钥密码
- DH密钥交换
- 更新密钥
- 通信过程中定期进行密钥变更,发送者和接收者用单向散列函数 计算当前密钥的散列值,将这个值用做新的密钥。通过单向函数的单向性保证安全性
- 保存密钥
- 人类无法记住密钥
- 作废密钥
- 密钥和明文是等价的
- 生成密钥
- Diffie-Hellman交换
- 用于在两个终端之间计算共享密钥
- 计算过程:
- Alice向Bob发送两个质数P和G:P必须是一个非常大的质数,G是一个和P相关的数,称为'生成元'。这两个数无需保密
- Alice生成一个随机数A,1<A<P-2。该数字对所有人保密
- Bob生成一个随机数B,1<B<p-2。该数字对所有人保密
- Alice将G^A mod P 的值给Bob
- Bob将G^B mod P 的值给Alice
- Alice用Bob发过来的数计算A次方并求 mod P:密钥=(G^B mod P)^A mod P = G^(BxA) mod P
- Bob用Alice发送过来的数计算B次方并求mod P:密钥=(G^A mod P)^B mod P = G^(AxB) mod P
- Alice的计算出的密钥 == Bob计算出来的密钥
- 安全性的保证:
- 有限域(finite field)的离散对数问题:根据G^A mod P 计算出A的有效算法目前还没有出现
- 生成元:
- 假设一个数g是P的原根,那么g^i mod P的结果两两不同,且有 1<g<P,0<i<P,归根到底就是g^(P-1) = 1 (mod P)当且仅当指数为P-1的时候成立.(这里P是素数)
- 原根的求法目前只能是枚举
- 之所以1< A(B) < P-2,是因为当A(B) == P-1 时mod的结果一定是1
- 基于口令的密码(PBE)
- PBE加密:
- 生成KEK
- 加密密钥的密钥(KEK):伪随机数生成器生成salt,将salt和口令输入单向散列函数输出值就是KEK
- 生成会话密钥并加密:
- 会话密钥是用来加密消息的密钥(CEK),用伪随机数生成器生成
- 使用KEK加密(对称密钥算法)CEK,然后丢弃KEK。将加密后的CEK和salt一起保存在安全的地方
- 加密消息
- 用CEK加密消息
- 生成KEK
- PBE解密:
- 重建KEK
- 使用口令和之前保存的salt生成KEK
- 解密会话密钥(CEK)
- 依然用对称密钥算法基于KEK解密之前加密的CEK
- 解密消息
- 使用解密出来的CEK解密被加密的消息
- 重建KEK
- salt的作用
- 盐是由伪随机数生成器生成的随机数
- 盐是用来防御字典攻击的,口令加盐增加了预先生成匹配的KEK的难度
- 口令的作用:
- 具有充足长度的密钥是无法用人脑记忆的
- 通过拉伸来改良PBE
- 将KEK再输入到单向散列函数中,来个1000次
- 如何生成安全的口令
- 使用只有自己才能知道的信息
- 不要使用对自己重要的人或事的名字
- 不要使用关于自己的信息
- 不要使用别人见过的信息
- 将多个不同的口令分开使用
- 有效利用笔记
- 理解口令的局限性
- 使用口令生成和管理工具
- 使用只有自己才能知道的信息
- PBE加密:
第十二章 随机数
- 随机数的使用场景
- 生成密钥
- 生成密钥对
- 生成初始化向量(IV):用于分组密码的CBC、CFB、OFB
- 生成Nonce:用于防御重放攻击及分组密码的CTR模式
- 生成盐:PBE
- 随机数的性质:
- 随机性:不存在统计学偏差,是完全杂乱的数列(弱伪随机数)
- 不可预测性:不能从过去的数列推测出下一个出现的数(强伪随机数)
- 不可重现性:除非将数列本身保存下来,否则不能重现相同的数列(真随机数)
- 随机数生成器:根据传感器收集的热量、声音的变化等事实上无法预测和重现的自然现象来生成。
- 伪随机数生成器:生成随机数的软件
- 将根据内部状态计算伪随机数的方法和改变内部状态(伪随机数生成器所管理的内存中的数值)的方法组合起来,就是伪随机数生成的算法。
- 通过种子(seed)来进行内部状态的初始化,种子需要保密,不能使用易被推测的值
- 具体为随机数生成器:
- 杂乱方法
- 线性同余法(弱伪随机数)
- Rn+1 = (A x Rn + C)mod M
- 当n为0时R0即为种子
- 最近一次生成的伪随机数的值就是内部状态
- 不具备不可预测性
- 单向散列函数法(强伪随机数)
- 用伪随机数的种子初始化内部状态(计数器)
- 用单向散列函数计算计数器的散列值
- 将散列值作为伪随机数输出
- 计数器的值加一
- 根据需要的伪随机数的数量重复2——4步
- 单向散列函数的单向性是支撑伪随机数生成器不可预测性的基础
- 密码法:(计数器初始值和密钥作为种子)
- 初始化内部状态(计数器)
- 用密钥加密计数器的值
- 将密文作为伪随机数输出
- 计数器的值加1
- 根据需要的伪随机数数量重复2 - 4步骤
- 密码的机密性是支撑伪随机数生成器不可预测性的基础
- ANSI X9.17
- 1、初始化内部状态
- 2、将当前时间加密生成掩码
- 3、对内部状态与掩码求XOR
- 4、将3的结果加密
- 5、将4的结果作为伪随机数输出
- 6、对4的结果与掩码求XOR
- 7、将步骤6的结果加密
- 8、将步骤7的结果作为新的内部状态
- 9、重复2-8直到获得所需数量的随机数
- 对伪随机数生成器的攻击:
- 对种子进行攻击:伪随机数的种子和密码的密钥同等重要
- 对随机数池进行攻击
第十三章 PGP
- PGP简介:
- 1990年,Pretty Good Privacy
- 混合密码系统的特点:用公钥密码加密会话密钥,用对称密码加密消息
- PGP的功能
- 对称密码
- 公钥密码
- 数字签名
- 单项散列函数
- 证书
- 压缩
- 文本数据
- 大文件的拆分和合并
- 钥匙串管理
- 加密过程:
- 1、用伪随机数生成器生成会话密钥
- 2、用公钥密码(接收者的)加密会话密钥
- 3、压缩消息
- 4、使用对称密码(使用1中生成的会话密钥)对压缩的消息进行加密
- 5、将加密的会话密钥(2)和加密的消息(4)拼合起来
- 6、将步骤5的结果转换为文本数据,转换后的结果就是报文数据
- 为什么要先压缩再加密而不是反过来:因为经过加密后比特序列的冗余性基本消失了,无法再压缩
- 解密过程:
- 1、接收者输入解密的口令:PGP的私钥是保存在用户的钥匙串中的,使用基于口令的密码(PBE)保存。口令是由多个单词组成的短语。
- 2、求口令的散列值,生成用于解密私钥的密钥
- 3、将钥匙串中经过加密的私钥进行解密
- 4、将报文数据(文本数据)转换成二进制数据
- 5、将二进制数据分解成两部分:加密的会话密钥、经过压缩和加密的消息
- 6、用私钥密码(3)解密会话密钥
- 7、对5中得到的经过压缩和加密的消息用对称密码(6)进行解密
- 8、对7中得到的经过压缩的消息解压缩
- 9、得到原始消息
- 生成数字签名
- 1、发送者输入签名用的口令
- 2、求口令的散列值,生成用于解密私钥用的密钥
- 3、将钥匙串中经过加密的私钥进行解密
- 4、用单项散列函数计算消息的散列值
- 5、对4中的散列值进行签名
- 6、将5中的数字签名和消息进行拼合
- 7、将6进行压缩
- 8、将7转换为文本数据
- 9、步骤8的结果就是报文数据
- 验证数字签名
- 1、将报文数据(文本数据)转换为二进制数据
- 2、对经过压缩的数据进行解压缩
- 3、将解压缩后的数据分解成经过签名的散列值和消息两部分
- 4、将经过签名的散列值用发送者的公钥进行解密,恢复出发送者发送的散列值
- 5、将3中分解出的消息输入单向散列函数计算散列值
- 6、将4中得到的散列值与步骤5中得到的散列值进行对比
- 信任网
- 互相对对方的公钥进行数字签名
- 信任级别:
- 绝对信任(持有私钥本人)
- 完全信任
- 有限信任
- 不信任
第十四章 SSL/TLS
- 要解决的问题:
- 不被窃听:机密性
- 不被篡改:完整性
- 身份确认:认证问题
- TLS协议:
- 握手协议:负责除加密以外的其他操作
- 握手协议:负责在客户端和服务器之间协商决定密码算法和共享密钥,基于证书的认证操作也在这个协议中完成
- 密码规格变更协议:负责向通信对象传达变更密码方式的信号
- 警告协议:负责在发生错误时将错误传达给对端
- 应用数据协议:将上层应用数据传达给通信对象
- 记录协议:位于TLS握手协议下层,负责对消息进行压缩,使用对称密码对消息进行加密,用消息认证码验证。
- 消息被分割成多个较短的片段,然后分别对每个片段进行压缩,压缩算法需要与通信对象协商
- 压缩对象被加上消息认证码,保证完整性并进行数据认证,为了防重放,计算时还加了片段编号。
- 压缩片段+消息认证码通过对称密码进行加密。加密使用CBC模式,IV通过主密码生成
- 握手协议:
- 1 ClientHello(客户端→服务器):
- 可用版本号
- 当前时间:在基本的TLS中不使用
- 客户端随机数
- 会话ID:用于重建之前建立的会话
- 可用的密码套件清单
- 可用的压缩方式清单
- 2 ServerHello(客户端<---服务器)
- 使用的版本号
- 当前时间
- 服务器随机数:由服务器生成的不可预测的随机数
- 会话ID
- 使用的密码套件
- 使用的压缩方式
- 3 Certificate(客户端<----服务器)
- 服务器给客户端发送证书清单(X.509v3)先发送服务器证书,然后发送认证机构的证书
- 以匿名方式通信时,不发送Certificate消息
- 4 ServerKeyExchange(客户端<----服务器)
- 当Certificate无法满足需求时,以此补充Certificate信息,当不需要补充时,可以不发送
- 5 CertificateRequest(客户端<----服务器)
- 服务器对客户端进行身份认证,不认证就不会发送这个消息
- 6 ServerHelloDone(客户端<---服务器)
- 服务器问候到此结束
- 7 Certificate(客户端---->服务器)
- 客户端提供证书(取决于5)
- 8 ClientKeyExchange(客户端---->服务器)
- 当密码套件包含RSA时,会随ClientKeyExchange消息一起发送经过加密的预备主密码
- 当包含DH时,会随ClientKeyExchange消息一起发送DH的公开值
- 预备主密码(pre-master secret)是由客户端生成的随机数,后续会成为生成主密码的种子
- 基于预备主密码算出相同的主密码,基于主密码生成:
- 对称密码的密钥
- 消息认证码的密钥
- 对称密码的CBC模式中使用的初始化向量(IV)
- 9 CertificateVerify(客户端--->服务器)
- 在服务器发送CertificateRequest消息时才会回复CertificateVerify,证明自己持有客户端证书的私钥
- 计算主密码和握手协议中传送消息的散列值,加上自己的数字签名
- 10 ChangeCipherSpec(客户端--->服务器)
- 切换密码(密码规格变更协议的消息)
- 在收到之歌消息后客户端和服务器同时切换密码
- 11 Finished(客户端--->服务器)
- 使用切换后的密码套件来发送
- 消息内容固定,服务器可以通过解密来确认正确性
- 12 ChangeCipherSpec(客户端<---服务器)
- 服务器切换密码
- 13 Finished(客户端<---服务器)
- 结束握手
- 14 切换至应用数据协议
- 1 ClientHello(客户端→服务器):
- 密码规格变更协议:用于密码切换的同步
- 加密通信的中途也可以使用变更协议来修改密码套件
- 警告协议
- 发生错误时通知通信对象
- 应用数据协议
- 用于和通信对象之间传递数据
- 主密码
- 48字节的数值
- 主密码的计算
- 计算元素:预备主密码、客户端随机数、服务器随机数
- 客户端随机数和服务器随机数的作用相当于防止攻击者事先计算出密钥的盐
- 计算方法:使用基于密码套件中定义的单项散列函数来实现伪随机函数
- 主密码的目的:
- 对称密码的密钥(客户端--->服务器)
- 对称密码的密钥(客户端<---服务器)
- 消息认证码的密钥(客户端--->服务器)
- 消息认证码的密钥(客户端<---服务器)
- 对称密码的CBC模式所使用的初始化向量(客户端--->服务器)
- 对称密码的CBC模式所使用的初始化向量(客户端<---服务器
- 握手协议:负责除加密以外的其他操作
- 对SSL/TLS的攻击
- OpenSSL的心脏流血漏洞(CVE-2014-0160)
- OpenSSL在TLS的心跳扩展功能中对于请求的数据大小没有进行检查,从而导致错误的将内存中与请求无关的信息返回给请求者
- SSL 3.0的POODLE攻击
- SSL 3.0对CBC模式加密时的分组填充操作没有进行严格的规定,而且填充数据的完整性没有受到消息认证码的保护
- FREAK攻击
- 强制服务器使用RSA Export Suite(512比特的RSA 和40比特的DES)是的低强度密码套件,通过暴力破解对称加密的密钥实现解密加密流量
- 攻击伪随机数生成器
- 利用证书时间差进行攻击
- OpenSSL的心脏流血漏洞(CVE-2014-0160)
- SSL/TLS 用户注意事项
- 不要误解证书的含义:证书只是确认了该服务器经过机构认证而不能说明是你要交互的服务器
- 密码通信之前的数据不受保护
- 密码通信之后的数据不受保护
第十五章 密码技术与现实社会
- 所有密码技术都可以看做是一种“压缩”技术
- 和确保整个明文的机密性相比,确保密钥的机密性更容易
- 和检查整个消息的完整性相比,检查散列值的完整性更容易
- ……
- 比特币
- P2P网络:
- 依赖于全世界所有比特币用户组成的P2P网络
- 地址:
- 比特币交易在比特币地址之间完成
- 大多数情况下人们会为每一次比特币交易创建不同的地址
- 比特币使用的地址油公钥散列值组成:将椭圆曲线DSA的公钥输入SHA-256和RIPEMD-160两个单项散列函数来求散列值,为其附加一些信息后再通过Base58Check运行编码转换成字符串。
- 为了防止混淆,Base58Cheak编码中不使用数字0 大写O、大写I及小写L
- 钱包
- 比特币交易的客户端
- 通过钱包生成密钥对,公钥用于接受比特币,私钥用于支付比特币
- 区块链
- 区块链就是保存全部交易记录的公共账本,将交易以区块为单位组织起来
- 区块
- 一个区块由若干条交易以及一个区块头组成
- 区块头中保存了上一个区块的区块头散列值
- 区块头中保存所有交易的整体散列值(merkle root),SHA-256
- 保存一个名为nonce的任意数值、时间戳、
- 交易(A从B商店中购买商品,A向B支付1 BTC)
- B创建公钥密钥对
- B根据公钥生成地址发给A
- A创建公钥密钥对
- A创建交易:从地址A向地址B发送1BtC,A用刚创建的私钥对交易签名
- A将交易广播到P2P网络
- 该交易和其他交易被一起打包到区块,并添加到区块链中
- 添加的区块被P2P网络确认后,该交易成立
- P2P网络: