隐私计算-密码学-同态加密

1 隐私计算综述

留学文书隐私保护

近年来,随着大数据与人工智能的盛行,针对个人的个性化的推荐技术的不断发展,人们在享受便利的同时,也深深的感觉到无处不在的监控与监事,比如刚刚浏览了一个网站的商品,当去其他网站访问的时候就会推荐类似的产品;刚刚搜索了某件商品,在很多其他的场景中都会给你推荐。这种体验,谈不上不好,也谈不上多坏,但是如果仔细想想,就感觉自己的网上进行裸奔,个人隐私,一清二楚,毫无隐私可言,细思极恐。

不过随着广大用户对于个人隐私的重视程度不断加强,以及法律法规的不断完善,针对个人隐私的保护提出了更高的要求,什么样的数据可以采集、收集与使用,如何使用都是一个比较敏感的问题。十三届全国人大常委会第三十次会议表决通过了《中华人民共和国个人信息保护法》,并与2021年11月1日起施行。确立个人信息保护原则、规范处理活动保障权益、禁止“大数据杀熟”规范自动化决策、严格保护敏感个人信息、赋予个人充分权利等。新规施行后,违法的主体将最高可处五千万以下或者上一年度营业额百分之五以下的罚款。

鉴于上述情况,近年来隐私计算技术被不断的提及,源于其有优秀的数据保护作用,使得“数据不出域、数据可用不可见、数据可算不可见”,限定了数据的使用场景,防止了数据的泄露,而引起了业界的热捧。

2 隐私计算发展史

隐私计算技术的演进历程如下图描述,以下是杨强教授在KDD 2021中国区的分享材料:

在这里插入图片描述

可以看到,隐私计算技术从1979年就开始了,最开始是安全多方计算、到差分隐私、到TEE,再到最近火的不能再火的联邦学习,一系列的技术应运而生。那为啥现在隐私计算这么火呢。

  • 近年来的各种技术的发展包括大数据、实时计算、密码学、机器学习、高并发等为隐私计算搭建了技术基座。
  • 以联邦学习为代表的近似计算在性能上面的突破,使得在工业界可以落地。
  • 法律法规的的陆续出台,以及广大用户对于数据隐私的重视程度。
在这里插入图片描述

注:隐私计算技术成熟度曲线

但是这些技术本身的安全加密都是采用共同的方法与策略,下面讲述下隐私计算的加密技术。

3 加密技术概述

针对隐私计算的加密技术来说,不管这些技术如何演进,从根本来说,加密的方式主要有以下几种:

  • 同态加密 Homomorphic Encryption
  • 秘钥分享 Secret Sharing
  • 混淆电路 Garbled Circuit
  • 不经意传输 Oblivious Transfer
  • 差分隐私 Differential Privacy

本文主要介绍同态加密,

我们经常听到这样的话,“我们要对数据进行加密,保障数据的安全”。但是这句话实在是太笼统,太抽象,可以量化的信息量太少,没有太多的信息增益。比如我们要在什么时候加密、在什么场景加密、在什么节点加密、在什么流程中加密?这些都没有表述清楚,所以这种话就是官话,听起来始终没有错,但是就是没啥用。

众所周知,优秀的程序员需要严谨的逻辑思维与具象能力,当然在材料的时候,可能需要适当的渲染。但是对于技术的理解,对技术的探索,严谨的逻辑与坚实的推理是非常重要的。所以,对于“数据加密”这个命题,需要进行一番探索。

这里,我尝试用数据声明周期的全链路来进行思考,进而可以得出如下的结论:

  • 数据存储加密:对数据的存储安全负责,保障数据的静存储态安全。
  • 数据传输加密:对数据的转移安全负责,保障数据的转移态安全。
  • 数据计算加密:对数据的动态计算负责,保障数据的运行态安全。

如此三态合一,即可保障数据的全链路的生命周期安全

数据存储与传输加密,这两门技术已经在互联网中大量使用,比如我们使用某个加密算法,例如对称加密,将数据加密后存储在磁盘上。又比如,我们使用基于TLS协议的HTTP(HTTPS)进行数据的可靠与安全传输。但是对于数据计算来说,我们通常的做法是在内存运行态,将数据解密成明文,进而进行计算,也就是说在计算过程中都是明文的,所以对于内存攻击来说,这个数据是可以得到的,进而有泄漏的风险。

那么有没有办法解决数据计算的安全问题呢?答案就是同态加密技术。保障数据的运行态的安全,那么同态加密技术具体是如何实现,如何应用,并且有哪些限制呢?

