草庐IT

同态加密篇

m0_73803866 2023-04-21 原文

同态加密

同态加密(Homomorphic Encryption,HE)概念最早由 Rivest 等人在 1978 年出 [26]。它是一种 特殊加密算法,其形式化可表述为:假设 AB 是两个待加密的明文, Enc(g)是其加密函数,那么它 存在以下关系(被称为数学同态):

Enc(A)oEnc(B) =Enc(A B)

通俗地讲,密文域进行 o操作相当于在明文域进行 ∗操作( o和 ∗是两种特定的数学运算)这种性 质使得密文域进行数据处理、分析与检索等操作成为可能,同时云计算该技术具有重要的应用价值。下

面以简单例子进行阐述:如图 4-9 表示,假设在不可信的云环境中,员工 C1 上传两个密文数 Enc(A) 和 Enc(B),到不可信的云平台中,员工 C2 交两个明文数据进行 ∗的任务,那么公有云平台翻译过 来的数据执行动作为:密文操作 Enc(A)oEnc(B)。由于数据从始至终一直处于加密状态,那么无论是 云服务厂商,还是攻击者他们都将无法访问或窃取明文数据,从而保障了云平台的数据安全。

图 5-3 同态加密在云平台的应用

根据同态加密能力,将同态加密分为加法同态、乘法同态和全同态加密(Full Homomorphic Encryption,FHE):

🅙 加法同态: 加密函数满足 Enc(A)+Enc(B+) Enc(A B),可执行密文的加减运算,例如

Paillier 方案加密满足加法同态。

🅙 乘法同态: 加密函数满足 Enc(A)∗Enc(B∗) Enc(A B),可执行密文的乘除运算,例如 RSA

方案满足乘法同态。

🅙 全同态加密: 如果一个加密函数同时满足加法同态和乘法同态,称为全同态加密。那么这个使

用这个加密函数可完成各种运算,包括加减乘除、多项式、指数、对数、三角函数等,例如经 典的 Gentry 方案满足全同态加密。

全同态加密方案具有重要的应用价值,2009 年 IBM的研究人员 Gentry 首次出了一个完整的全 同态加密方案 [28]。其主要思路为:首先构造一个类同态加密(Somewhat Homomorphic Encryption, SWHE)方案,它只能进行低次的多项式运算;然后,将 SWHE压缩解密电路,使得它能够同态计算它 本身的增强的解密电路,得到一个自举(Bootstrapping)的同态加密方案;最后,通过递归式嵌入, 转化为一个可以同态计算任意电路的方案,即全同态加密。理论上,Gentry 方案可进行无限深度的同态 操作,但付出的代价是计算的开销较高,且密钥规模、密文尺寸较大。随后,一些改进方案被出,例 如 BGV方案、基于误差学习(Learning with Errors, LWE)、理想陪集问题(Ideal Coset Problem, ICP)、 整 数 上 的 近 似 最 大 公 因 子 问 题(Approximate Greatest Common Devisior,AGCD) 等 方案。

同态加密技术可以使得数据处理权与数据所有权可以分离,数据所有方保证拥有的数据安全性,同 时可委托第三方(云服务商)进行计算。在工业界应用上,微软在 Github 开源的同态加密库 SEAL; IBM公司将同态加密(FHE)在 Linux系统的应用工具进行开源⸺FHE Toolkit Linux,为了降低同态 加密的门槛,以 Docker 容器形式化发布,其包含作为 docker 容器安装和运行预打包的工具包所需的所 有脚本,以及 IBM同态加密库 HElib、集成开发环境(IDE)和相应的工作区; RSAC 2019 年创新沙盒 亚军⸺Duality 公司 [28],推出 SecurePlus ™平台,将同态加密技术在大数据隐私保护、机器学习模型 的版权保护和数据合规领域进行应用,通过定制化的同态加密服务器和计算能力,在此基础上供的安 全产品可以使得数据在整个处理生命周期中,始终保持加密状态,用户无需解密即可计算和分析数据。 图 5-4 是 Duality 的 SecurePlus 平台在金融领域应用,其在遵守隐私和金融法规和不暴露敏感的个人或 商业信息前提下,实现交易查询、实体和账户和金融犯罪信息的调查。

然而,现有的同态加密技术与方案需要消耗大量的计算资源、存储资源(体现在高额的实现成本) 是目前实用化的主要挑战,目前只能应用和部署在安全要求较高的特定场景中,目前离广泛的应用仍然 有一段较长的距离。

安全多方计算

安全多方计算(Secure Multi-party Computation,MPC)实际上可以看作是多个节点参与的特殊计 算协议:在一个分布式的环境中,各参与方在互不信任的情况下进行协同计算,输出计算结果,并保证 任何一方均无法得到除应得的计算结果之外的其他任何信息,包括输入和计算过程的状态等信息。它解 决了不信任环境下多个参与方联合计算一个函数的问题 [29]。

