对称同态加密系统

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

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

密钥生成:这种密钥生成算法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, inverse

def KeyGen(lamb):
    u = getPrime(lamb)
    #先做除法再向下取整
    v = getPrime(lamb // 2)
    s = random.randint(1, u-1)
    return u, v, s

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
    #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 异常

参考文献:Lightweight Multidimensional Encrypted Data Aggregation Scheme With Fault Tolerance for Fog-Assisted Smart Grids

  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 8
    评论
评论 8
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值