当前位置:首页 » 编程语言 » keccak算法c语言
扩展阅读
webinf下怎么引入js 2023-08-31 21:54:13
堡垒机怎么打开web 2023-08-31 21:54:11

keccak算法c语言

发布时间: 2023-05-03 04:30:35

① 密码学系统

本文分为7个部分,第1部分介绍密码学的基本概念,第2部分讲解常见的对称加密算法,第3部分讲解常见的非对称加密算法,第4部分讲解 数字签名, 第5部分讲解PKI(Public Key Infrastructure),第6部分讲解哈希函数加密,第7部分讲解密码学在区块链里的应用, 最后一部分会讲解随机数。

比较常见的对称加密算法有: Digital Encryption Standard(DES), Triple-DES, IDEA, BLOWFISH。

对称加密的挑战:

非对称加密的挑战:

比较常见的非对称加密算法有: RSA, ElGamal, ECC。

菲斯特尔结构的块加密算法是着名的一个分组密码加密的设计模型。

1990年后对DES进行彻底的密钥搜索的速度开始引起DES用户的不适。 然而,用户并不想取代DES,因为它需要花费大量的时间和金钱来改变广泛采用并嵌入到大型安全架构中的加密算法。

务实的做法不是完全放弃DES,而是改变DES的使用方式。 这导致了三重DES(3DES)的修改方案。

三重DES
在使用3TDES之前,用户首先生成并分配一个3TDES密钥K,它由三个不同的DES密钥K1,K2和K3组成。

详细可以看 Triple-DES

高级加密标准(Advanced Encryption Standard,AES)是目前比较流行和广颂桥扮泛采用的对称加密算法。 发现至少比三重DES快6倍。
AES的功能如下:

对称密钥对称分组密码
128位数据,128/192/256位密钥
比Triple-DES更强更快
提供完整的规格和设计细节

详细可以看 AES

这个密码系统是最初的系统之一。 即使在今天,它仍然是最多被使用的密码系统。 该系统由三位学者Ron Rivest,Adi Shamir和Len Adleman发明,因此被称为RSA密码系统。

下面给出生成RSA密钥对的一个例子(为了便于理解,这里采用的素数p&q值很小,实际上这些值非常高)。

设两个素数为p = 7且q = 13。因此,模数n = pq = 7×13 = 91。

选择 e = 5,这是一个有效的选择,因为没有数字是公因子5和(p - 1)(q - 1)= 6×12 = 72,除了1。

这对数字(n,e) = (91, 5)形成公钥,可以让任何我们希望能够向我们发送加密消息的人使用。

向扩展欧几里德算法输入p = 7,q = 13和e = 5。 输出将是d = 29。
因此,公钥是(91, 5),私钥是(91, 29)。

假设发送者希望发送一些文本消息给公钥为(n,e)的人。然后发件人将明文表示为一系列小于n的数字。
为了加密第一个明消茄文P,它是一个模n的数字。 加密过程是简单的数学步骤:
C = Pe mod n
换句话说,密文C等于明文P乘以自己e次,然后减去模n。 这意味着C也是一个小于n的数字。
回到我们的密钥生成例子,明文P = 10,我们得到密文C:
C = 105 mod 91

属于ECC的一种变化。加密的核心理念与RSA相似,也是利用离散对数很难求解。
但与RSA不同的野灶是 公钥的组成部分,EIGamal的公钥有三部分组成, 质模数 p, 生成元素 g, 以及 公共的 Y = gx(g的x次方) mod p。
详细可以看 ElGamal Crytosystem

椭圆曲线密码术(ECC)是用来描述一套密码工具和协议的术语,其安全性基于特殊版本的离散对数问题。它不使用数字模p。ECC基于与称为椭圆曲线的数学对象相关联的数字集合。有这些数字的加法和计算倍数的规则,就像数字模p一样。

ECC包含许多最初为模块化数字设计的密码方案的变体,如ElGamal加密和数字签名算法。

相信当应用于椭圆曲线上的点时,离散对数问题更加困难。这会提示从数字模p切换到椭圆曲线上的点。如果我们使用基于椭圆曲线的变体,也可以用较短的密钥获得等效的安全级别。

较短的密钥有两个好处:
易于管理
高效的计算
这些优点使基于椭圆曲线的加密方案变体对计算资源受到限制的应用程序非常有吸引力。

详细可以看 Elliptic Curve Cryptography

^符号表示为多少次方
签名 = 消息^D mod N (D和N 为签名者的私钥,计算消息的D次方并求mod N,所得余数即为签名)
消息 = 签名^E mod N (E和N 为签名者的公钥,计算签名的E次方并求mod N)

举个例子:
私钥: D = 29; N = 323
公钥: E = 5; N = 323
消息: 123

由于 N 的值为 323, 因此消息需要为 0 ~ 322 这个范围内的整数. 假设需要对 123 这个消息进行签名.
用私钥(D,N) = (29,323) 对消息 123 进行签名.

消息^D mod N = 123^29 mod 323 = 157
因此 (消息, 签名) = (123, 157)

用公钥(E,N) = (5,323)对消息进行验证
签名^E mod N = 157^5 mod 323 = 123

