密码学——保序加密算法(OPE算法-2009年提出)通俗易懂解析(小学生都能懂!)含python代码

本文介绍保序加密算法BCLO - 09,其能让加密后的明文保持顺序且可解密。还讲解了超几何分布,通过实例阐述超几何采样步骤。分析了算法安全性,最后给出超几何分布和BCLO - 09算法的Python代码及运行结果,包括密钥表格内容。

一、 预备知识

  1. 保序加密算法:最初是由2009年,Boldyreva等四个人提出来的,可简称BCLO-09算法,论文题目为《Order-Preserving Symmetric Encryption》,请自行搜索并下载,本文直接让你读懂该论文的核心算法。
  2. 算法目的:简单来说就是本来有顺序的明文,加密之后依然保持顺序,但是除此之外不知道任何信息。简单来说,我要加密2,5,8三个数字,我把它们分别换成45,4424,22224,这样就保证了别人不知道我原来的数字,但是又保持了原来的顺序,但是我们必须保证能把后面三个数字复原回去才行(解密),BCLO-09算法就做了这项工作。这项工作的难度在于如何能复原,又能保证复原的复杂性,不易于被破解。
  3. 超几何分布(也就是下面论文算法图里面的HGD这个函数):
    在这里插入图片描述

小括号的意思是组合数,上面的(yx)(\begin{matrix} y\\x\end{matrix})(yx)也就是CyxC^x_yCyx。我解释一下这个公式的意思,只需要记住这个公式的意思就行:一个框里面有N个球,其中黑球M个,白球N-M个,从这个框里面拿起来y个球,数一下我拿起了多少个黑球,记为x。x就是这个函数要返回的一个值。接下来我们继续看看论文作者怎么用这个超几何分布进行抽样(用这个x)。

二、算法讲解

在这里插入图片描述

  1. 举个栗子~我要把[1, 100]这个区间的整数映射到[1, 1000]中,我们采用上述方法映射一个数字,我们先选择25进行映射。
  2. 我们直接看第十行:x = HGD(M,N,y),它的意思是:我们从一个框里面抽球,里面黑球有M个(就是明文域的大小100),白球有N个(就是密文域的大小1000),我抽了y个球(就是密文域大小的一半500),这个函数可以给我返回我抽了多少个黑球,也就是数值x(这个值必然是0-100之间的数,因为我从1100个球里面抽,可能抽不到黑球,也可能抽到所有的黑球)。
    接下来,阐述具体的超几何采样的步骤:
  • 第一步:假设我采样到了44这个数,因为大于25,所以重新调整明文域和密文域分别为[1, 44],[1, 500];反之,如果我抽到的数小于25,假设是11,那么分别调整为[11, 100],[500,1000]。

  • 第二步:调整后,继续进行上述抽球活动。就这样反复抽几轮,一定能抽到明文域里的25,密文域也在一半一半的切,至于切左区间还是右区间,要看每次抽样抽到的x与25的大小关系,最后从区间[283, 298]的区间中随机取一个数作为25的密文。注意!不仅要抽样,还要把每次抽样结果记录在key_table这张表里面!
    在这里插入图片描述

  • 第三步:下面我们加密明文域里面的26,我们查看key_table这张表发现,一直到原来的第⑥步,抽样的过程都可以省略,直接把之前抽到的x拿来用完全合理,但是第⑥步由于26>25,所以我要取第⑥步密文域的右半部分才合理即[299, 313],然后剩下26与27,26就是值在左边,所以再取左区间[299, 306]。再从最后这个左区间随机取一个数作为26的密文。
    在这里插入图片描述

  • 第四步:解密的步骤就是一个反向查表的过程。不赘述。

三、思考

  1. 我们通过25和26的加密可以发现:在最后随机取数的两个区间中,无论取得什么值,最后的密文必然和原来的明文所反映的大小是相同的,即(25<26)=(25对应的密文<26对应的密文)
  2. 安全的地方在于:首先是抽样的随机性,但是抽取的时候由控制好了区间,保证了抽取的数必然在符合大小条件的区间中;然后就是对key_table这张表的保密,加密者不可以泄露这张表!
  3. 值得思考的是,论文作者用这种方法,保证了原来的数字加密后顺序依然不变,并且还能还原回原来的数字。然而敌手得到密文后完全不可能(有抽样的过程)知道原来的数字,除了原来数字的大小顺序(所以叫保序加密)。

四、代码

1 超几何分布python代码

超几何分布(hypergeometric):
        ----numpy中实现:
            np.random.hypergeometric(ngood,nbad,nsample,size)-->产生size个随机数,每个随机数为在总样本中随机抽取
            nsample个样本后好样本的个数。所有样本由ngood个好样本和nbad个坏样本组成。
 
import numpy as np

# 超几何分布,7个好的3个坏的,摸3个,重复10次,返回好球的个数组成的数组
r = np.random.hypergeometric(7, 3, 3, 10)
print(r)

运行结果:
[2 1 3 3 2 2 3 3 2 2]

2 BCLO-09算法代码

新建一个BCLO09.csv文件,存放密钥表格

(注意:一定要先创建一个记事本文件,然后修改文件名为BCLO09.csv,否则会报编码错误!)

再创建一个BCLO09.py文件

import csv
import random

import numpy as np
import pymysql

key_table = "BCLO09.csv"
def HGD(D, R):
    len_D = len(D)
    len_R = len(R)
    y = int(len_R / 2)
    x = np.random.hypergeometric(len_D, len_R, y, size=1)
    a = x[0]
    if x[0] >= len_D:
        a = len_D - 1
    return D[a]

def writeCsv(path, data, modle): #传入变量csv文件的路径和要写入的数据
    with open(path,modle,newline="") as f: # 以写入的方式打开文件,newline="" 可以让数据不隔行写入
        writer_csv=csv.writer(f) #调用csv的writer方法往文件里面写入数据,并赋值给writer_scv变量
        writer_csv.writerow
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值