对称同态加密系统

它本质上支持许多同态加法和有限数量的同态乘法。

它包括以下三种算法:密钥生成、加密和解密。

密钥生成:这种密钥生成算法KeyGen()是一种概率多项式时间(PPT)算法。以安全参数λ为输入,KeyGen()输出两个大质数u和v,满足u>>v,并选择一个随机数s←Z∗u。对称同态加密系统的秘密密钥为SK = (s, v)。

加密:这种加密算法Enc()是一种PPT算法。以秘密密钥SK = (s, v)、明文m∈Zv、随机正整数r(|r| + |v| <|u|)和参数d(d是一个小正整数)作为输入,Enc()输出一个密文c = sd(rv + m) mod u。

解密:解密算法Dec()是一种确定性多项式时间算法。以秘密密钥SK = (s, v)、密文c∈Zu和密文度d作为输入,Dec()输出明文m = (c * s-d mod u)mod v,其中s-d是sd在Zu中的乘法逆元。

# -*- coding:utf-8 -*-
"""@project: pythonPycharm@Author:chenyu@file: 对称同态加密系统.py@date:2023/5/18 21:46@blogs: https://blog.csdn.net/chengyulinhhhh?type=blog
""""""getPrime()是一个生成指定位数的质数的函数,
random.randint()用于生成随机数,
pow()是Python自带的求幂函数,
inverse()是求乘法逆元的函数。"""
import random
from Crypto.Util.number import getPrime, inversedef KeyGen(lamb):u = getPrime(lamb)#先做除法再向下取整v = getPrime(lamb // 2)s = random.randint(1, u-1)return u, v, sdef Enc(SK, m, r, d):s, v = SKc = pow(s * (r * v + m), 1, u)return cdef Dec(SK, c, d):s, v = SKm = pow(c * inverse(s, u), 1, u) % v#m = pow(c * pow(s, -1, u), 1, u) % v  和上一行代码效果相同return m"""生成一个1024位的u和一个512位的v,然后随机生成一个s作为秘密密钥SK。接着,将明文m加密成密文c,"""
# 密钥生成
u, v, s = KeyGen(1024)
SK = (s, v)# 加密
m = 123456789
r = random.randint(1, u // v)
d = 2
c = Enc(SK, m, r, d)# 解密
m_dec = Dec(SK, c, d)print("原始明文:", m)
print("加密后的密文:", c)
print("解密后的明文:", m_dec)


原始明文: 123456789
加密后的密文: 81097790704237362333720542254189850412794167294466619929459721105680734498861739241794882757445122789689575690281494064764215082683399792402582927526676885391486123226027208734639792896827701010110045852326448823793438126421801133230679985951729994914085327142347439453554318371077000634839199188016659245020
解密后的明文: 123456789

为什么m加密后能被还原,请解释其原理:

def Enc(SK, m, r, d):
    s, v = SK
    c = pow(s * (r * v + m), 1, u)
    return c

def Dec(SK, c, d):
    s, v = SK
    m = pow(c * inverse(s, u), 1, u) % v
    return m

在加密过程中,首先生成一个随机数r,并将明文m和r进行组合得到(r * v + m)。

然后使用私钥s对(r * v + m)进行加密,得到密文c。在解密过程中,首先使用私钥s计算出s的逆元inverse(s, u),然后使用逆元对密文c进行解密,得到(r * v + m)。最后从(r * v + m)中提取出明文m。

inverse(s, u) 是指 s 在模 u 意义下的逆元。
也就是说,对于整数 s 和 u,如果存在一个整数 t,使得 (s * t) mod u = 1,那么 t 就是 s 在模 u 意义下的逆元。


在解密函数中,需要使用 s 的逆元来计算明文 m,因此需要先计算出 s 在模 u 意义下的逆元。在 Python 中,可以使用 pow(s, -1, u) 或 inverse(s, u) 来计算 s 在模 u 意义下的逆元。

pow(s, -1, u)是什么意思

作用是计算 (s ** -1) % u,其中 ** 表示乘方运算,% 表示模运算。因为在解密函数中需要使用 s 的逆元,所以可以使用 pow(s, -1, u) 或 inverse(s, u) 来计算 s 在模 u 意义下的逆元。如果 s 在模 u 意义下没有逆元,那么 pow(s, -1, u) 会抛出 ValueError 异常

 


本文来自互联网用户投稿,文章观点仅代表作者本人,不代表本站立场,不承担相关法律责任。如若转载,请注明出处。 如若内容造成侵权/违法违规/事实不符,请点击【内容举报】进行投诉反馈!

相关文章

立即
投稿

微信公众账号

微信扫一扫加关注

返回
顶部