得到消息 123 与发送者发送过来的消息 123 是一致的,因此签名验证成功.

https://andrea.corbellini.name/2015/05/17/elliptic-curve-cryptography-a-gentle-introction/

加法逆: a在集合中, -a在集合中的定义为使 a + (-a) = 0, 这就是加法逆元运算
乘法逆: a在集合中,且不为0, a^-1 在集合中定位为使 a* a^-1 = 1, 这就是乘法逆元运算

在聊椭圆曲线前,我们先打一些基础然后再讨论一下对数问题.

在一个集合上定义一个二元运算,这就是数学中的群。一个集合 G 要成为一个群,必须满足下面 4 个条件:

从平常的加法概念来看, 整数集 Z 是一个群(而且是阿贝尔群). 自然数集 N 不是一个群.

我们可以在椭圆曲线上定义一个群:

https://andrea.corbellini.name/ecc/interactive/reals-add.html

如下图: 点 A 的自我相加过程就是做 乘法的过程 这个过程叫 Point Doubling

计算 nP 需要做 n次加法 如果 n 为 k 位二进制 时间复杂度为 O(2^k)

倍加算法 比如 n = 151 二进制为 10010111

用倍加算法 时间复杂度有了很大的改进 O(logN) or O(k)

Q = nP

这只是 p = 211, 像 Secp256k1 这条椭圆曲线的 p = 34671663 一个78位的数字 要怎么求出 n?

一个通俗的比喻: 假设这些点是有个人 A 在一个很大的房间里玩弹珠的游戏 玩了两年 两年后 A 的朋友 B来了 B看到了最后的点 以及 A 告诉B 起点 但是B怎么能知道 A 是弹了多少次才从起点弹到终点?

上面这两张图是 椭圆曲线 - Secp256K1: y^2 = x^3 + 7
第一张图: 定义在 实数域
第二张图: 定义在 有限域Zp
是用下面的参数(p,a,b,G,n,h)形成的:

p = FFFFFFFF FFFFFFFF FFFFFFFF FFFFFFFF FFFFFFFF FFFFFFFF FFFFFFFE FFFFFC2F = 2^256 - 2^32 - 997
a = 0
b = 7
G = [0x79BE667E_F9DCBBAC_55A06295_CE870B07_029BFCDB_2DCE28D9_59F2815B_16F81798,
0x483ADA77_26A3C465_5DA4FBFC_0E1108A8_FD17B448_A6855419_9C47D08F_FB10D4B8]
n = 0xFFFFFFFF_FFFFFFFF_FFFFFFFF_FFFFFFFE_BAAEDCE6_AF48A03B_BFD25E8C_D0364141
h = 1

如果椭圆曲线上一点P, 存在最小的正整数 n 使得数乘 nP=O∞, 则将 n 称为 P 的阶

计算可得 27P = -P = (3, 13) 所以 28P = 0∞ P的阶为28

如何签名?
Sig = F sig ( F keccak256 ( m ) , k )

如何计算 r

如何计算 s
s ≡ q^-1 (Keccak256(m) + r * k) (mod p)

如何验证签名?

P.S. 上述验证签名的过程中 没有用到发送者的 私钥

RSA 密钥大小(bits) ECC 密钥大小 (bits)
1024 160
2048 224
3072 256
7680 384
15360 521

有一个研究例子 同一台计算能力的计算机

为什么 比特币和以太坊要选择 Secp256k1 这条椭圆曲线?

假如有人提供一条椭圆曲线比如 Secp256r1 如何验证这条曲线的安全性?

因为公钥是公开的,很容易被破坏或者篡改,因此需要建立和维持一种可信的基础机制来管理公钥。

PKI由5部分组成:

作为比喻,证书可以被视为发给该人的身份证。人们使用驾照,护照等身份证来证明自己的身份。数字证书在电子世界中具有相同的基本功能。
但有一点不同,数字证书不仅发给人,还可以发给电脑,软件包或任何其他需要证明电子世界身份的东西。

数字证书基于ITU标准X.509,该标准定义了公钥证书和认证验证的标准证书格式。因此数字证书有时也被称为X.509证书。

与用户客户端相关的公钥与证书颁发机构(CA)一起存储在数字证书中,以及其他相关信息,例如客户信息,到期日期,使用情况,发行者等。

CA对此整个信息进行数字签名并在证书中包含数字签名。

任何需要对客户的公共密钥和相关信息进行保证的人,他都会使用CA的公钥进行签名验证过程。成功的验证可确保证书中给出的公钥属于在证书中给出详细信息的人员。

下图了展示了个人/实体获取数字证书的过程:

如图所示,CA接受来自客户端的申请以证明其公钥。 CA在适当验证客户身份后,向该客户发出数字证书。

如上所述,CA向客户颁发证书并协助其他用户验证证书。 CA负责正确识别要求颁发证书的客户的身份,并确保证书中包含的信息是正确的并对其进行数字签名。

CA的关键功能:

证书类别
有四种典型的证书类别:

第1类 - 通过提供电子邮件地址可轻松获取这些证书。

第2类 - 这些证书要求提供额外的个人信息。

第3类 - 这些证书只有在对请求者的身份进行检查后才能购买。