4 同态加密的历史

  • 同态加密(Homomorphic Encryption)在密码学的历史比较悠久。早在1978年,Ron Rivest, Leonard Adleman, 以及Michael L. Dertouzos就以金融行业为应用背景,进而提出了这个概念[RAD78]。对,你没有看错,Ron Rivest和Leonard Adleman分别就是著名的RSA算法中的R和A,该方案基于公钥密码体系RSA,此方案满足乘法同态性。

  • 首位构造出全同态加密方案的人是Gentry,是其在Stanford攻读博士学位的研究成果。Gentry毕业后IBM。在那里Gentry和另一个密码学大牛Halevi继续进行同态加密及其相关的研究,并实现了一些同态加密方案。

  • Paillier加密系统,是1999年paillier发明的概率公钥加密系统。基于复合剩余类的困难问题。该加密算法是一种同态加密,满足加法和数乘同态。

  • 2009年Dijk、Gentry等人提出了整数上的完全同态加密方案,困难性基于近似GCD难题。该方案主要贡献是将原来基于“理想格”的SWHE替换为一个非常简单的整数描述的SWHE。在概念上的进行了极大的化简,但依旧是使用Gentry的同态解密技术将SWHE其转化为FHE。故效率没有提高。

  • 2011年Brakerski、Gentry、Vaikuntanathan提出的完全同态加密方案[3],简称BGV方案,可以看做第二代FHE。困难性基于LWE(纠错学习)。利用密钥交换技术、模交换技术来降低密文维数和减弱噪音,使得效率大大提高。

5 什么是同态加密

什么是同态加密?,引用Gentry大佬的原话:

A way to delegate processing of your data, without giving away access to it.

同态加密(Homomorphic Encryption, HE),指满足密文同态运算性质的加密算法,即数据经过同态加密之后,对密文进行某些特定的计算,得到的密文计算结果在进行对应的同态解密后的明文等同于对明文数据直接进行相同的计算,实现数据的“可算不可见”。同态加密的实现效果如图所示。

同态加密:实现数据的“可算不可见” - FreeBuf网络安全行业门户

6 同态加密的定义

6.1 场景定义

举个例子:国内某家大型的三甲医院,由于历史悠久,并且医术精湛,历史遗留了大量的用户病例数据。如今思考基于这些病例数据进行建模分析。但是由于数据量特别巨大,医院本身的IT资源有限,计算能力不足。

这个时候,云厂商找了过来。但是对于医院来说,这些数据本身是用户的隐私信息,并且也是医院的核心价值,所以尽管云厂商再三保证数据安全,但是医院还是不能够放心的将数据上传到云厂商进行计算

正当这个事情推进不下去的时候,云厂商从密码行业花大价钱招来某个大牛,大牛提出一个方案,这样吧,我们现在有这样一门技术,不需要传输明文数据,只需要传输密文就好,而且加密秘钥由医院自己保存,我们基于上传的密文数据做不解密的密态运算( 并计算函数医院提供就好),这样数据不会泄露,云厂商对数据无感知,之后传回密文结果,医院自己解密就好。医院一听非常高兴,那就这么办吧。

img

下面将核心流程描述下。

6.2 核心流程

  1. 医院秘钥生成 - KeyGen**:医院在本地服务器生成用来加密数据的秘钥Key。
  2. 医院数据加密 - Encrypt Function:医院用本地生成的秘钥KeyEncrypt 算法加密本地的数据,记为 EncData = Encrypt(Key, Data)
  3. 医院指定计算函数 - Compute Funtion:我告诉云平台需要如何计算数据,记为函数 F()
  4. 云厂商进行计算 - EvaluateEvaluate(F(), EnData) = Encrypt(Key, F(Data)),记为 CompEncData,并传回医院
  5. 医院Decrypt Function,得到 F(Data) = Decrypt(Key, CompEncData),也就是最终结果

6.3 HE的分类

这里,大家可能有个问题,这个f应该是什么样的函数,有什么样的限制条件?HE方案是支持任意的数据处理方法f,还是说只支持满足一定条件的f呢?根据f的限制条件不同,HE方案实际上分为了两类:

  • **FHE - Fully Homomorphic Encryption **:在这种模式下,HE方案支持任意给定的f函数,只要这个f函数可以通过算法与策略描述,并且可以用计算机实现。显然,从目标场景角度来说,FHE方案是一个非常棒的方案,但是从实际落地角度老说,由于其计算开销极大,暂时还无法在实际中使用,这个领域存在广阔的探索空间。

  • **SWHE - Somewhat Homomorphic Encryption **:在这种模式下,HE方案只支持一些特定的f函数。从目标场景角度来说,SWHE方案稍弱,支持能力有限。但正因为这种有限,同时也意味着开销变得较小,实现容易,所以现在已经可以在实际中使用,比如在联邦学习的安全树模型中,就使用了这门技术,使用同态加法进行梯度直方图的构建。

7 同态加密库Paillier

在工业界大名鼎鼎的同态加密库就是Paillier了,在很多场景中都能看到其忙碌的身影,笔者在工作中也使用过这个库,相对来说从性能与便捷的角度来说还是比较优秀的,不过其支持同态加法,如果想要使用同态乘法需要使用RSA算法。

7.1 Paillier算法

Paillier加密算法是Pascal paillier[1]在1999年发明的概率公钥加密算法,该算法基于复合剩余类的困难问题,是一种满足加法的同态加密算法,已经广泛应用在加密信号处理或第三方数据处理领域。

前面我们分析过同态加密的核心流程,大家可以一起回忆一下。核心的函数包括:秘钥生成、明文加密、密文解密,下面我们来一步一步的分析,并且描述下,

7.2 秘钥生成

