Cryptography I 学习笔记 --- 密钥交换
1. 使用可信第三方(Trusted third parties)进行密钥交换。
a. Alice与TTP之间的密钥是K1,Bob与TTP之间的密钥是K2。
b. Alice向TTP发起一个与Bob交换密钥的请求。TTP生成一个随机密钥Kab,然后将Kab用K1加密,得到E1,将Kab用K2加密,得到E2。
c. TTP将E1与E2一起发送给Alice。Alice用K1解密E1,得到密钥Kab。
d. Alice再将E2发送给Bob,Bob用K2解密E2,也得到密钥Kab。
e. 现在Alice与Bob之间就有一个共享的密钥Kab了。
TTP的缺点是完全中心化,如果TTP被攻破,会导致所有传递过的密钥暴露。
2. Merkle算法
第一个被发明的无需依赖TTP的对称加密条件下的密钥交换算法。
核心思想:Alice产生n个很难的问题Q,每个问题附带一个密钥K,然后将这些问题全部转发给Bob,Bob随机挑选一个问题Qi求解,将解算的结果返回给Alice,Alice拿到Bob的运算结果后可以在常数时间内知道Bob求解的问题Qi。然后Alice与Bob就可以使用Qi所对应的密钥Ki进行通信了。攻击者不知道Bob选中的是哪个问题,必须要求解所有的问题才行,在n很大的情况下,可以认为是安全的。
范例:Alice创建2^32个密钥对,第i个密钥对是128bit的随机数Xi与Ki,将密钥对拼接并加入识别码,得到明文Pi(eg: Pi = "Puzzle#Xi+Ki"),将Pi用i加密,得到密文Ei。Alice在本地保存这2^32个密钥对,然后将2^32个Ei发送给Bob。Bob随机选取一个Ei,然后用0到2^32-1这2^32个密钥对Ei进行解密,如果解密后的结果是以Puzzle开头,那么认为解密成功。Bob得到 Xi与Ki,然后将Xi发回给Alice。Alice收到Xi后查表也可以得到Ki。此时Alice与Bob得到了共享密钥Ki,于是可以安全通信了。
缺点:这个算法并不实用,因为即使n=2^32,那么攻击者也只需要2^64次计算即可解密。如果把n设为2^64,攻击次数则上升到2^128,安全固然是安全了,但是Alice需要花太多时间来生成谜题,然后将这些谜题转发给Bob了。
3. 基于对称加密的密钥交换体系最好也只能做到平方鸿沟(quadratic gap,攻击者的时间复杂度是参与者的时间复杂度的平方)了,真正实用的不依赖于TTP的密钥交换体系,需要用到非对称密钥体系。
4. Diffie-Hellman协议
a. Alice或者Bob生成一个2000bit的大质数p,然后生成一个介于1到p之间的整数g,然后将p与g公开
b. Alice随机选择一个介于1到p-1之间的整数a,Bob随机选择一个介于1到p-1之间的整数b
c. Alice计算A = ga (mod p),Bob计算B = gb (mod p)
d. Alice与Bob交换A与B
e. Alice与Bob之间的共享密钥是gab (mod p),分别可以由Ba (mod p)与Ab (mod p)得到
证明:A= ga (mod p) = ga - k*p ==> Ab (mod p) = (ga - k*p)b (mod p) ==> 对 (ga - k*p)b 做二项式展开,可以知道除了第一项为gab以外,其他的项都带有因数p,这些项都可以在mod p的操作中被约掉 ==> Ab (mod p) = gab (mod p)
如果攻击者想用从p,g,ga,gb计算得到gab,已知的最好算法是GNFS(General Number Field Sieve,一般数域筛法),其时间复杂度为On立方根,这是一个亚指数时间复杂度算法。
补充:基于椭圆曲线(elliptic curve)的Diffie-Hellman协议有更强大的时间复杂度,下表是相同破解难度下的密钥长度对比
cipher key size | modulus size | elliptic curve size |
80 bits | 1024 bits | 160 bits |
128 bits | 3072 bits | 256 bits |
256 bits(AES) | 15360 bits | 512 bits |
5. 原始的Diffie-Hellman协议只能阻止窃听攻击,无法阻止中间人攻击
如果有中间人完全劫持了Alice与Bob之间的信道,Alice发送的A被中间人篡改为A'后发送给Bob,Bob发送的B被篡改为B'后发送给Alice。于是Alice认为密钥是gb'a (mod p),Bob认为密钥是ga'b (mod p)。由于中间人知道a'与b',他可以轻易的计算出这两个密钥。现在他需要做的事情只是把Alice发出的密文Ea用gb'a (mod p)解密,即可得到明文P,再把明文用密钥ga'b (mod p)加密后得到的密文Eb转发给Bob即可。
6. Diffie-Hellman具有非互动性,比方Alice,Bob,Charlie,David都在自己的Facebook上公开了自己的公钥(ga,gb,gc,gd),那么如果Alice想要与David通信,她只需要去David的公共主页上看一眼他的公钥gd,就能立刻计算出密钥gad,然后就能与David安全通信了。
7. 基于公钥加密算法的密钥交换体系
a. Alice生成一个密钥对:pk与sk,然后向Bob发布她的公钥pk
b. Bob接到pk后生成一个随机密钥k,然后用pk对k进行加密,得到密文E
c. Bob将E发送给Alice
d. Alice用私钥sk对E解密,即可得到k
e. Alice与Bob可以用k进行安全通信了
8. 这种密钥交换体系无法抵御中间人攻击。
如果中间人完全劫持了Alice与Bob之间的信道,他可以将Alice所发布的公钥pk替换为自己生成的密钥对(pk'与sk')中的公钥pk',然后将pk'发送给Bob。Bob用pk'对k加密得到E'。中间人用私钥sk'对E'解密得到k,然后再用Alice的公钥pk对k进行加密得到E,再将E回传给Alice即可。
Cryptography I 学习笔记 --- 密钥交换的更多相关文章
- Cryptography I 学习笔记 --- 总结
在b站上大概的看完了Dan Boneh的密码学,对现代密码学总算有了一个粗浅的认识. 总算能在纸上手写RSA公式并且证明之了,蛤蛤. 总体的感触就是,现代密码学是一个非常博大精深的体系,我等程序员最重 ...
- Cryptography I 学习笔记 --- 基于Diffie-Hellman的公钥加密
1. Diffie-Hellman协议: 假定g是集合G的生成元,G有n个元素. Alice随机选取1-n中的一个数a,并公布ga为公钥 Bob随机选取1-n中的一个数b,并公布gb为公钥 那么gab ...
- Cryptography I 学习笔记 --- 基于陷门置换的公钥加密
RSA算法的工作流程 1. 生成公钥私钥 生成两个素数p和q,计算n=p*q,计算φ(n)=n-p-q+1,然后生成e与d,使 e * d = 1 mod φ(n). 然后以(n, e)作为公钥,(n ...
- Cryptography I 学习笔记 --- 数论简介
0. Zn代表{0,1....n-1}的集合 1. 模运算符合交换律结合律 2. gcd(greatest common divisor),可以由扩展欧几里得算法快速得到. 3. 模逆(modular ...
- Cryptography I 学习笔记 --- 零碎
1. KDF(密钥推导函数,key derivation function),根据用户输入的一个初始密钥来生成一系列的后续密钥.可以使用PRF来生成 2. 可以用salt与slow hash func ...
- Cryptography I 学习笔记 --- 认证加密
1. 认证加密,Alice与Bob共享一个密钥k,Alice可以发送密文E给Bob,Bob可以确定接收到的E一定是拥有密钥k的Alice产生的.而不是攻击者随便产生的. 2. 认证加密必须能抵挡住选择 ...
- Cryptography I 学习笔记 --- 抗碰撞
1. 生日攻击,如果hash函数可以产生n bit的结果,那么生日攻击的时间复杂度在O(nn/2)这个量级.以比特币使用的SHA256为例,其hash结果为256bit,那么如果想完成一次生日攻击,那 ...
- Cryptography I 学习笔记 --- 信息完整性
1. ECBC-MAC,需要一对密钥k与k1,然后将明文分组,用cbc模式对明文分块加密,将最后的密文块再用k1进行加密,即可得到结果 2. NMAC,需要一对密钥k与k1,然后将明文分组,用k加密第 ...
- Cryptography I 学习笔记 --- 使用分组密码
1. 如果加密算法是确定性的(相同的明文产生相同的密文),那么它对于选择明文攻击是不安全的 2. 随机化加密,每次对相同的密文加密,会产生不同的结果 AES加密模式 ecb:明文分块计算,块与块之间没 ...
随机推荐
- 【转】Python操作MongoDB
Python 操作 MongoDB 请给作者点赞--> 原文链接 这篇文章主要介绍了使用Python脚本操作MongoDB的教程,MongoDB作为非关系型数据库得到了很大的宣传力度,而市面 ...
- Google Authenticator(谷歌身份验证器)C#版
摘要:Google Authenticator(谷歌身份验证器),是谷歌公司推出的一款动态令牌工具,解决账户使用时遭到的一些不安全的操作进行的"二次验证",认证器基于RFC文档中的 ...
- 使用 htaccess 重写 url,隐藏查询字符串
例如我们有如下 URL: http://example.com/users.php?name=tania 但是我们想要让 URL 变成如下: http://example.com/users/tani ...
- postgresql connection failure:SQLSTATE[08006] [7] could not connect to server: Permission denied Is the server running on host "127.0.0.1" and accepting TCP/IP connections on port 5432?
PHP 程序无法连接到 CentOS 上的PostgreSQL,但是在 CentOS 服务器上却能正常运行 psql, 操作如下:多次重启 PG 数据库后发现 CGI 脚本无法连接数据库,但是可以使用 ...
- PAT乙级 1001(C)+1054(Java)
准备一天两道题,就这样吧,先从水题开始. 1001.点击查看 分析:看懂题就应该写出来了,注意边界与0情况的处理. #include<stdio.h> #include<math.h ...
- redis linux 安装
安装 1): wget http://download.redis.io/releases/redis-5.0.2.tar.gz 2): tar xzf redis-5.0.2.tar.gz 3):c ...
- SRCNN(一)
SRCNN学习(一):demo_SR.m 一.demo_SR.m 使用方法 1.Place the "SRCNN" folder into "($Caffe_Dir)/e ...
- UVALive 5033 I'm Telling the Truth 二分图最大匹配(略有修改)
I - I'm Telling the Truth Time Limit:3000MS Memory Limit:0KB 64bit IO Format:%lld & %llu ...
- Threadlocal_笔记
参考:https://www.jianshu.com/p/377bb840802f https://www.cnblogs.com/dreamroute/p/5034726.html ThreadLo ...
- POJ 3321:Apple Tree(dfs序+树状数组)
题目大意:对树进行m次操作,有两类操作,一种是改变一个点的权值(将0变为1,1变为0),另一种为查询以x为根节点的子树点权值之和,开始时所有点权值为1. 分析: 对树进行dfs,将树变为序列,记录每个 ...