安全多方计算可形式化描述为, n 个计算参与方分别持有数据 x ,x ,L ,xn ,协议的目的是利用各

1 2

方的秘密数据计算一个预先达成的共识函数 y , y ,L , y = f (x ,x ,L,x ),此时任意一方可以得到对

1 2 n 1 2 n

应的结果 yi,但无法获得其他任何信息。图 5-5 给出了安全多方计算与传统分布式计算两种模式进行比 较的示例。

(a) 传统分布式计算模型
(b)安全多方计算模型

图 5-5 安全多方计算与传统分布式计算的比较

具体来说,MPC 具有以下的特点:

🅙 隐私性: 参与方仅限于获得自己一方的输入和输出数据,除此之外,其他方的数据无法获得。 🅙 正确性: 可确保联合计算之后所有参与方都能获得正确的计算结果。

🅙 去中心化: 不同于传统的分布式计算,在安全多方计算中供了一种去中心化的计算模式,各

参与方的地位平等,不存在拥有特权的第三方的参与。

实现多方安全计算协议主要有基于混淆电路(Garbled Circuit,GC)、秘密分享(Secret Sharing, SS)和同态加密(Homomorphic Encryption,HE)三种方式。根据支持的计算任务 MPC 可分为专用 场景和通用场景两类:

🅙 **专用场景 MPC:**支持特定计算任务的 MPC,具体场景可以采用多种不同的密码学技术设计协

议。比如比较数值大小、隐私求交集(Private Set Intersection,PSI)计算协议等。

🅙 **通用场景 MPC:**理论上可支持任何计算任务,MPC 具有完备性。目前采用的方法主要是混淆电

路、不经意传输以及同态加密。

对于两方计算,目前有多种方案,发展较为成熟:2004 年发布的 Fairplay 系统是第一个实现的系统; PSI 两方的隐私求交协议目前发展较为成熟,在一些企业场景实现落地,例如 Google 使用 PSI 技术对 Chrome 用户的其他网络账户密码进行泄露密码库的检测,同时保证无法获取原始密码信息。区块链是 近年来工业界的热点技术,在金融、保险和交易等领域均有广泛应用。然而,在区块链的数据处理与计 算过程中,比如以太坊的智能合约,其所有的数据都是公开透明的,因此会产生隐私和数据泄露问题。

为了解决这一问题,结合安全多方计算成为区块链公司新的解决思路。例如,iCube 是首个引入 MPC 机制的区块链金融项目,解决金融领域借贷在得到正确的用户信用评分的同时,保护用户的隐私数据不 可见。

对于多方计算,在某些特定场景下也具有较好性能,然而通用的场景仍然存在诸多是挑战,例如扩 展性问题、效率问题以及诚实性问题(输入方可能输入虚假数据或篡改状态数据),这些问题亟需未来 进一步研究与解决。

参考资料

绿盟 2020 数据安全前沿技术研究报告

