Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/security/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Security 对大型加密数据应用同态操作_Security_Encryption_Seal - Fatal编程技术网

Security 对大型加密数据应用同态操作

Security 对大型加密数据应用同态操作,security,encryption,seal,Security,Encryption,Seal,目前正在试验使用的同态加密 我想对大型加密输入应用简单的he操作,比如加法和乘法。例如,inputA[3200]和inputB[4096]两个int值的向量/数组都被加密。对于这两个输入Enc(A)和Enc(B)我想应用一个乘法: EvalMult(Enc(A[0]), Enc(B[42])) *0 and 42 denoting the indexes of the corresponding inputs ** no SIMD needed 就我而言,上述要求的实施可以通过两种不同的方

目前正在试验使用的同态加密

我想对大型加密输入应用简单的he操作,比如加法和乘法。例如,input
A[3200]
和input
B[4096]
两个int值的向量/数组都被加密。对于这两个输入
Enc(A)
Enc(B)
我想应用一个乘法:

EvalMult(Enc(A[0]), Enc(B[42])) 

*0 and 42 denoting the indexes of the corresponding inputs
** no SIMD needed
就我而言,上述要求的实施可以通过两种不同的方式解决:

  • 将输入打包为一个密文(类似SIMD),对于he操作,我可以使用
    EvalIndexAt()
    从加密输入中获取正确的值

  • 分别加密A和B中的每个值

  • 我不太确定所描述的解决方案中哪一个在效率方面是最好的。第一种方法的主要优点是整个输入只需要一个加密过程,但缺点是我总是必须使用
    EvalAtIndex()
    方法访问正确的元素,并且输入越大,计算
    EvalAtIndexKeyGen()
    越慢。(至少在我的机器上)

    第二种方法似乎更合适,因为不需要
    EvalAtIndex()
    ,但它需要单独加密每个值,这需要相当长的时间


    有什么想法和建议吗?

    谢谢你的提问

    方法#1(SIMD)的主要优点是,您可以使用单个同态加法或乘法(非常有效)执行向量(4096个或更多整数/实数)的加法和乘法。旋转(在PALISADE中称为
    EvalAtIndex
    )是一种额外的操作,允许访问单个索引或进行有效的求和(如内积)、矩阵乘法等。这种方法的密文扩展因子比方法2小得多(4096倍或更多)。通常情况下,选项1在实践中是首选的(我想不出任何我想要使用选项2的实际用例)

    为了最小化乘法的开销,也许可以将向量打包成连续的块,这样一个块就需要一次旋转。比如说,

    EvalMult(Enc(A[0:5]),Enc(B[42:47))
    
    您可以使用的另一种技术是
    EvalFastRotation
    (仅适用于PALISADE v1.10.x中的CKK和BGVRN)。如果您需要对同一密文进行多次旋转,您可以为该密文预计算一些内容,然后使用更便宜的旋转(BV密钥切换可以获得最大的好处)-参见示例

    如果需要多次旋转(仅计算所需旋转次数的平方根),也有一些方法可以最小化要生成的关键点数量,例如,使用中描述的婴儿步大步技术(这些技术可以在基于PALISADE的应用程序中实现)

    如果执行乘法的模式已知,也可以使用特殊的向量打包顺序(这样,旋转将使用单个旋转操作在向量上准备几个块)。当#明文插槽(批量大小)等于环尺寸时,CKK和BGVRN中的旋转都是周期性的(环绕)。如果您的向量小于此值,则始终可以根据需要多次克隆/复制小向量,以填充
    环维度
    /2

    总之,如果您用SIMD类向量来思考您的问题,可以实现最大的效率改进。然后,您可以重新制定您的问题/模型,以充分利用他提供的工具集。在某种程度上,这类似于使用矢量化指令(如AVX)或面向矩阵的编程(如在MATLAB中)