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 学习笔记 --- 密钥交换的更多相关文章

  1. Cryptography I 学习笔记 --- 总结

    在b站上大概的看完了Dan Boneh的密码学,对现代密码学总算有了一个粗浅的认识. 总算能在纸上手写RSA公式并且证明之了,蛤蛤. 总体的感触就是,现代密码学是一个非常博大精深的体系,我等程序员最重 ...

  2. Cryptography I 学习笔记 --- 基于Diffie-Hellman的公钥加密

    1. Diffie-Hellman协议: 假定g是集合G的生成元,G有n个元素. Alice随机选取1-n中的一个数a,并公布ga为公钥 Bob随机选取1-n中的一个数b,并公布gb为公钥 那么gab ...

  3. Cryptography I 学习笔记 --- 基于陷门置换的公钥加密

    RSA算法的工作流程 1. 生成公钥私钥 生成两个素数p和q,计算n=p*q,计算φ(n)=n-p-q+1,然后生成e与d,使 e * d = 1 mod φ(n). 然后以(n, e)作为公钥,(n ...

  4. Cryptography I 学习笔记 --- 数论简介

    0. Zn代表{0,1....n-1}的集合 1. 模运算符合交换律结合律 2. gcd(greatest common divisor),可以由扩展欧几里得算法快速得到. 3. 模逆(modular ...

  5. Cryptography I 学习笔记 --- 零碎

    1. KDF(密钥推导函数,key derivation function),根据用户输入的一个初始密钥来生成一系列的后续密钥.可以使用PRF来生成 2. 可以用salt与slow hash func ...

  6. Cryptography I 学习笔记 --- 认证加密

    1. 认证加密,Alice与Bob共享一个密钥k,Alice可以发送密文E给Bob,Bob可以确定接收到的E一定是拥有密钥k的Alice产生的.而不是攻击者随便产生的. 2. 认证加密必须能抵挡住选择 ...

  7. Cryptography I 学习笔记 --- 抗碰撞

    1. 生日攻击,如果hash函数可以产生n bit的结果,那么生日攻击的时间复杂度在O(nn/2)这个量级.以比特币使用的SHA256为例,其hash结果为256bit,那么如果想完成一次生日攻击,那 ...

  8. Cryptography I 学习笔记 --- 信息完整性

    1. ECBC-MAC,需要一对密钥k与k1,然后将明文分组,用cbc模式对明文分块加密,将最后的密文块再用k1进行加密,即可得到结果 2. NMAC,需要一对密钥k与k1,然后将明文分组,用k加密第 ...

  9. Cryptography I 学习笔记 --- 使用分组密码

    1. 如果加密算法是确定性的(相同的明文产生相同的密文),那么它对于选择明文攻击是不安全的 2. 随机化加密,每次对相同的密文加密,会产生不同的结果 AES加密模式 ecb:明文分块计算,块与块之间没 ...

随机推荐

  1. optparser 模块 提取IP,端口,用户名,密码参数模板

    import optparse #class FtpClient(object): #自定义类可以自己修改 '''ftp客户端''' #def __init__(self): parser = opt ...

  2. mysql破解密码安装与基本管理

    一.MySQL介绍 MySQL是一个关系型数据库管理系统,由瑞典MySQL AB 公司开发,目前属于 Oracle 旗下公司.MySQL 最流行的关系型数据库管理系统,在 WEB 应用方面MySQL是 ...

  3. SparkStreaming和Kafka的整合

    当我们正确地部署好Spark Streaming,我们就可以使用Spark Streaming提供的零数据丢失机制.需要满足以下几个先决条件: 1.输入的数据来自可靠的数据源和可靠的接收器: 2.应用 ...

  4. 使用html进行浏览器判断,浏览器条件注释

    下面来点今天写东西的时候查资料,收集的关于使用html进行浏览器判断的一些资料: 条件注释的基本格式: <!--[if expression]>注释内容<![endif]--> ...

  5. Asp.net页面生命周期详解任我行(1)-小试牛刀,编写页面代码

    前言 很久很久以前,还是我在学校的时候,我就看了传智里面视频,学习了一下Asp.net页面生命周期,当时看的时候,因为内功不够深厚,看起来很吃力,现在回头温习了一下,还是有点收获的,于是想用博客记录一 ...

  6. Windows下Eclipse安装PyDev

    事后证明PyDev不好用,推荐使用pycharm!!!   1.安装eclipse,这个网上一大堆,就不说了 2.安装python,这个网上一大堆,就不说了 3.Eclipse安装PyDev 第一种在 ...

  7. HDU5862 Counting Intersections

    Given some segments which are paralleled to the coordinate axis. You need to count the number of the ...

  8. C#中的is和as的转型区别

    摘自CLR via C#第三版第四章 在c#中is可以用来判断一个对象是否兼容给定的类型,如果是返回true,否则返回false. 同时is是永不会抛出异常的.如果对象引用是null,is操作符总是返 ...

  9. Codeforces Round #363 (Div. 2) A 水

    Description There will be a launch of a new, powerful and unusual collider very soon, which located ...

  10. 【CCF】URL映射 模拟

    #include<iostream> #include<cstdio> #include<cstring> #include<string> #incl ...