安全多方计算之SPDZ开源库语法详解——Sint

2023-11-09 06:30

本文主要是介绍安全多方计算之SPDZ开源库语法详解——Sint,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

安全类型:sint (Secret integer in the protocol-specific domain.)

Most non-linear operations require compile-time parameters for bit length and statistical security. They default to the global parameters set by program.set_bit_length() and program.set_security(). The acceptable minimum for statistical security is considered to be 40. The defaults for the parameters is output at the beginning of the compilation.

If the computation domain is modulo a power of two, the operands will be truncated to the bit length, and the security parameter does not matter. Modulo prime, the behaviour is undefined and potentially insecure if the operands are longer than the bit length.

sint是SPDZ定义的安全类型,属于隐私数据,只用通过特定的方法才能公开。

目录

1. __init__()

2. get_input_from()、get_raw_input_from()

3. reveal_to()

4. get_random_int()

5. get_random()

6. 比较运算

7. 取相反数、取绝对值

8. pow2()、__rpow__()

9. 移位操作

10.long_one()

11.int_div()

12. mod2m()

13. __mod__()

14. bit_decompose()

15. if_else(a,b)

1. __init__()

__init__(val=Nonesize=None)

Parameters:
  • val – initialization (sint/cint/regint/int/cgf2n or list thereof)
  • size – vector size (int), defaults to 1 or size of list
a = sint()
sint.__init__(a)
a.__init__(10)
print_str("a: %s\n", a.reveal())

2. get_input_from()、get_raw_input_from()

get_input_from(cls, player)、get_raw_input_from(cls, player)

从player中接受数据。两个函数类似。用法这里不写了,可以看下一个函数。

3. reveal_to()

reveal_to(self, player)

将sint数泄露给player。我觉得reveal这个词用的很准确,sint就是定义的秘密数,从安全方面考虑,不应该泄露给别人,这个函数是将一个秘密数reveal to 一个 player。reveal这个词可以提醒开发人员慎用。

在下面这个程序里,我定义了一个sint类型变量a,a从player0中接受数据。加一之后把它reveal给了player1。结果可以在Player-Data/Private-Output-1里查看

a = sint()
print_ln("a = %s",a.reveal())
a = sint.get_input_from(0)
a = a + 1
print_ln("a = %s",a.reveal())
a.reveal_to(1)

程序编译:

./compile.py test_sint

生成证书: 

Scripts/setup-ssl.sh 2

输入数据:

echo 1 > Player-Data/Input-P0-0

执行程序,开两个不同终端:

./semi-party.x -N 2 -p 0 test_sint
./semi-party.x -N 2 -p 1 test_sint

程序执行完毕,我们可以查看Player-Data/Private-Output-1是否有写入数据:

确实是写入了数据,但是这个数据乱码,不知道什么原因,猜测是加密过的。它生成了好几个数据文件,可以查看下,其他的数据都是空的,因为程序并没有对他们写入数据。

4. get_random_int()

get_random_int(cls, bits)  生成一个“bits”长度比特的随机数。下面例子是生成3比特长的随机数(0~7之间的随机数)

for i in range(5):a = sint.get_random_int(3)print_ln("a = %s",a.reveal())

5. get_random()

get_random(cls)

Secret random ring element according to security model. 生成一个环上的随机数。

for i in range(3):b = sint.get_random()print_ln("b = %s",b.reveal())

编译:

./compile.py test_sint

执行:  执行时可以使用-R指定环的大小(这里是2^128)。

Scripts/ring.sh -R 128 test_sint

6. 比较运算

小于:less_than = __lt__()

大于:greater_than = __gt__()

小于等于: less_equal = __le__()

大于等于: greater_equal = __ge__()

等于: equal = __eq__()

不等于: not_equal = __ne__()

a = sint(12)
b = sint(13)
print_ln("a: %s",a.reveal())
print_ln("b: %s",b.reveal())
print_ln("less_than: %s", sint.__lt__(a,b).reveal())
print_ln("greater_than: %s", sint.__gt__(a,b).reveal())
print_ln("less_equal: %s", sint.__le__(a,b).reveal())
print_ln("greater_equal: %s", sint.__ge__(a,b).reveal())
print_ln("equal: %s", sint.__eq__(a,b).reveal())
print_ln("not_equal: %s", sint.__ne__(a,b).reveal()) 

 编译的时候要指定环数。程序运行结果:

7. 取相反数、取绝对值

__neg__(self)  取相反数a = 0 - a

__abs__(self) 取绝对值a = |a|