第4类 - 它们被需要高度信任的政府和金融机构使用。

CA可以使用第三方注册机构(RA)对要求证书确认其身份的人或公司进行必要的检查。 RA可能在客户端看起来像一个CA,但它们实际上并不签署发布的证书。

这是发布证书的管理系统,暂时或永久暂停,续订或撤销证书。 证书管理系统通常不会删除证书,因为可能有必要在某个时间点证明其身份,这是出于法律原因。 CA和相关RA运行证书管理系统,以便能够跟踪他们的责任。

虽然客户端的公钥存储在证书中,但关联的私钥可以存储在密钥所有者的计算机上。 这种方法一般不采用。 如果攻击者能够访问计算机,他可以轻松访问私钥。 出于这个原因,私钥存储在通过密码保护的安全可移动存储令牌上。

不同的供应商经常使用不同的专有的存储格式来存储密钥。 例如,Entrust使用专有的.epf格式,而Verisign,GlobalSign和Baltimore使用标准的.p12格式。

1.6 Hierarchy of CA:
由于拥有庞大的网络和全球通信的要求,所有用户从唯一一个可信的CA获得证书是不切实际的。其次,只有一个CA的可用性可能会导致大的阻碍,如果CA受到影响。

在这种情况下,层次认证模型很受关注,因为它允许在两个通信方与相同CA没有信任关系的环境中使用公钥证书。

根CA位于CA层次结构的顶部,根CA的证书是自签名证书。

直接隶属于根CA(例如,CA1和CA2)的CA具有由根CA签名的CA证书。

层次结构中下级CA(例如,CA5和CA6)下的CA具有由上级下级CA签名的CA证书。

证书颁发机构(CA)层次体现在证书链中。证书链跟踪从层次结构中的分支到层次结构根的证书路径。

下图显示了具有从实体证书到两个从属CA证书(CA6和CA3)到根证书颁发机构CA证书的证书链的CA层次结构:

验证证书链是确保特定证书链有效,正确签署和可信的过程。 以下过程验证证书链,从提供验证的证书开始 -

一个正在验证其真实性的客户端提供他的证书,通常连同证书链一直到根CA.

验证者获取证书并使用发行者的公钥进行验证。 发行人的公钥在发行人的证书中找到,该证书位于客户证书旁边的链中。

现在,如果已签署发行人证书的较高的CA由验证方信任,则验证成功并在此停止。

否则,发行人证书的验证方式与客户在上述步骤中完成的相似。 此过程将继续进行,直到在其中找到可信的CA,否则它将持续到根CA。

哈希函数非常有用,并且出现在几乎所有信息安全应用程序中。

哈希函数是将数字输入值转换为另一个压缩数值的 数学函数。 哈希函数的输入具有任意长度,但输出始终为固定长度。

哈希函数返回的值称为消息摘要或简单的散列值。 下面的图片说明了哈希函数:

为了成为一个有效的加密工具,哈希函数具有以下属性:

散列的核心是一个数学函数,该函数在两个固定大小的数据块上运行以创建散列码。 这个哈希函数构成哈希算法的一部分。

每个数据块的大小因算法而异。 通常块大小从128位到512位。 下图演示了哈希函数:

哈希算法涉及上述哈希函数,如分组密码。 每一轮都会输入一个固定的大小,通常是最近消息块和最后一轮输出的组合。

这个过程重复进行多次,以散列整个消息。 哈希算法的示意图如下图所示:

因为第一消息块的散列值变成第二散列操作的输入,其输出改变第三操作的结果,等等。 这种效应被称为散列的雪崩效应。雪崩效应对两个即使是单个数据位也不相同的消息产生明显不同的散列值。理解哈希函数和算法之间的区别。 哈希函数通过对两个固定长度的二进制数据块进行操作来生成哈希码。哈希算法是一个使用哈希函数的过程,指定如何分解消息以及如何将先前消息块的结果链接在一起。

后来在1995年,SHA-1被设计用于纠正SHA-0的所谓弱点。SHA-1是现有SHA哈希函数中使用最广泛的。它被用于几个广泛使用的应用程序和协议,包括安全套接字层(SSL)安全。

2005年,发现了一种在实际时间框架内发现SHA-1冲突的方法,使SHA-1的长期可用性受到怀疑。

SHA-2系列具有四个更进一步的SHA变体,SHA-224,SHA-256,SHA-384和SHA-512,取决于其散列值中的位数。还没有成功的攻击报道过SHA-2哈希函数。

虽然SHA-2是一个强大的哈希函数。虽然有很大的不同,但其基本设计仍然遵循SHA-1的设计。因此,NIST要求提供新的竞争性散列函数设计。

2012年10月,NIST选择Keccak算法作为新的SHA-3标准。 Keccak提供了许多好处,例如高效的表现和良好的攻击抵抗力。

该集包括RIPEND,RIPEMD-128和RIPEMD-160。此算法还有256位和320位版本。

原始的RIPEMD(128位)基于MD4中使用的设计原则,并且发现提供可疑的安全性。 RIPEMD 128位版本是解决原始RIPEMD漏洞的快速修复替代品。

RIPEMD-160是一个改进版本,是使用最广泛的版本。与RIPEMD-128和RIPEMD-160相比,256和320位版本分别减少了意外冲突的可能性,但没有更高的安全等级。

Merkle Tree 默克尔树

哈希算法的一个重要应用是默克尔树(Merkle tree),默克尔树是一种数据结构,通常是一个二叉树,也有可能是多叉树,它以特定的方式逐层向上计算,直到顶部,最顶层叫做默克尔根(Merkle Root),默克尔树最为常见和最简单的是二叉默克尔树。

② 密码技术

密码算法的特性
1、是否需要事先配送私钥:对称密码需猜老要考虑
2、是否会遭到中间人攻击:非对称密码分发公钥时需要考虑
3、不可抵赖(可被双方 和 第三方 用原理证明):非对称密码分发公钥时需要考虑
4、能否保证消息的机密性:即不可破译
5、能否保证消息的完整性(一致性):即不可篡改
6、不可冒充(伪造)

总结:对称密码(解决456)--非对称密码之单向通信--> 混合密码(解决1) --非对称密码之数字签名--> 公钥证书(解决23)

概念
密码算法:加密算法 + 密钥 + 解密算法,简称密码
密钥空间:密钥的所有取值
隐蔽式安全性:以密码算法不为人所知,来保证机密性
分组密码:对明文进行分组加密,而非以全文作为输入
流密码:不分组,整体加密

破解密文的方法
1、窃听 + 破译
2、社会工程学
破解密钥的方法
1、暴力破解(密钥穷举),例如破译凯撒密码
2、频率分析,例如破译简单替换密码
3、选择明文攻击(对分组进行明文穷举)

加密系统的可选技术
隐写术:将消息藏在更大的数据中,例如藏头诗
伪随机数生成器
散列值(摘要,哈希值,指纹):原文经过散列函数(摘要函数,哈希函数,杂凑函晌兆庆数,单向加密)计算出来的值
对称密码(共享密钥密码):加密和解密用同一个私钥
非对称密码(公钥密码):公钥加密,私钥解密
消息认证码
数字签名
公钥证书

碰撞:两个消息的散列值相同
弱抗碰撞性:给定一条消息,很难找到另一条消息与其散列值相同。防止以下情形,Bob持有一个消息A,计算其摘要;Alice找到与A散列值相同的另一条消息B,用B将A调包;由于摘要不变,不被Bob发觉
强抗碰撞性:很难找到两条散列值相同的消息。防止以下情形,Alice拿两个摘要相同的消息A和B,将A发给Bob;Bob计算其摘要;Alice再用B将A调包;由于摘要不变,不被Bob发觉
MD5(Message Digest 5)
历史:1991年Ronald Rivest 设计出MD5
现状:2004年王小云提出了MD5碰撞攻击算法
SHA
历史:1993年NIST发布SHA,1995年发布SHA-1,2002年发布SHA-2
现状:2004年王小云提出了SHA-0的碰撞攻击算法;2005年王小云提出了SHA-1的碰撞攻击算法
SHA-3
历史:2007年NIST发起选拔SHA-3,2012年Joan Daemen等人设计的Keccak算法被选定为SHA-3

弱伪随机数:随机性
强伪随机数:不可预测性
真随机数:不可重现性

随机数生成器:硬件可以通过热噪声实现真随机数
伪随机数生成器:软件只能生成伪随机数,需要一种子seed来初始化

伪随机数算法:线性同余法、散列法、密码法等

好的对称密码解决:不可破译
缺点:需要事先配送密钥
凯撒密码
加密算法:字母平移
密钥:平移位数
解密算法:逆向平移
破解密钥:穷举可能的密钥
简单替换密码
加密算法:一个字母替换成另一个字母
密钥:替换表
解密算法:逆向替换
破解密钥:对密文的字母 和 字母组合进行频率分析,与通用频率表对比;用破译出来的明文字母,代入密文,循环分析
Enigma密码
发明者:德国人Arthur Sherbius
加密算法:双重加密,每日密钥作为密钥1,想一个密钥2;用密钥1加密密钥2,得到密钥2密文;用密钥2加密消息;将密钥2密文和消息密文一起发出
密钥:密钥册子记录的每天不同的密钥
解密算法:宴握用每日密钥解密密钥2密文,得到密钥2;用密钥2解密消息密文
破译者:Alan Turing 图灵

DES密码(Data Encryption Standard)
历史:1974年IBM公司的Horst Feistel开发出了Lucifer密码,1977年被美国国家标准学会(American National Standards Institute,ANSI)确定为DES标准
加密算法:以64比特为一组,进行16轮运算。在一轮中,把一组分为左侧和右侧,并从密钥中提取子密钥;轮函数用一侧和子密钥生成一个比特序列,用这个比特序列对另一侧进行异或运算(XOR)
密钥:长度56位
破译:可在现实时间内被暴力破解

三重DES密码(triple-DES,TDEA,3DES)
加密算法:将DES重复三次
密钥:长度 56 * 3

AES密码(Advanced Encryption Standard)
历史:1997年,美国国家标准与技术研究院(National Institute of Standards and Technology,NIST)公开募集AES,2000年比利时密码学家Joan Daemen 和 Vincent Rijmen提交的Rijndael方案,被选为标准
加密算法:以128比特为一组,进行多轮的替换、平移、矩阵运算
密钥:有128,192,256三种长度