秘钥的生成主要有如下的步骤,

  1. 随机选择两个素数p和q。
  2. 计算n = p*q,\lambda = lcm(p-1,q-1),lcm为两个数的最小公倍数。
  3. 选取随机数g,g \in Z_{n^2}^*,并且满足gcd(L(g^{\lambda } mod n^w2),n) = 1,gcd为两个数的最大公约数,X表示整体,下标表示他的整数集合里面有多少元素。L(x) = \frac{x-1}{n}
  4. 公钥为(n, g)
  5. 私钥为(\lambda,)

7.3 明文加密

在这里插入图片描述

7.4 密文解密

在这里插入图片描述

7.5 相关代码

下面介绍一个完整的同态运算,m由m_1与nm_2组成,介绍下同态加密的是如何使用密文计算的。

""
Benchmark key generation, encryption and decryption.
"""

import random
import resource
import time
import phe.paillier as paillier


def bench_encrypt(pubkey, nums):
    for num in nums:
        pubkey.encrypt(num)


def bench_decrypt(prikey, nums):
    for num in nums:
        prikey.decrypt(num)


def bench_add(nums1, nums2):
    for num1, num2 in zip(nums1, nums2):
        num1 + num2


def bench_mul(nums1, nums2):
    for num1, num2 in zip(nums1, nums2):
        num1 * num2


def time_method(method, *args):
    start = time.time()
    method(*args)
    return time.time() - start


def bench_time(test_size, key_size=128):

    print('Paillier Benchmarks with key size of {} bits'.format(key_size))
    pubkey, prikey = paillier.generate_paillier_keypair(n_length=key_size)
    nums1 = [random.random() for _ in range(test_size)]
    nums2 = [random.random() for _ in range(test_size)]
    nums1_enc = [pubkey.encrypt(n) for n in nums1]
    nums2_enc = [pubkey.encrypt(n) for n in nums2]
    ones = [1.0 for _ in range(test_size)]

    times = [
        time_method(bench_encrypt, pubkey, nums1),
        time_method(bench_decrypt, prikey, nums1_enc),
        time_method(bench_add, nums1_enc, nums2),
        time_method(bench_add, nums1_enc, nums2_enc),
        time_method(bench_add, nums1_enc, ones),
        time_method(bench_mul, nums1_enc, nums2)
    ]
    times = [t / test_size for t in times]
    ops = [int(1.0 / t) for t in times]

    print(
        'operation: time in seconds (# operations per second)\n'
        'encrypt: {:.6f} s ({} ops/s)\n'
        'decrypt: {:.6f} s ({} ops/s)\n'
        'add unencrypted and encrypted: {:.6f} s ({} ops/s)\n'
        'add encrypted and encrypted: {:.6f} s ({} ops/s)\n'
        'add encrypted and 1: {:.6f} s ({} ops/s)\n'
        'multiply encrypted and unencrypted: {:.6f}  s ({} ops/s)'.format(
            times[0], ops[0], times[1], ops[1], times[2], ops[2],
            times[3], ops[3], times[4], ops[4], times[5], ops[5]
        )
    )
    return times


def bench_mem(test_size):
    r_init = resource.getrusage(resource.RUSAGE_SELF).ru_maxrss
    pubkey, prikey = paillier.generate_paillier_keypair()
    nums = []
    for i in range(test_size):
        if not i % 10000:
            # This is probably KB (i.e. 1000 bytes) when run on linux
            r = resource.getrusage(resource.RUSAGE_SELF).ru_maxrss - r_init
            print('Memory usage for {:,} encrypted numbers = {:,} ({:.4f} per '
                  'number)'.format(i, r, i and r / i))
        nums.append(pubkey.encrypt(random.random()))

# bench_mem(1000000)  # NOTE: this will take a long time


times = []
key_sizes = [128, 256, 512, 1024, 2048, 4096, 8192]
for key_size in key_sizes:
    times.append(bench_time(1000, key_size))

8 参考资料

9 番外篇

个人介绍:杜宝坤,隐私计算行业从业者,从0到1带领团队构建了京东的联邦学习解决方案9N-FL,同时主导了联邦学习框架与联邦开门红业务。
框架层面:实现了电商营销领域支持超大规模的工业化联邦学习解决方案,支持超大规模样本PSI隐私对齐、安全的树模型与神经网络模型等众多模型支持。
业务层面:实现了业务侧的开门红业务落地,开创了新的业务增长点,产生了显著的业务经济效益。
个人比较喜欢学习新东西,乐于钻研技术。基于从全链路思考与决策技术规划的考量,研究的领域比较多,从工程架构、大数据到机器学习算法与算法框架均有涉及。欢迎喜欢技术的同学和我交流,邮箱:baokun06@163.com

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 213,558评论 6 492
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 91,002评论 3 387
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 159,036评论 0 349
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 57,024评论 1 285
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,144评论 6 385
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,255评论 1 292
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,295评论 3 412
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,068评论 0 268
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,478评论 1 305
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,789评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,965评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,649评论 4 336
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,267评论 3 318
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,982评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,223评论 1 267
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,800评论 2 365
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,847评论 2 351

推荐阅读更多精彩内容