Skip to content

Instantly share code, notes, and snippets.

@Sg4Dylan
Created June 29, 2024 10:08
Show Gist options
  • Save Sg4Dylan/53e536df637d32d0db17e3050d7d478c to your computer and use it in GitHub Desktop.
Save Sg4Dylan/53e536df637d32d0db17e3050d7d478c to your computer and use it in GitHub Desktop.
OOS16 OT Extension demo
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