分组密码的迭代模式
ECB模式:Electronic CodeBook mode,电子密码本模式;明文分组 和 密文分组 顺序对应。主动攻击者可以改变密文分组的顺序,复制 或 删除密文分组,使得接受者解密后得到错误的明文
CBC模式:Cipher Block Chaining mode,密码分组链接模式;将本组明文 和 上组密文 进行异或运算后,在进行加密;如果被篡改,则不能正常解密
CFB模式:Cipher Feedback mode,密文反馈模式;将本组明文 和 上组密文 进行异或运算后,就得到本组的密文
OFB模式:Output Feedback mode,输出反馈模式;用随机比特序列作为初始化组(初始化向量);用初始化组的密文和 明文分组 异或运算,得到密文分组;再次对初始化组密文进行加密运算,得到新的初始化组密文,跟下组明文进行异或运算,以此类推
CTR模式:CounTeR mode,计数器模式;用随机比特序列作为计数器的初始值,加密后与明文分组进行异或操作,得到密文分组;计数器加一,对下组明文进行加密

对称密码中,发送方发送密文时,带上消息的MAC值A;接收方用相同方法计算出MAC值B;对比A和B,确保消息不被篡改
Encrypt-then-MAC:MAC值为消息密文的散列值
Encrypt-and-MAC:MAC值为消息明文的散列值
MAC-then-Encrypt:MAC值为明文散列值的密文

重放攻击:攻击者窃听到Alice给Bob发送的消息后,重复给Bob发送,Bob以为都是Alice发的
预防重放攻击:消息里带有一个id

比对称密码:不可篡改、不可伪造
缺点:需要实现配送私钥

基于口令的密码:Password Based Encryption,PBE
解决:密钥(会话密钥)保存问题
CEK:会话密钥
KEK:用来加密CEK的密钥
方案
1、随机数作为盐salt,口令 + 盐 的散列值作为KEK
2、用KEK加密CEK,得到CEK密文
3、只保存盐和CEK密文,人脑记住口令,丢弃KEK

字典攻击:如果没有盐参与生成KEK,那么口令决定了KEK,常用的口令对应一个常用KEK字典,攻击者直接拿常用KEK去解密CEK密文
盐的作用:KEK由盐参与形成,不可能有KEK字典包含这样的KEK

非对称密码单向通信,不能单独用于通信,只用在混合密码中
方案:Alice 给 Bob 分发加密密钥(公钥);Bob用公钥加密消息,发送给Alice;Alice用解密密钥(私钥)解密
总结:消息接收者是密钥对主人,即私钥持有人;公钥用于加密,私钥用于解密

RSA密码
历史:1978年,Ron Rivest、Adi Shamir、Reonard Adleman共同发表了RSA
加密算法:密文 = 明文 E mode N
公钥:E 和 N的组合
解密算法:明文 = 密文 D mode N
私钥:D 和 N的组合

生成密钥对
生成质数:用伪随机数生成随机数,通过Miller-Rabin测试法测试它是不是质数,直到得到质数
求最大公约数:欧几里得的辗转相除法
1、求N
生成两个512位的质数p和q,N = p * q
2、求L
L是p-1 和 q-1 的最小公倍数
3、求E
用伪随机数生成(1,L)范围内的随机数,直到满足E和L的最大公约数为1
4、求D
用伪随机数生成(1,L)范围内的随机数,直到满足(E * D) mod L = 1

破解:对N进行质因数分解,得到p和q,从而求出D。但是对大数的质因数分解,未有快速有效的方法

首次通信为混合密码,后续通信为对称密码
比消息认证码:无需事先配送私钥
总体思路:Bob 用会话密钥加密消息,用Alice的公钥加密会话密钥,一起发给Alice;Alice用私钥解密会话密钥,用会话密钥解密消息
会话密钥:用来加密消息的 对称密码的密钥
1、Alice 给 Bob 发送公钥
2、Bob随机生成会话密钥,用会话密钥加密消息,得到消息密文
3、Bob用公钥加密会话密钥,得到会话密钥密文
4、Bob将会话密钥密文和消息密文一起发给Alice
5、Alice用私钥解密会话密钥,再用会话密钥解密消息
6、双方都有了会话密钥,从此以后,可以用对称密码通信了,带上消息认证码

缺点:分发公钥时,可能遭受中间人攻击;Alice可能对给Bob发送公钥这件事进行抵赖
中间人攻击:中间人从一开始Alice向Bob发放公钥时,就拦截了消息,得到Alice的公钥;然后伪装成Alice,向Bob发送自己的公钥;从而Bob打算发给Alice的消息,能被中间人解密

不能单独用于通信,只用在公钥证书中
明文签名:Alice用签名密钥(私钥)加密消息的摘要,把摘要密文和消息明文一起发给Bob;Bob解密摘要密文,得到摘要A;算出明文摘要B,对比A和B
总结:私钥用于加密,公钥用于解密,与 非对称加密之单向通信,刚好反过来

