安全多方计算之SPDZ开源库:基于AES电路实现OPRF

目录

 

1. OPRF:不经意伪随机函数

2.基于SPDZ的实现

3.可能出现的问题 


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

  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 7
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 7
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值