加解密技术的核心是异或运算
1011 密钥为 0101 进行异或运算得到 密码11101011 即明文!异或运算的好处是 执行速度非常快,执行一遍即可
填充
我们来讨论下实现加密技术如何对明文进行分组。
最简单的分组模式时ECB模式,直接将明文分解为多个块,对每个块独立加密

这种模式的缺点是无法隐藏数据特征

我们实际期望的是全躁点

我们改进一下方案, 每个明文块先与前一个密文块进行异或后,再进行加密,这样就消除了躁点

这种方式的缺点是: 加密过程串行化, 无法利用多核CPU的优势
如果 通过递增一个加密计数器以产生连续的密钥流 进行加密如何呢? 可以对内容进行分片,从而利用多核CPU进行加密

这种方式的确解决了利用多核CPU优势的问题,仔细分析还有个问题是,无法验证消息的完整性(网络上数据传输可能丢失,而我们不知道)

MAC(Message Authentication Code)算法是 hash函数的一种

有了MAC函数就有了GCM
GCM = CTR + GMAC

对于密文进行MAC算法得到hash
AES(Advanced Encryption Standard)
为比利时密码学家Joan Daemen和Vincent Rijmen所设计,又称Rijindael加密算法
常用填充算法: PKCS7
常用分组工作模式: GCM
AES的三种密钥长度
AES分组长度是128位(16字节)

AES加密步骤
不管AES如何安全,那么它如何将密钥传送给对方呢?非对称加密就可以解决这个问题。
常用的非对称加密算法: RSA
非对称加密的应用: PKI证书体系、DH密钥交换协议
1. 我们先看一下公钥和私钥如何产生

我们选取了p=11 q=29 k=3,按照上述流程得到
2. 有了公钥和私钥,我们再看一下加解密过程

按照上述流程我们来验证一下

我们在选一个数 26吧,进行私钥加密公钥解密

因为涉及大量乘法,所以非对称加密很耗费性能
注意: 明文 要小于 p和q的乘积n, 如我们 选取明文320(320>319) 加密后就无法进行解密
思考:为什么公私钥加密是安全的呢?
参考第一张图
openssl genrsa -out private.pemopenssl rsa -in private.pem -pubout -out public.pemopenssl asn1parse -l -in private.pem 



PKI证书体系是非对称加密的应用
为什么需要PKI证书体系
公钥的管理: Public Key Infrastructure (PKI) 公钥基础设施
CA信息、公钥用户信息、公钥、权威机构的签字、有效期签发证书流程

签名与验签流程

证书信任链

证书分类
在TLS/SSL握手中,DH协议是一种常用的算法,用来沟通协商出后面对称加密所使用的密钥
事实上 我们使用RSA算法所生成的公私钥,基于这些公私钥生成对称加密所使用的密钥也是可行的
具体流程如下:
有人会说这个模型有个问题是服务端的消息会被机密,这个我们可以通过PKI证书体系传递公钥解决服务端消息的保密性。这里我们讨论另一个问题,消息的前向保密性
什么叫前向保密性呢? 假设有个中间人,我现在没有破解server的私钥, 我先通过网络设备,把中间的报文都保存下来,当某一天我破解了 server的私钥,我们就可计算出密码传输的密钥, 就可以对所有的消息解密了。
DH密钥交换协议,就是解决这个问题的
具体流程如下图;
publickey1 privatekey1)把自己的公钥 publickey1 发给客户端publickey2 privatekey2)并将publickey2发给服务端privatekey2和publickey1 生成的密钥 与 服务端使用 privatekey1和publickey2生成的密钥一致这样即使 privatekey1被破解, 由于 privatekey2 不会知道, 所以还是无法破解之前保存的报文, 从而具有前向保密性
具体示例如下图

我们来验证一下
jsvar p = 23n, g = 5n; // 公开数
var a = 6n, b = 15n; // 双方私钥
var A = g**a % p;
var B = g**b % p;
var K1 = A**b % p;
var K2 = B**a % p;
console.log(K1 === K2, A, B, K1, K2); // true 8n 19n 2n 2n
// p g a b可以随便调整, K1与K2值不变
DH密钥交换协议存在一个问题 中间人攻击
Q: 什么情况下会出现中间人攻击呢?
A: 代理工具、DNS劫持等。
解决方案就是引入第三方 解决身份验证问题, 即KPI证书体系
由于DH密钥交换协议有两个问题
现在互联网中主要使用的是ECDH密钥交换协议,它其实是DH密钥交换的升级,它基于ECC椭圆曲线的特性来实现

上图 就是维尔斯特拉斯椭圆函数
椭圆曲线始终沿X轴对称。
从上面四张图来看,它跟椭圆无关,之所以叫做椭圆曲线,是因为它在计算某些属性的时候与计算椭圆弧长相关的属性具有相似之处。
ECC曲线的特性: +运算

这里的+运算并非数学中的+运算,只是一种假设运算,利用数学中+运算的特性(结合律、交换律)

P和Q是曲线上的两点,P和Q连线交与曲线R1点,R是R1关于X轴的对称点,也在曲线上.
假设 ,那么 ,即
如果 P和Q是同一点,则
我在这个网站绘制了一张图

求解 有个公式
以上就是椭圆曲线+运算的几何意义和代数意义。那么它与加解密有什么关系呢?
ECC的关键原理

为什么正向运算快? 这里有个可以借助指数运算
逆向运算,已知Q与P,求出多少个K,这是没有规律的,只能暴力求解。
这个公式里 是已值的, 是公钥, 就是私钥。
ECDH协议就是DH协议使用椭圆曲线ECC后的变种,优点是比DH计算速度快,同等安全条件下密钥更短

前面讲了非称加密有两种方案
g**私钥 % p 生成各自的公钥A和B进行交换对方公钥**自己私钥 % p, 双方得到同一个密钥K+运算实现求解困难验证容易。本文作者:郭敬文
本文链接:
版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!