有关同态加密篇的更多相关文章

  1. ruby - 使用 AES 的 Rails 加密,过于复杂 - 2

    我在加密来self正在使用的第三方供应商的值时遇到问题。他们的指令如下:1)Converttheencryptionpasswordtoabytearray.2)Convertthevaluetobeencryptedtoabytearray.3)Theentirelengthofthearrayisinsertedasthefirstfourbytesontothefrontofthefirstblockoftheresultantbytearraybeforeencryption.4)EncryptthevalueusingAESwith:1.256-bitkeysize,2.25

  2. ruby - 如何使用私钥加密完全加密 Ruby 中的数据? - 2

    首先,关于我们系统的一些信息,它基本上是建筑行业的电子招标解决方案。所以:列表项我们的系统有多家公司每个公司都有多个用户每家公司可以创建多个拍卖然后其他公司可以为可用的拍卖提交他们的出价。一个出价包含数百或数千个单独的项目,我们只需要加密这些记录的“价格”部分。我们面临的问题是,我们的大客户不希望我们知道投标价格,至少在投标过程中是这样,这是完全可以理解的。现在,我们只是通过对称加密对价格进行加密,因此即使价格在数据库中有效加密,他们担心的是我们拥有解密价格的key。因此,我们正在研究某种形式的公钥加密系统。以下是我们对解决方案的初步想法:当一家公司注册时,我们会使用OpenSSL为其

  3. ruby-on-rails - 我如何比较 'Bcrypt' Gem解密的密码和加密的密码 - 2

    我正在尝试对某些帖子的评论使用简单的身份验证。用户使用即时ID和密码输入评论我使用“bcrypt”gem将密码存储在数据库中。在comments_controller.rb中像这样@comment=Comment.new(comment_params)bcrypted_pwd=BCrypt::Password.create(@comment.user_pwd)@comment.user_pwd=bcrypted_pwd当用户想要删除他们的评论时,我使用data-confirm-modalgem来确认数据在这部分,我必须解密用户输入的密码以与数据库中的加密密码进行比较我怎样才能解密密码,

  4. ruby - 如何在Elixir中使用AES CBC 128进行加密和解密 - 2

    我在Rails中有一个具有以下方法的应用程序,该方法可以加密和解密文本并与Java客户端通信。defencrypt(string,key)cipher=OpenSSL::Cipher::AES.new(128,:CBC)cipher.encryptcipher.padding=1cipher.key=hex_to_bin(Digest::SHA1.hexdigest(key)[0..32])cipher_text=cipher.update(string)cipher_textexcenddefhex_to_bin(str)[str].pack"H*"enddefbin_to_hex(

  5. ruby-on-rails - 如何生成用于 attr_encrypted 的加密 key - 2

    我正在考虑使用attr_encrypted在Rails应用程序中用于字段级加密的gem。如何生成用于此gem的加密key?更新:Encryptor的文档,它是attr_encrypted使用的底层加密,声明如下(在Usage|Basic下):secret_key=Digest::SHA256.hexdigest('asecretkey')encrypted_value=Encryptor.encrypt('somestringtoencrypt',:key=>secret_key)我猜想key可以是任意长度的随机字符串,而对hexdigest的调用将从中计算出适当的固定长度字符串。这是

  6. ruby - 在Ruby中访问pgp加密文件 - 2

    我有一个pgp加密文件,我需要在运行时从中提取数据。这可以通过仅解密到内存来完成吗(而不是创建解密文件并在完成后将其删除)? 最佳答案 名为OpenPGP的Ruby库几个月前发布。看起来它对你有用。 关于ruby-在Ruby中访问pgp加密文件,我们在StackOverflow上找到一个类似的问题: https://stackoverflow.com/questions/1083546/

  7. 酷早报:10月21日全球Web3加密行业重大资讯大汇总 - 2

    2022年10月21日星期五【数据指标】加密货币总市值:$0.95万亿BTC市值占比:38.51%恐慌贪婪指数:23极度恐慌 【今日快讯】1、【政讯】1.1.1、美联储布拉德:市场预期美联储11月会加息75个基点1.1.2、美联储哈克:将维持加息一段时间1.2、美国10年期国债收益率触及4.197%,为2008年6月以来最高1.3、法国数字转型部长:政府将专注于DeFi和Web31.4、巴西ATM机将于11月3日起支持USDT1.5、美众议院副议长将于11月初加入a16zCrypto担任政府事务主管1.6、香港数字资产托管机构FirstDigitalTrust首席执行官:香港仍是安全

  8. Ruby OpenSSL 非对称加密——使用两个 key 对 - 2

    我想使用两个key对在两个通信系统之间实现具有不可否认性的安全消息传递。我使用以下方法生成并存储了两组key对:sys1_key=OpenSSL::PKey::RSA.generate(2048)sys2_key=OpenSSL::PKey::RSA.generate(2048)这两个key对都将其单独的公钥和私钥保存到文件中:sys1.pub.pemsys1.priv.pemsys2.pub.pemsys2.priv.pem系统1有自己的公钥和私钥以及系统2的公钥。系统2有自己的公钥和私钥以及系统1的公钥。在系统1上,我想获取消息“Helloworld”并使用系统1的私钥和系统2的公

  9. ruby - 在 Ruby 中实现 gpg 加密 - 2

    尝试将一些旧的shell/unix脚本转换为Ruby。我对一个文件进行了以下加密,这是通过Unix中的gpg工具完成的。我可以传入接收者key、我要加密的文件和输出文件到pgp加密一些东西。gpg--recipient"$my_recipient_key"\--encrypt"$my_file"\--output"$my_outfile"\--always-trust\--compress-algozip像上面那样进行简单加密的Ruby等价物是什么?经过一些挖掘,我看到:OpenPGP很流行,但是在RubyGems网站上没有文档,其他地方也很少有很好的例子。gpgme似乎很受欢迎,很有

  10. ruby - 加密空字符串 - 2

    我正在使用Ruby的OpenSSLbindings进行AES-256加密。我可以加密一个非空字符串。但是,当尝试加密空字符串时,Ruby会引发异常,提示数据不能为空。如何使用Ruby的OpenSSL绑定(bind)加密空字符串?重现问题的代码require"openssl"KEY=OpenSSL::Cipher::Cipher.new("aes-256-cbc").random_keydefencrypt(plaintext)cipher=OpenSSL::Cipher::Cipher.new("aes-256-cbc")cipher.encryptiv=cipher.random_i

随机推荐