公钥证书:Public-Key Certificate,PKC,简称证书
认证机构:Certification Authority,CA
证书标准:国际电信联盟ITU 和 国际标准化组织ISO指定的X.509标准
流程:
1、Alice在CA登记
2、CA生成Alice的证书明文,包含Alice登记的信息、Alice的公钥、CA信息
3、CA用自己的私钥加密证书明文部分,得到数字签名
4、证书明文部分 和 数字签名 组成PKC,颁发给Alice
5、Bob向Alice获取这个PKC,拿本地已有的CA公钥去验证证书,就得到了可信的Alice的公钥
6、从此Alice 和 Bob之间可以进行混合密码通信

首次通信为从CA获取PKC,后续通信为混合密码
比混合密码:防止了中间人攻击;CA不能抵赖自己的证书

历史:1994年网景公司设计出SSL,2014年SSL 3.0被发现安全漏洞,1999年IEIF发布TLS
TLS(Transport Layer Security)是SSL(Secure Socket Layer)的后续版本,在tcp和http之间加一层TLS,就是https
OpenSSL:OpenSSL是实现SSL/TLS协议的工具包
以https为例
0、浏览器安装时,存有几个CA公钥;服务器在CA登记,拿到证书
1、浏览器访问一个https地址,服务器返回自己的证书
2、浏览器根据证书上的CA信息,拿对应的CA公钥验证证书,得到可信的服务器公钥
3、浏览器生成对称密码的密钥(会话密钥),用服务器公钥加密后发给服务器
4、服务器解密后得到会话密钥,从此用对称密码通信,带上消息认证码

1、生成JKS证书:keytool -genkeypair -alias "别名" -keyalg "RSA" -keystore "D:app.jks"
2、将JKS转换成PKCS12:keytool -importkeystore -srckeystore D:app.jks -destkeystore D:app.p12 -deststoretype pkcs12
3、将PKCS12转成pem:openssl pkcs12 -in ./app.p12 -out app.pem
4、提取加密后的私钥:将pem中 “—–BEGIN ENCRYPTED PRIVATE KEY—–” 至 “—–END ENCRYPTED PRIVATE KEY—–” 的内容拷贝出来,保存为ciphertext.key
5、将密文私钥转成明文私钥:openssl rsa -in ciphertext.key -out plaintext.key

