事件:
- A有n个秘密 {s_1,s_2,…,s_n},B想要获得秘密s_i,A有公钥pk和私钥sk
要求:
- B获得秘密s_i,除此之外没有获得其他秘密;
- A不知道B选择的索引值 i。
思考:
- A在怎样才能在不知道确切索引值的情况下将秘密发送给B
- B不能得到其他信息,仅仅得到s_i
- B如何区分s_i和其他消息
分析:
首先,发送方A在不知道确切索引值的情况下肯定无法确定地发送单一秘密给接收方B,这是“要求2”要求的,所以,我们思考,是否可以让A把所有的秘密发送给B,但这又违背了“要求1”。
那我们可以怎样操作完成这一事件呢?
根据之前所学习的密码学知识:
加密:c = Ek(m),加密方一定是知道明文m
解密:m = Dk(c),解密方最后一定能得到明文m
综上,如果随机选择一个对称密钥k_i,那么拥有此密钥的人就可以使用此密钥加密或解密秘密s_i。
在本事件中,接收方B是最终得到秘密s_i的人,所以B一定执行解密操作,但是B不知道s_i,所以执行加密操作的应该是发送方A。
分析到这里,我们发现,加解密执行方是两方,那么k_i是否是两方共享的?如果不是又应该谁来生成随机密钥k_i呢?
如果k_i两方共享,那么A会解密得到秘密s_i,进而知道索引号i,这不符合“要求2”,所以应该是B来生成随机密钥。
接收方B生成随机密钥k_i后怎么传递给A(A仅执行解密操作而不知道具体的密钥)呢?
这是我们想到,可以添加冗余项使真正的密钥隐藏在其中。B将含有冗余项的信息发送给A就完成了密钥的传递。在这个过程中,由于A未知序列号i,所以A也不知道密钥k_i。
之后,A依次对应执行加密,将加密后的信息发送给B。
B使用密钥k_i一次对应解密(只有序列号为i的位置可以得到正确解密结果),找到序列号为i的位置的结果就是秘密s_i。
又由于在传递过程中,为了保证消息的安全性,我们需要用A的公钥加密消息。(消息不能以明文方式传递)
过程:
- 接收方B:1.采用A的公钥pk对消息m进行加密,表示为E(m);2.随机生成一个密钥k_i,用A的公钥进行加密,表示为E(k_i);3.生成与E(m)等长的随机数{ R_1, R_2, ..., R_i-1, R_i+1, ..., R_n} ; 4.发送{ R_1, R_2, ..., R_i-1, E(k_i), R_i+1, ..., R_n}给A
- 发送方A:1. 使用私钥sk一一对应依次解密接收到的数据得到{r_1, r_2, ..., r_i-1, k_i, r_i+1, ..., r_n}; 2. 用解密得到的数据一一对应依次加密秘密{s_1, s_2,…,s_i-1, s_i, s_i+1, ..., s_n}得到{
,
, ...,
, ...,
}; 3. 将加密数据发送给B
- 接收方B:使用密钥k_i 依次解密接收到的消息,在序列号i的位置及为秘密s_i