同态加密入门
在这篇文章中,我们将了解同态加密的基本概念,介绍常用的同态加密开发库,学习同态加密应用开发的一般步骤,了解如何在Web应用中添加同态加密支持。
区块链开发教程链接: 以太坊 | 比特币 | EOS | Tendermint | Hyperledger Fabric | Omni/USDT | Ripple
1、同态加密概述
同态加密改变了隐私保护的游戏规则,它允许直接操作加密数据而无需先进行解密。这一概念可以追溯到RSA加密 —— RSA也具备有限的同态加密功能。不过同态加密很长时间都局限在学术界,直到2009年Craig Gentry的论文发表后,才涌现了大量的同态加密库。
现在已经有很多可用的同态加密库了。下面列出了一些比较流行的同态加密开发包以及它们支持的方案类型,当然这个清单是不完整的:
- Microsoft SEAL: BFV, CKKS (C++)
- HElib: BGV (with GHS), CKKS (C++)
- PALISADE: BFV, BGV, CKKS, FHEW (C++)
- TFHE: Ring-variant of GSW (C++)
- HEAAN: CKKS (with bootstrapping) (C++)
为你的web'应用找到合适的同态加密开发包以及方案类型需要进行大量的研究工作:
- 这些不同的同态加密实现代码有什么区别?
- 安装这些同态加密开发包需要什么依赖?
- 我如何在自己的web应用中使用同态加密库?
- 一个加密方案对性能有什么影响?
- 这个加密方案对数据有什么特殊的要求?
- 什么是自举?为什么我需要这个环节?
在你开始设计一个隐私保护的应用之前,有些问题就需要先找出答案。
在这个教程里,让我们从微软的SEAL开始介绍,因为SEAL的文档非常好。
2、使用Microsfot SEAL同态加密库
让我们先看看如何加密数据。首先你可以将一个数组(或者c++里的vector)编码为特定格式的平文本,然后再将平文本加密成密文。同态处理是在密文上进行的。为了读取处理结果,你需要解密然后再解码。
上述过程的伪代码如下:
const arr = [1,2,3...] const plain = encode(arr) const cipher = encrypt(plain) // Add the cipher to itself - element wise evaluate.add(cipher, cipher) const decrypted = decrypt(cipher) const decoded = decode(decrypted) // `decoded` contains [2,4,6, ...]
上面的代码我进行了简化,实际上这之前还有一些必要的步骤。
下面是SEAL同态加密库的一些基本信息。
第三方依赖
SEAL没有必须的第三方依赖。可选的依赖包括:zlib和Microsoft GSL
支持的方案
- BFV:操作有符号/无符号整数
- CKKS:操作浮点数
基本的差别和限制
- BFV:密文的数据容量由加密参数决定,数组中每个元素的上下界也是参数决定的
- CKKS:数组中的每个成员的取值范围更大,但是密文容量相比BFV减半。而且CKKS 只能进行近似计算
自举(Bootstrapping)允许在加密数据上进行无限的同态处理。没有自举的话,只能执行有限次数的
同态处理(例如乘法等)。目前SEAL同态加密库还不支持自举,但是已经有计划为CKKS方案添加自举支持。自举会对性能有很大的影响,在很多情况下你在使用同态算法时都不需要自举。
没有自举的同态算法被称为层级化算法。分层的数量(也就是可以执行多少次同态处理)是由你选择的加密参数来决定的。
3、选择同态加密方案
第一步是为你的应用选择一个合适的同态加密方案。你是需要整数还是可以容忍一定的误差?当你需要绝对精度时应该使用BFV方案。CKKS有它的优势,但是会在解密时引入一定的误差 —— 虽然通过调整参数可以让误差减小到可以接受的范围,但是对于新手来说这是有难度的。
4、选择合适的同态加密参数
一旦你选好了同态加密方案,下面就需要确定算法的参数了。这个问题应该是最难回答的,因为它取决于很多因素。此外还有更多的问题,例如:
- 如何测试那些参数有效?
- 是否还有优化的空间?
- 是否需要为每一组参数都构建一个新的测试应用?
下面是我们的同态加密实用方法学:
- 选择同态加密方案:我认为BFV要比CKKS更容易商收。至少当解密结果不正确时 你可以立刻判断有问题
- 从128位加密层级开始:虽然有更高的可选项,但是代价是缩减的同态加密操作- 能工作就好:从一个中等层级的PolyModulusDegree (4096)开始,然后逐渐增加 直到不能成功解密。再反向逐渐减小至不能成功解密。用这样的办法得到上下界。
- 细调:修改CoeffModulus的位数,使用模数转换或CKKS的重缩放。
5、使用Node-Seal为web应用增加同态加密支持
作为替代的方案,我建议你通过快速实验来找出适合你的应用的参数。为此我开发了一个开源软件node-seal,以便在JavaScript中实用SEAL同态加密库。你可以利用这个软件快速编写一个JavaScript测试应用来进行参数实验。node-seal的内核采用webassembly,可以运行在Node.js或现代浏览器中,已经包含了zlib支持,不需要进行本地编译。
原文链接:同态加密应用开发入门 — 汇智网
低调大师中文资讯倾力打造互联网数据资讯、行业资源、电子商务、移动互联网、网络营销平台。
持续更新报道IT业界、互联网、市场资讯、驱动更新,是最及时权威的产业资讯及硬件资讯报道平台。
转载内容版权归作者及来源网站所有,本站原创内容转载请注明来源。
- 上一篇
Java是如何实现自己的SPI机制的? JDK源码(一)
注:该源码分析对应JDK版本为1.8 1 引言 这是【源码笔记】的JDK源码解读的第一篇文章,本篇我们来探究Java的SPI机制的相关源码。 2 什么是SPI机制 那么,什么是SPI机制呢? SPI是Service Provider Interface 的简称,即服务提供者接口的意思。根据字面意思我们可能还有点困惑,SPI说白了就是一种扩展机制,我们在相应配置文件中定义好某个接口的实现类,然后再根据这个接口去这个配置文件中加载这个实例类并实例化,其实SPI就是这么一个东西。说到SPI机制,我们最常见的就是Java的SPI机制,此外,还有Dubbo和SpringBoot自定义的SPI机制。 有了SPI机制,那么就为一些框架的灵活扩展提供了可能,而不必将框架的一些实现类写死在代码里面。 那么,某些框架是如何利用SPI机制来做到灵活扩展的呢?下面举几个栗子来阐述下: JDBC驱动加载案例:利用Java的SPI机制,我们可以根据不同的数据库厂商来引入不同的JDBC驱动包; SpringBoot的SPI机制:我们可以在spring.factories中加上我们自定义的自动配置类,事件监听器或初始...
- 下一篇
手把手教你进行pip换源,让你的Python库下载嗖嗖的(系列二)
/1 前言/ 今天我们来说说python的pip换源吧,这个换源,相对来说,还是比较重要的,能让自己少生好几次气的,哈哈哈!礼拜一的时候,小编发布了手把手教你进行pip换源,让你的Python库下载嗖嗖的(系列一),没有来得及上车的小伙伴,可以戳进去看看。 在上篇文章的留言处,我看到了一位名为hxw的大侠慷慨留言,详情如下图所示。 怀着学习之心,小编自己亲自去尝试,发现其提供的方法行之有效,现在整理出来分享给大家。hxw如果看到这篇文章的话,可以后台获取小编的微信,小编将给予一个红包聊表谢意。 /2 为什么要换源/ 我相信小伙伴们一定也遇到跟我这样的问题,如下图所示。 没错,就是我们在pip安装东西的时候,有时候容易飘黄飘红,而且大多时候还慢。这个是因为我们去获取的包,是直接从国外拿的。 虽然有墙,但是为了我们的学习,仍然还是要留出一些正儿八经的网站的,但是仍然还是慢,毕竟太远了,咋办呢?国内的大神早都在国内搭建好了站点,和原网站的内容一模一样,我们只需要将我们的pip源指向国内就好了,我也是后悔知道的晚啊,害,踩了那么多的坑。那咱们废话不说,就直接开始吧~ /3 换源流程/ 1)国内...
相关文章
文章评论
共有0条评论来说两句吧...
文章二维码
点击排行
推荐阅读
最新文章
- CentOS7编译安装Cmake3.16.3,解决mysql等软件编译问题
- CentOS7编译安装Gcc9.2.0,解决mysql等软件编译问题
- Docker快速安装Oracle11G,搭建oracle11g学习环境
- CentOS8编译安装MySQL8.0.19
- MySQL8.0.19开启GTID主从同步CentOS8
- SpringBoot2全家桶,快速入门学习开发网站教程
- CentOS8,CentOS7,CentOS6编译安装Redis5.0.7
- CentOS7,CentOS8安装Elasticsearch6.8.6
- CentOS8安装MyCat,轻松搞定数据库的读写分离、垂直分库、水平分库
- Red5直播服务器,属于Java语言的直播服务器