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:明文分块计算,块与块之间没 ...
随机推荐
- optparser 模块 提取IP,端口,用户名,密码参数模板
import optparse #class FtpClient(object): #自定义类可以自己修改 '''ftp客户端''' #def __init__(self): parser = opt ...
- mysql破解密码安装与基本管理
一.MySQL介绍 MySQL是一个关系型数据库管理系统,由瑞典MySQL AB 公司开发,目前属于 Oracle 旗下公司.MySQL 最流行的关系型数据库管理系统,在 WEB 应用方面MySQL是 ...
- SparkStreaming和Kafka的整合
当我们正确地部署好Spark Streaming,我们就可以使用Spark Streaming提供的零数据丢失机制.需要满足以下几个先决条件: 1.输入的数据来自可靠的数据源和可靠的接收器: 2.应用 ...
- 使用html进行浏览器判断,浏览器条件注释
下面来点今天写东西的时候查资料,收集的关于使用html进行浏览器判断的一些资料: 条件注释的基本格式: <!--[if expression]>注释内容<![endif]--> ...
- Asp.net页面生命周期详解任我行(1)-小试牛刀,编写页面代码
前言 很久很久以前,还是我在学校的时候,我就看了传智里面视频,学习了一下Asp.net页面生命周期,当时看的时候,因为内功不够深厚,看起来很吃力,现在回头温习了一下,还是有点收获的,于是想用博客记录一 ...
- Windows下Eclipse安装PyDev
事后证明PyDev不好用,推荐使用pycharm!!! 1.安装eclipse,这个网上一大堆,就不说了 2.安装python,这个网上一大堆,就不说了 3.Eclipse安装PyDev 第一种在 ...
- HDU5862 Counting Intersections
Given some segments which are paralleled to the coordinate axis. You need to count the number of the ...
- C#中的is和as的转型区别
摘自CLR via C#第三版第四章 在c#中is可以用来判断一个对象是否兼容给定的类型,如果是返回true,否则返回false. 同时is是永不会抛出异常的.如果对象引用是null,is操作符总是返 ...
- Codeforces Round #363 (Div. 2) A 水
Description There will be a launch of a new, powerful and unusual collider very soon, which located ...
- 【CCF】URL映射 模拟
#include<iostream> #include<cstdio> #include<cstring> #include<string> #incl ...