假设有两个人 alice 和 bob,在不安全的网络情况下,他们俩沟通的每一句话都会被第三方 joe 知道,如何协商出一个只有他们两个人知道的秘钥? 所有的信息都会被第三方知道的情况下,通过两个人独自保密的信息,计算得到一个相同的值.需要的计算量必须非常大,使第三方即使知道沟通的内容,也很难计算得出结果.
Diffie-Hellman 密钥交换协议的有效性依赖计算离散对数的难度.
y=g^x mod p,在已知g,x,p的情况下,计算 y 是非常快的,但是已知 y,g,p 的情况下计算 x 的值是非常困难的.p 取很大的素数.模运算中为何要用素数作为模 秘钥交换过程:
alice 和 bob 先协商 g,p 的值
alice 私密的值 a , A=g^a mod p ,将 A 发送给 bob
bob 私密的值 b, B=g^b mod p,将 B 发送给 alice
alice 计算 B^a mod p = (g^b)^a mod p = g^ab mod p = S
bob 计算 A^b mod p = (g^a)^b mod p = g^ab mof p = S
现在 alice 和 bob 有了共同的秘钥 S,由于计算量很大,即使 joe 知道 g,p,A,B,也很难计算出 ab 的值
A send on a channel happens before the corresponding receive from that channel completes. 在一个channel中,发送 happens-before 相应的接收完成之前. The closing of a channel happens before a receive that returns a zero value because the channel is closed. 关闭一个 channel happens-before 接收返回的 0 值之前.为 0 值是因为 channel 被关闭.
1 2 3 4 5 6 7 8 9 10 11 12 13
package main var c = make(chanint,10) var a = "" funcf(){ a = "hello world" c <- 1// 先发生,可以替换成 close(c) } funcmain(){ go f() <- c print(a) }
A receive from an unbuffered channel happens before the send on that channel completes. 无缓冲 channel 的接收 happens-before 在发送完成之前.
1 2 3 4 5 6 7 8 9 10 11 12 13
package main var c = make(chanint,0) var a = "" funcf(){ a = "hello world" c <- 1// 先发生,可以替换成 close(c) } funcmain(){ go f() <- c print(a) }
The kth receive on a channel with capacity C happens before the k+Cth send from that channel completes. 容量为 C 的 channel 第 k 次接收 happens-before k+C 次发送完成之前.无缓存通道就是C 为 0 时的特殊情况.