-
-
Save Sg4Dylan/53e536df637d32d0db17e3050d7d478c to your computer and use it in GitHub Desktop.
OOS16 OT Extension demo
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
import random | |
# 最大表示范围 2^k | |
k = 76 | |
# BCH 编码长度 | |
l = 512 | |
class BCH(): | |
def __init__(self, n, k, g): | |
self.n, self.k, self.g = n, k, g | |
def bch_encoder(self, data): | |
n, k, g = self.n, self.k, self.g | |
# 计算校验码 | |
bb = [0] * (n-k) | |
for i in range(k-1, -1, -1): | |
feedback = data[i] ^ bb[n-k-1]; | |
if feedback != 0: | |
for j in range(n-k-1, 0, -1): | |
if g[j] != 0: | |
bb[j] = bb[j-1] ^ feedback | |
else: | |
bb[j] = bb[j-1] | |
bb[0] = g[0] & feedback | |
else: | |
for j in range(n-k-1, 0, -1): | |
bb[j] = bb[j-1] | |
bb[0] = 0 | |
# 移位求和计算结果 | |
data += [0] * (n-k) | |
bb = [0] * k + bb | |
return [i+j for i,j in zip(data, bb)] | |
def __getitem__(self, idx): | |
data = [int(i) for i in list(f'{idx:0{self.k}b}')] | |
num = [str(i) for i in self.bch_encoder(data)] | |
return int('0b'+''.join(num), 2) | |
# BCH-511 [511, 76, >=171] 的生成多项式系数 | |
# 使用 MATLAB 计算得到 https://ww2.mathworks.cn/help/comm/ref/bchgenpoly.html | |
# 可交互输入 strrep(num2str(genpoly.x),' ','') 取得二进制字符串,再转换为 HEX 码 | |
gx = 'ad98bf9547f24b8a971bba5f0c3b524c0f6f91dbe79d89b207' + \ | |
'848ffad3b37791732ac9184a83a6e7cf2e2c8aaaae28d8c59a7e1153e45' | |
e = BCH(511, 76, [int(i) for i in list(f"{int(gx, 16):b}")]) | |
def print_bin(bin_list): | |
r = [f'0b{i:0{k}b}' for i in bin_list] | |
print(r) | |
def nise_ot(t0, t1, s): | |
# 模拟 len(s) 个 1-2 OT | |
# 按位进行选择,si=0 选择 t0i,si=1 选择 t1i | |
r = '' | |
for i, si in enumerate(s[::-1]): | |
if si == '0': | |
r += t0[-i-1] | |
else: | |
r += t1[-i-1] | |
return int('0b' + r[::-1], 2) | |
# R 初始化的选择字符串 r | |
r = random.randrange(0, 2**k) | |
# 随机比特矩阵 T0 的一行 | |
t0 = random.randrange(0, 2**l) | |
# 异或得到矩阵 T1 的一行 | |
t1 = t0^e[r] | |
print(f"{r=}, t0=0b{t0:0{l}b}, t1=0b{t1:0{l}b}") | |
# S 随机初始化字符串 s | |
s = random.randrange(0, 2**l) | |
# 模拟 OT 得到 Q 矩阵的一行 | |
qi = nise_ot(f'{t0:0{l}b}', f'{t1:0{l}b}', f'{s:0{l}b}') | |
print(f"s=0b{s:0{l}b}, qi=0b{qi:0{l}b}") | |
# 对于 Alice,所有对称密钥组合为 | |
p = qi^e[r]&s | |
# 验证与 Bob 的相同 | |
print(f"Check: {p==t0}") | |
# 接下来 Bob 通知 Alice 若干个序号,其中包含 r | |
# Alice 使用这些序号对应的密钥加密内容并传递给 Bob | |
# 为去除线性相关性,在使用这些密钥时,需要使用单向函数进行处理 | |
# 例如:Enc(PlainText) = PlainText ^ H(j, pj) |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment