目录
1. OPRF:不经意伪随机函数
Alice有一些输入,Bob有一个key。不经意PRF允许Alice将自己的输入与Bob的key结合经过一系列运算转变成相对应的数。在这个过程中,Alice不能知道Bob的key,Bob也不知道最后的结果F(key,x)。每一个输入xi都可以计算出一个不同于其他输入的数,这些数就可以被看作伪随机数。
将AES算法转变成电路(Circuit)形式,通过混淆电路的两方安全计算就可以看作OPRF的实现。
2.基于SPDZ的实现
from circuit import Circuit
sb128 = sbits.get_type(128)
key = sb128.get_input_from(0)
plaintext = sb128.get_input_from(1)
print_ln("key = %s", key.reveal())
print_ln("plaintext = %s", plaintext.reveal())
n = 1
aes128 = Circuit('aes_128')
ciphertexts = aes128(sbitvec([key] * n), sbitvec([plaintext] * n))
ciphertexts.elements()[n - 1].reveal().print_reg()
key相当于Bob的key,plaintext相当于Alice的输入。该程序从数据文件内读取数据,然后进行AES的MPC计算。
生成数据脚本,该脚本会生成127比特(可以改,生成任意比特的)的随机数(十六进制表示),也就是key和plaintext。并将这些数据写入对应的数据文件。
import random
import os,sys
base = [str(x) for x in range(10)] + [ chr(x) for x in range(ord('A'),ord('A')+6)]
# hex2dec
def hex2dec(string_num):
return str(int(string_num.upper(), 16))
# dec2hex
def dec2hex(string_num):
num = int(string_num)
mid = []
while True:
if num == 0: break
num,rem = divmod(num, 16)
mid.append(base[rem])
return '0x'+''.join([str(x) for x in mid[::-1]])
def gen_random_hex(n_bit):
b = ['0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'a', 'b', 'c', 'd', 'e', 'f']
s = "0x"
n = n_bit/4
for i in range(n):
t = random.randint(0,15)
s = s + b[t]
return s
bit = 127
a = gen_random_hex(bit)
ha = hex2dec(a)
b = gen_random_hex(bit)
hb = hex2dec(b)
print("############ gen_data.py #############")
print("a = " + a)
print("Dec(a) = " + ha)
print("b = " + b)
print("Dec(b) = " + hb)
f1 = open("Player-Data/Input-P0-0", "w")
f2 = open("Player-Data/Input-P1-0", "w")
print("Write a to Player-Data/Input-P0-0...")
f1.write(str(a))
print("Write b to Player-Data/Input-P1-0...")
f2.write(str(b))
f1.close()
f2.close()
print("################ End #################")
aes_circuit程序运行脚本,包含编译、生成证书、输入数据、运行程序。
#! /bin/bash
./compile.py -B 128 aes_circuit
Scripts/setup-ssl.sh 2
python gen_data.py
echo "Player-Data/Input-P0-0:" $(cat Player-Data/Input-P0-0)
echo "Player-Data/Input-P1-0:" $(cat Player-Data/Input-P1-0)
echo "########### Execute aes_circuit... #############"
Scripts/yao.sh aes_circuit
3.可能出现的问题
1. 程序运行时,读取不了十六进制数。
解决方案:https://blog.csdn.net/shengsikandan/article/details/116995164
2. make命令无效
解决方案:https://blog.csdn.net/shengsikandan/article/details/116654618