.jks(Java Key Storage):二进制格式,包含证书和私钥,有密码保护
.pfx 或 .p12(Predecessor of PKCS#12):二进制格式,包含证书和私钥,有密码保护
.pem(Privacy Enhanced Mail):文本格式,包含证书,可包含私钥,私钥有密码保护
.der 或 .cer:二进制格式,只包含证书
.crt(Certificate):可以是der格式,也可以是pem格式,只包含证书

SSL证书:SSL证书必须绑定域名,不能绑定IP
加密服务、密钥管理服务

③ 区块链密码算法是怎样的

区块链作为新兴技术受到越来越广泛的关注,是一种传统技术在互联网时代下的新的应用,这其中包括分布式数据存储技术、共识机制和密码学等。随着各种区块链研究联盟的创建,相关研究得到了越来越多的资金和人员支持。区块链使用的Hash算法、零知识证明、环签名等密码算法:

Hash算法

哈希算法作为区块链基础技术,Hash函数的本质是将任意长度(有限)的一组数据映射到一组已定义长度的数据流中。若此函数同时满足:

(1)对任意输入的一组数据Hash值的计算都特别简单;

(2)想要找到2个不同的拥有相同Hash值的数据是计算困难的。

满足上述两条性质的Hash函数也被称为加密Hash函数,不引起矛盾的情况下,Hash函数通常指的是加密Hash函数。对于Hash函数,找到使得被称为一次碰撞。当前流行的Hash函数有MD5,SHA1,SHA2,SHA3。

比特币使用的是SHA256,大多区块链系统使用的都是SHA256算法。所以这里先介绍一下SHA256。

1、 SHA256算法步骤

STEP1:附加填充比特。对报文进行填充使报文长度与448模512同余(长度=448mod512),填充的比特数范围是1到512,填充比特串的最高位为1,其余位为0。

STEP2:附加长度值。将用64-bit表示的初始报文(填充前)的位长度附加在步骤1的结果后(低位字节优先)。

STEP3:初始化缓存。使用一个256-bit的缓存来存放该散列函数的中间及最终结果。

STEP4:处理512-bit(16个字)报文分组序列。该算法使用了六种基本逻辑函数,由64 步迭代运算组成。每步都以256-bit缓存值为输入,然后更新缓存内容。每步使用一个32-bit 常数值Kt和一个32-bit Wt。其中Wt是分组之后的报文,t=1,2,...,16 。

STEP5:所有的512-bit分组处理完毕后,对于SHA256算法最后一个分组产生的输出便是256-bit的报文。

2、环签名

2001年,Rivest, shamir和Tauman三位密码学家首次提出了环签名。是一种简化的群签名,只有环成员没有管理者,不需要环成员间的合作。环签名方案中签名者首先选定一个临时的签名者集合,集合中包括签名者。然后签名者利用自己的私钥和签名集合中其他人的公钥就可以独立的产生签名,而无需他人的帮助。签名者集合中的成员可能并不知道自己被包含在其中。

环签名方案由以下几部分构成:

(1)密钥生成。为环中每个成员产生一个密钥对(公钥PKi,私钥SKi)。

(2)签名。签名者用自己的私钥和任意n个环成员(包括自己)的公钥为消息m生成签名a。

(3)签名验证。验证者根据环签名和消息m,验证签名是否为环中成员所签,如果有效就接收,否则丢弃。

环签名满足的性质:

(1)无条件匿名性:攻击者无法确定签名是由环中哪个成员生成,即使在获得环成员私钥的情况下,概率也不超过1/n。

(2)正确性:签名必需能被所有其他人验证。

(3)不可伪造性:环中其他成员不能伪造真实签名者签名,外部攻击者即使在获得某个有效环签名的基础上,也不能为消息m伪造一个签名。

3、环签名和群签名的比较

(1)匿名性。都是一种个体代表群体签名的体制,验证者能验证签名为群体中某个成员所签,但并不能知道为哪个成员,以达到签名者匿名的作用。

(2)可追踪性。群签名中,群管理员的存在保证了签名的可追踪性。群管理员可以撤销签名,揭露真正的签名者。环签名本身无法揭示签名者,除非签名者本身想暴露或者在签名中添加额外的信息。提出了一个可验证的环签名方案,方案中真实签名者希望验证者知道自己的身份,此时真实签名者可以通过透露自己掌握的秘密信息来证实自己的身份。

(3)管理系统。群签名由群管理员管理,环签名不需要管理,签名者只有选择一个可能的签名者集合,获得其公钥,然后公布这个集合即可,所有成员平等。

链乔教育在线旗下学硕创新区块链技术工作站是中国教育部学校规划建设发展中心开展的“智慧学习工场2020-学硕创新工作站 ”唯一获准的“区块链技术专业”试点工作站。专业站立足为学生提供多样化成长路径,推进专业学位研究生产学研结合培养模式改革,构建应用型、复合型人才培养体系。

④ Solidity - 内存布局

在 Solidity - 引用类型 中提到,当没有给局部变量的 uint[] storage p 赋值的时候, p 会默认指向 storage 的第一个 slot 。
首先, slot 的英文翻译是指容器的插槽、投币口,暂时先不解释这个东西。先看看 storage ,官方对 storage 的解释是

简单理解就是, storage 是一个超大的数组,数组可以看成储物柜, slot 就是一个个的小柜子。

其中每一个 slot 的大小是 32 字节, slot0 的地址(即 storage 的起始地址)是 0x00 。Solidity对声明时候没有进行初始化的变量,都默认值为0。因此 p 作为一个指针,其中指针的值就是内存的地址(这点与C语言指针一样),因此它会指向 slot0 。至于为什么 a 的值变了,当然就是因为 a 存储在了 slot0 。
下面整理一下 storage 内存布局的几条规则:

items_arr 数组有三个元素,他们的内存占用情况是,首先 struct items 的内存占用是2字节,然后按照一个 struct 占用一个 slot 的话,那么 items_arr 占用了 3*32 的字节,其中很多都浪费了。(这个其实我自己也不太肯定,因为使用Remix调试的时候,看不到 storage 内存详情,也许要通过指令集来判断,这里暂时存疑,以后验证再补充。XXX)

arrays 有两种类型,静态长度 uint[3] 与动态长度 uint[] 。静态长度的话,在编译的时候,就可以确定他的内存占用大小,因此可以提前分配。但是动态长度的 array ,他的元素大小是不确定的,因此需要使用别的方式来存储动态长度的数组。举个例子:

其中 a 的位置是 slot0 ,那丛握么 b 的位置是 slot1 , c 的位置是 slot2 , d 的位置是 slot3 - slot5 。没蔽可以看到动长数组只占用了一个 slot ,然后这个位置用来存放动长数组的长度,即 b.lenght 的值。动态数组的元素存储在其他的位置,这个位置根据 keccak256() 方法计算出来,比如 b[1] 的位置就是 keccak256(1 . p) 。其中渗察庆 p 是 b 所在 slot1 的起始地址 0x32 (因为一个 slot 占 32 个字节),另外 . 代表的是连接符。

Mappings 也会占用一个 slot ,但是这个 slot 是空的,不记录东西,用来做为寻找元素的 基址 ,寻址方式则跟 Arrays 的一样。

⑤ 密码技术(七、二)之单向散列函数

单向散列函数
  ——获取消息的“指纹”

 MD4是由Rivest 于1990年设计的单向散列函数,能够产生128比特的散列值。不过,虽则Dobbertin提出寻找MD4散列碰撞方法,现在它已经不安全了。
 MD5是由Rivest于1991年设计的单向散列函数,能够产生128比特的散列值。MD5的强抗碰撞性已经被攻破,也就是说,现在已经能够产生具备相同散列值的两条不同的消息,因此它也已经不安全了。
MD4和MD5的MD是消息摘要(Message Digest)的缩写。

 SHA-1是由NIST(National Institue of Standards and Technology ,美国国家标准计算研究所)设计的一种能够产生160比特的散列值的单向散列函数。1993年别作为美国联邦信息处理标准规格发布的是SHA,1995年发布修订版FIPS PUB 180-1称为SHA-1。在《CRYPTREC密码清单》中,SHA-1已经被列入“可谨慎运用的密码清单”,即除了用于保持兼容性的目的以外,其他情况都不推荐使用。
 SHA-256、SHA-384和SHA512都是由NIST设计的单向散列函数,它们的散列值长度分别为256比特、384比特和512比特。这些单向散列函数合起来统称为SHA-2,它们的消息长度也存在上限(中握SHA-256的上限近于2 64比特,SHA-384和SHA-512的上限接近于2 128比特 )。这些单词散列函数式于2002年和SHA-1一起作为FIPS PUB 180-2发布的。
 SHA-1的腊哪强抗碰撞性已于2005年被攻破,也就是说,现在已经能够产生具备相同散列值的两条不同消息。不过SHA-2还尚未被攻破。
6种版本SHA-2

 RIPEMD 是与1996年由Hans Dobbertin、Antoon Bosselaers 和Bart Preneel 设计的一种能够产生160比特的散列值单向散列函数。RIPEMD-160是欧盟RIPE项目所设计的RIPEMD单向散列函数的修订版。这一系列的函数还包括RIPEMD-128、RIPEMD-256、RIPEMD-320等其他一些版本。在《CRYPTREC密码清单》中,RIPEMD已经被列入“可谨慎运用的密码清单”,即除了用于保持兼容性的目的以外,其他情况都不推荐使用。
 RIPEMD的强碰撞性已于2004年被攻破,但RIPEMD-160还尚未被攻破。比特币中使用的就是RIPEMD-160。

 SHA-3(Secure Hash Algorithm-3)是一种作为新标准发布的单向散列函数算法,用来替代在理论上已经被找出攻击方法的SHA-1算法。全世界的企业和密码学家提交了SHA-3的候选方案很多,经过5年的选拔,最终在2013年正式确定了将Keccak算法作为SHA-3的标准。
Keccak最终被选为SHA-3的理由如下:

 Keccak是一种被选定为SHA-3标准的单向散列函数算法。
 Keccak可以生成任意长度的散列值,但是为了配合SHA-2的散列值长度,SHA-3标准中共规定了SHA3-224、SHA-3-256、SHA3-384、SHA3-512这4个版本。在输入数据的长度上限方面,SHA-1为2 64-1比特,SHA-2为2 128-1比特,而SHA-3则没有限制。
 此外FIPS202中还规定了两个卖局庆可输出任意长度散列值的函数(extendable-output function,XOF),分别为SHAKE128和SHAKE256。据说SHAKE这个名字取自Secure Hash Algorithm 与Keccak这几个单词。

 Keccak采用了海绵结构,输入的数据在进行填充后,要经过 吸收阶段 挤出阶段 ,最终生成输出的散列值。
并且作为海绵结构的变形, Keccak中还提出了一种双共结构。
这里关于 Keccak的结构,不做过多解读,想详细了解,请参考原着;

暴力破解
任何文件中都或多或少存在具有一定的冗余性。利用文件的冗余性生产具有相同散列值的另一个文件,这就是一种针对单向散列函数的攻击。
在对密码进行暴力破解时,我们就是按照顺序改变密钥,如0、1、2、3.....然后分别用这些密钥进行解密的,对单向散列函数进行暴力破解也是如此,即每次都稍微改变一下消息的值,然后对这些消息求散列值。
现在我们在寻找的是一条具备特定散列值的消息,具备相同散列值的另一条不同的消息。这相当于一种 试图破解单向散列函数的“弱碰撞性”的攻击 。在这种情况下,暴力破解需要尝试的次数,可以根据散列值的长度计算出来,以SHA3-512为例,由于它的散列值长度为512比特,因此最多只需要尝试2^512次就能找到目标消息了,如此多的尝试次数在现实中是不可能完成的。
由于尝试次数纯粹是由散列值的长度决定的,因此散列值的长度越长的单向散列函数,其抵御暴力破解的能力也就越强。
找出具有指定散列值的消息的攻击方式分为两种,即“原像攻击”和“第二原像攻击”。 原像攻击 (Pre-Image Attack)是指定一个散列值,找出具有该散列值的任意消息; 第二原像攻击 (Second Pre-Image Attack)是指定一条消息1,找出另外一条消息2,消息2的散列值和消息1相同。

生日攻击
要找到散列值相同的两条消息,而散列值则可以是任意值。这样的攻击,一般称为 生日攻击 (birthday attack)或是 冲突攻击 (collision attack),这是一种 试图破解单向散列函数的“强碰撞性” 攻击。
我们以512比特的散列值为例,对单向散列函数进行暴力破解所需要的尝试次数2^512 次,而对同一单向散列函数进行生日攻击所需要尝试的次数2^256次,因此和暴力破解相比,生日攻击所尝试的次数要少的多。

单向散列函数能够辨别出“篡改”,但无法辨别出“伪装”。
当我们不仅需要确认文件的完整性,同时还需要确认这个文件是否真的属于他的,我们还需要认证。

该系列的主要内容来自《图解密码技术第三版》
我只是知识的搬运工
文章中的插图来源于原着