a = sint(12)
b = sint(20)
e = a - b
c1 = sint.__neg__(b-a)
c2 = sint.__neg__(a-b)
d = sint.__abs__(e)
print_ln("a: %s",a.reveal())
print_ln("b: %s",b.reveal())
print_ln("c1: %s",c1.reveal())
print_ln("c2: %s",c2.reveal())
print_ln("b: %s",d.reveal())

编译的时候要加-R指定环数。它不能表示负数,所以在你打印一个负数时,他会打印0,原因未知。 

8. pow2()、__rpow__()

pow2(self, bit_length=None, security=None)   官方描述是:Secret power of two.

输出2的n次幂。一个很奇怪的函数。

平常的幂函数一般输入一个n然后计算2的n次幂。但是这个函数不是这样的。这个函数的输入是比特长度。

假设你的输入的比特长度值是 i 。再设 i 的取值在2^{j-1}+1<i<2^j, 那么这个函数随机返回序列[2^0,2^1,2^2,...,2^{2^j-1}]中的一个值。

下面程序里我执行了100次这个函数,他返回的值都是(0,2^15)之间的2次幂。(i=13时,是在2^3+1到2^4之间的,那么它的返回值都是(0, 2^{2^{4}-1})之间的2次幂。

n = 100
a = sint(0)
for i in range(n):b = a.pow2(13)print_ln("b = %s",b.reveal())

下面是部分执行结果:最大值时32768=2^15

__rpow__(self, base)

我就没见你这么糊弄的。下面是官方源代码:

    def __rpow__(self, base):""" Secret power computation. Base must be two.Uses global parameters for bit length and security. """if base == 2:return self.pow2()else:return NotImplemented

基数等于2调用pow2

基数不等于2,NotImplemented ???

9. 移位操作

__lshift__(self, other, bit_length=None, security=None) 左移

__rshift__(self, other, bit_length=None, security=None, signed=True) 右移

__rlshift__(self, other)  =  other * 2**self

__rrshift__(self, other):rlshift的逆操作

a = sint(39)
print_ln("a: %s",a.reveal())
b = a.__lshift__(2)
print_ln("b: %s",b.reveal())
c = b.__rshift__(2)
print_ln("c: %s",c.reveal())b = a.__rlshift__(2)
print_ln("b: %s",b.reveal())
c = b.__rrshift__(2).__abs__()
print_ln("c: %s",c.reveal())

10.long_one()

返回1.

不知道这个函数有什么意义。

c = sint.long_one()
print_ln("c: %s",c)

11.int_div()

int_div(self, other, bit_length=None, security=None)

除法运算,这里的除法运算是在域上的除法,我们知道在群环域中,只有域可以进行除法运算。这个函数卡了很久,只要是卡在编译和执行方法上,编译虽然通过,但执行总是出错。

这个实例计算6/3,也就是计算6*(3^{-1})计算有限域的逆大概是个耗时运算吧,运行起来特别慢。

a = sint(6)
b = sint(3)
print_ln("a: %s",a.reveal())
print_ln("b: %s",b.reveal())
c = a.int_div(b,32)
print_ln("c: %s",c.reveal())

因为是域上的运算,编译的时候可以加-F执行域的大小,也可以不加(默认为64比特):

./compile.py -F 32 test_sint

我使用了两种方法执行,一个是基于OT协议的semi-party.x;一个是基于半同态加密的hemi-party.x,大家可以感受下执行时间的差距。

               

这个函数返回值也是sint类型。下面是a、b取随机数的例子

12. mod2m()

mod2m(self, m, bit_length=None, security=None, signed=True)

模运算,模2^m

a = sint(456463)
print_ln("a = %s", a.reveal())
b = a.mod2m(1)
print_ln("b = %s mod (2^1)", b.reveal())
b = a.mod2m(2)
print_ln("b = %s mod (2^2)", b.reveal())
b = a.mod2m(3)
print_ln("b = %s mod (2^3)", b.reveal())
b = a.mod2m(4)
print_ln("b = %s mod (2^4)", b.reveal())
b = a.mod2m(5)
print_ln("b = %s mod (2^5)", b.reveal())
b = a.mod2m(6)
print_ln("b = %s mod (2^6)", b.reveal())

13. __mod__()

__mod__(self, modulus)

模运算,模数为传入的参数modulus

emmm……理论上可以模任意的modulus,但是开发者只实现了模2,其他的模数没有 实现。也就是说只有模2时才能编译通过,其他情况编译不通过。

模2时:

a = sint(456463)
print_ln("a = %s", a.reveal())
b = a.__mod__(2)
print_ln("b = %s mod (2)", b.reveal())

模其他数时报错:

14. bit_decompose()

bit_decompose(self, bit_length=None, security=None)

将整数分解为二进制

a = sint(456463)
print_ln("a = %s", a.reveal())
print_str("b = ")
b = a.bit_decompose()
for i in b:print_str("%s",i.reveal())
print_ln()a = sint(46)
print_ln("a = %s", a.reveal())
print_str("b = ")
b = a.bit_decompose()
for i in b:print_str("%s",i.reveal())
print_ln()

注意,它的分解结果应该从倒数第一个“1”开始倒着看。

15. if_else(a,b)

s = sint(1)
a = sint(12)
b = sint(13)
print_ln("%s",s.if_else(a,b).reveal())

根据定义的sint类型变量,如果该变量的值是0,则if_else()返回b;该变量的值是1,则if_else()返回a。

运行结果:

关于sint类型暂时就更到这里,没有更全,主要函数我都介绍了,还有一些有点复杂搞不明白,还有一些作者都没有实现,都比较小众,不打算更了。

这篇关于安全多方计算之SPDZ开源库语法详解——Sint的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/374466

相关文章

详解MySQL中DISTINCT去重的核心注意事项

《详解MySQL中DISTINCT去重的核心注意事项》为了实现查询不重复的数据,MySQL提供了DISTINCT关键字,它的主要作用就是对数据表中一个或多个字段重复的数据进行过滤,只返回其中的一条数据... 目录DISTINCT 六大注意事项1. 作用范围:所有 SELECT 字段2. NULL 值的特殊处

SQL BETWEEN 语句的基本用法详解

《SQLBETWEEN语句的基本用法详解》SQLBETWEEN语句是一个用于在SQL查询中指定查询条件的重要工具,它允许用户指定一个范围,用于筛选符合特定条件的记录,本文将详细介绍BETWEEN语... 目录概述BETWEEN 语句的基本用法BETWEEN 语句的示例示例 1:查询年龄在 20 到 30 岁

CSS place-items: center解析与用法详解

《CSSplace-items:center解析与用法详解》place-items:center;是一个强大的CSS简写属性,用于同时控制网格(Grid)和弹性盒(Flexbox)... place-items: center; 是一个强大的 css 简写属性,用于同时控制 网格(Grid) 和 弹性盒(F

spring中的ImportSelector接口示例详解

《spring中的ImportSelector接口示例详解》Spring的ImportSelector接口用于动态选择配置类,实现条件化和模块化配置,关键方法selectImports根据注解信息返回... 目录一、核心作用二、关键方法三、扩展功能四、使用示例五、工作原理六、应用场景七、自定义实现Impor

一文深入详解Python的secrets模块

《一文深入详解Python的secrets模块》在构建涉及用户身份认证、权限管理、加密通信等系统时,开发者最不能忽视的一个问题就是“安全性”,Python在3.6版本中引入了专门面向安全用途的secr... 目录引言一、背景与动机:为什么需要 secrets 模块?二、secrets 模块的核心功能1. 基

一文详解MySQL如何设置自动备份任务

《一文详解MySQL如何设置自动备份任务》设置自动备份任务可以确保你的数据库定期备份,防止数据丢失,下面我们就来详细介绍一下如何使用Bash脚本和Cron任务在Linux系统上设置MySQL数据库的自... 目录1. 编写备份脚本1.1 创建并编辑备份脚本1.2 给予脚本执行权限2. 设置 Cron 任务2

一文详解如何在idea中快速搭建一个Spring Boot项目

《一文详解如何在idea中快速搭建一个SpringBoot项目》IntelliJIDEA作为Java开发者的‌首选IDE‌,深度集成SpringBoot支持,可一键生成项目骨架、智能配置依赖,这篇文... 目录前言1、创建项目名称2、勾选需要的依赖3、在setting中检查maven4、编写数据源5、开启热

Python常用命令提示符使用方法详解

《Python常用命令提示符使用方法详解》在学习python的过程中,我们需要用到命令提示符(CMD)进行环境的配置,:本文主要介绍Python常用命令提示符使用方法的相关资料,文中通过代码介绍的... 目录一、python环境基础命令【Windows】1、检查Python是否安装2、 查看Python的安

HTML5 搜索框Search Box详解

《HTML5搜索框SearchBox详解》HTML5的搜索框是一个强大的工具,能够有效提升用户体验,通过结合自动补全功能和适当的样式,可以创建出既美观又实用的搜索界面,这篇文章给大家介绍HTML5... html5 搜索框(Search Box)详解搜索框是一个用于输入查询内容的控件,通常用于网站或应用程

Python并行处理实战之如何使用ProcessPoolExecutor加速计算

《Python并行处理实战之如何使用ProcessPoolExecutor加速计算》Python提供了多种并行处理的方式,其中concurrent.futures模块的ProcessPoolExecu... 目录简介完整代码示例代码解释1. 导入必要的模块2. 定义处理函数3. 主函数4. 生成数字列表5.