本文实践了指纹识别生物特征识别研究论文A Fuzzy Vault Scheme的算法部分。原文请查看以下链接:

Juels, A. & Sudan, M. Des Codes Crypt (2006) 38: 237. doi:10.1007/s10623-005-6343-z

准备知识:

1.有限域/伽罗华域(Galois Field,GF)

2.RS编码和纠错算法RS(Reed-Solomon)码

3.多项式构建和重构

4.模糊保险箱Fuzzy Vault

5.Talk is cheap,show me the code


1.有限域/伽罗华域(Galois Field,GF)

RS(Reed-Solomon)码在伽罗华域(Galois Field,GF)中运算的,因此在介绍RS码之前先简要介绍一下伽罗华域。

CD-ROM中的数据、地址、校验码等都可以看成是属于GF(2m) = GF(28)中的元素或称符号。GF(28)表示域中有256个元素,除0,1之外的254个元素由本原多项式P(x)生成。本原多项式的特性是得到的余式等于0。CD-ROM用来构造GF(28)域的

(13-1)

而GF(28)域中的本原元素为

α = (0 0 0 0 0 0 1 0)

下面以一个较简单例子说明域的构造。

[例13.1] 构造GF(23)域的本原多项式假定为

α定义为 = 0的根,即

α3+α+1 = 0

和 α3 = α+1

GF(23)中的元素可计算如下:

0

mod(α3+α+1) = 0

α0

mod(α3+α+1) = α0 = 1

α1

mod(α3+α+1) = α1

α2

mod(α3+α+1) = α2

α3

mod(α3+α+1) = α+1

α4

mod(α3+α+1) = α2+α

α5

mod(α3+α+1) = α2+α1+1

α6

mod(α3+α+1) = α2+1

α7

mod(α3+α+1) = α0

α8

mod(α3+α+1) = α1

……


用二进制数表示域元素得到表13-01所示的对照表

表13-01 GF(23)域中与二进制代码对照表, 

GF(23)域元素

二进制对代码

0

(000)

α0

(001)

α1

(010)

α2

(100)

α3

(011)

α4

(110)

α5

(111)

α6

(101)

这样一来就建立了GF(23)域中的元素与3位二进制数之间的一一对应关系。用同样的方法可建立GF(28)域中的256个元素与8位二进制数之间的一一对应关系。在纠错编码运算过程中,加、减、乘和除的运算是在伽罗华域中进行。现仍以GF(23)域中运算为例:

加法例:α0+α3 = 001+011

= 010 = α1

减法例:与加法相同

乘法例:α5·α4 = α(5+4) mod7

= α2

除法例:α53 = α2

α35 = α-2

= α(-2+7)

= α5

取对数:log(α5) = 5

这些运算的结果仍然在GF(23)域中。

2.RS编码和纠错算法RS(Reed-Solomon)码

RS的编码就是计算信息码符多项式除以校验码生成多项式之后的余数。

在介绍之前需要说明一些符号。在GF(2m)域中,符号(nk)RS的含义如下:

m

表示符号的大小,如m = 8表示符号由8位二进制数组成

n

表示码块长度,

k

表示码块中的信息长度

K=n-k = 2t

表示校验码的符号数

t

表示能够纠正的错误数目

例如,(28,24)RS码表示码块长度共28个符号,其中信息代码的长度为24,检验码有4个检验符号。在这个由28个符号组成的码块中,可以纠正在这个码块中出现的2个分散的或者2个连续的符号错误,但不能纠正3个或者3个以上的符号错误。

对一个信息码符多项式,RS校验码生成多项式的一般形式为

 (13-2)

式中,m0是偏移量,通常取K0 = 0或K0 = 1,而(n-k)≥2t (t为要校正的错误符号数)。

下面用两个例子来说明RS码的编码原理。

[例13.2] 设在GF(23)域中的元素对应表如表13-01所示。假设(6,4)RS码中的4个信息符号为m3、m2、m1和m0,信息码符多项式

 (13-3)

并假设RS校验码的2个符号为Q1和Q0的剩余多项式



这个多项式的阶次比的阶次少一阶。

如果K0 = 1,t = 1,由式(13-2)导出的RS校验码生成多项式就为

 =  (13-4)

根据多项式的运算,由式(13-3)和式(13-4)可以得到

m3x5+m2x4+m1x3+m0x2+Q1x+Q0 = (x-α)(x-α2)Q(x)

当用x = α和x = α2代入上式时,得到下面的方程组,

经过整理可以得到用矩阵表示的(6,4)RS码的校验方程:

求解方程组就可得到校验符号:

在读出时的校正子可按下式计算:

 

[例13.3] 在例13.2中,如果K0 = 0,t = 1,由式(13-2)导出的RS校验码生成多项式就为

= (13-5)

根据多项式的运算,由(13-3)和(13-5)可以得到下面的方程组:



方程中的αi也可看成符号的位置,此处i = 0,1,…,5。

求解方程组可以得到RS校验码的2个符号为Q1和Q0

 (13-6)

假定mi为下列值:

信息符号

m3 = α0 = 001

m2 = α6 = 101

m1 = α3 = 011

m0 = α2 = 100

校验符号

Q1 = α6 = 101

Q0 = α4 = 110

校正子

s0 = 0

s1 = 0

代入(13-6)式可求得校验符号:

Q1 = α6 = 101

Q0 = α4 = 110

13.2.3 RS码的纠错算法

RS码的错误纠正过程分三步: (1)计算校正子(syndrome),(2)计算错误位置,(3)计算错误值。现以例13.3为例介绍RS码的纠错算法。

校正子使用下面的方程组来计算:

为简单起见,假定存入光盘的信息符号m3、m2、m1、m0和由此产生的检验符号Q1、Q0均为0,读出的符号为m3′、m2′、m1′、m0′、Q1′和Q0′。

如果计算得到的s0和s1不全为0,则说明有差错,但不知道有多少个错,也不知道错在什么位置和错误值。如果只有一个错误,则问题比较简单。假设错误的位置为αx,错误值为mx,那么可通过求解下面的方程组:

得知错误的位置和错误值。

如果计算得到s0 = α2和s1 = α5,可求得αx = α3和mx = α2,说明m1出了错,它的错误值是α2。校正后的m1 = m1′+mx ,本例中m1=0。

如果计算得到s0 = 0,而s1≠0,那基本可断定至少有两个错误,当然出现两个以上的错误不一定都是s0 = 0和s1≠0。如果出现两个错误,而又能设法找到出错的位置,那么这两个错误也可以纠正。如已知两个错误的位置,那么求解方程组:

就可知道这两个错误值。

CD-ROM中的错误校正编码CIRC和里德-索洛蒙乘积码(Reed Solomon Product-likeCode,RSPC)就是采用上述方法导出的。

3.多项式构建和重构

多项式(Polynomial)是代数学中的基础概念,是由称为不定元的变量和称为系数的常数通过有限次加减法、乘法以及自然数幂次的乘方运算得到的代数表达式。例如X2 - 3X + 4就是一个多项式。多项式是整式的一种。不定元只有一个的多项式称为一元多项式;不定元不止一个的多项式称为多元多项式。

4.模糊保险箱Fuzzy Vault

生物特征模板保护策略主要可分为2类:基于变换的方法和基于密钥的方法。前者主要包括双因子认证和非可逆变换,这种方法能将特征模板变换成随机模板,变换后的模板用于认证。两者的区别是双因子认证中密钥是私有的。基于密钥的方法主要有密钥绑定和密钥生成,密钥生成策略从特征模板中提取辅助数据(Helper Data),从待认证的特征模板中将密钥提取出来。密钥绑定策略是指将特征模板与外部输入的密钥绑定,进而产生辅助数据,这种方法能够实现密钥和特征模板的双重保护。

 这是生物特征加密领域最为经典的实用化方案,很多研究者的工作都是基于这个方案的.

这种算法是Juels和Sudan[42]在模糊承诺方案的基础上提出来的,算法最大的特点就是fuzzy,这个特点很好地把生物特征的模糊性和密码算法的精确性联系了起来.概括地说,这种算法可以分为两个步骤:1) 用户Alice将秘密K放到保险箱(vault)中,并且用无序集A加以锁定;2) 用户Bob使用无序集B尝试访问K(即打开保险箱vault).Bob能够访问到K的充分必要条件是无序集B和A的绝大多数元素重合.

算法的具体实现过程可以描述如下:

a)加密保险箱:用户 Alice 选择关于 x 的多项式 p 来加密 K,然后计算无序集 A 在多项式 p 上的投影 p(A), 这样(A,p(A))就构成一个有限点集.然后随机生成一些杂凑点(chaff point)与先前生成的点集一起形成R,这就是所谓的保险箱 Vault,杂凑点对于隐藏秘密 K 是非常必要的,并且其数量要远远大于真实点.

b)解密保险箱:用户 Bob 使用自己的无序集 B,如果 B 和 A 绝大多数的元素重合,那么 B 中有许多点就会

落在多项式 p 上,使用纠错码技术,Bob 就能重构出 p 来,进而获取秘密 K.但是,如果 B 和 A 有相当大比例的元素不重合,那么重构出 p 是相当困难的.

这种算法的安全性是基于多项式重构问题的.之所以特别适用于生物特征数据,是因为它使用无序集(比如指纹的细节点等)工作,并且能够处理集合之间(元素数量和元素本身)的误差.

流程图如下:


以上流程图使用的CRC编码与本文使用的RS编码不同,相比而言是很好的改进,本人对CRC也不是很了解,所以此处略过。

下面我们看代码实例。

5.Talk is cheap,show me the code

首先请看我的文件以及目录结构

以下是代码详细,附带详细注解
加锁,生成vault
clear all;
addpath('./src/');
addpath('./src/recover/');
addpath('./src/reconstruct/');
%##########################加锁过程#################################### % work over GF(2^16): 在Galois 2^16 有限域工作
FIELD = 16;
% degree of polynomial 多项式多少次方
DEGREE = 35;
% number of chaff points to generate:
NUM_CHAFFS = 30;
% define tolerance for adequate length-checks RS纠错码的纠错度
TOLERANCE = 2; key='1234567890';%要使用绑定的key 10bit
n=length(key)+TOLERANCE; k=length(key); % Codeword and message word lengths
msgKey = gf(double(key),FIELD); % e.g. gf(key,16) 密钥 生成gf数组 Galois field array GF Create a Galois field array.
msgKeyRS = rsenc(msgKey,n,k);%key生成RS码 以及多项式 points=[ 3 4 5 6 7 8 9 10 11 12 13 14];%points 我们12个点 点的个数是key长度+2 看你码字长度 ply = gf(msgKeyRS,FIELD);
X = gf(points',FIELD);
Y = evaluate(X,ply,FIELD);
mprojection = [ X Y ]; % ===== C. Mix up the projected points with chaff points: =====
chaffs = gf(zeros(NUM_CHAFFS,2),FIELD);% initialize set of chaff points to zeros:
MINDIST=1;%最小距离为1
for count=1:NUM_CHAFFS % ===== 2.1. keep generating random points until we generate 'numChaffs' =====
% ===== 2.2. generate a random point (a,b) in the field =====
%rndmPt = gf(randi((2^FIELD - 1),1,2),FIELD);%randi((2^FIELD - 1),1,2) ans= 37026 41963
rndmPt = gf(randi((2^FIELD - 1),1,2),FIELD);%randi((2^FIELD - 1),1,2) ans= 37026 41963
% ===== 2.3. check to make sure that it can be added ===== -- FIX
% if (a,b) is > minDist away from any point of `points`, add it
%if (computeDist(points,rndmPt,FIELD) > MINDIST)
chaffs(count,:) = rndmPt;
%end
end
% ===== 2.4. remove zeros from chaff point set ===== -- FIX
%chaffs( ~any(chaffs,2), : ) = [];
% ===== 2.5. sort points and merge chaffs with points 至此我们得到保险箱=====
%保险箱由vault 映射点We refer to the set R and 以及the parameter triple (k; t; r) together as a fuzzy v ault, denoted by VA
vault = sortrowsGF([ chaffs ; mprojection ],FIELD);

打开锁,拿到我们的 key

%##########################解锁过程####################################
testpoints=[ 3 4 5 6 7 8 9 10 11 12 13 19];%points 我们12个点 点的个数是key长度+2 看你码字长度 指纹细节点 解锁
testpoints = gf(testpoints',FIELD); % e.g. gf(key,16)
% 解锁做的就是
%1 找出和vault最接近的点
% 2.获取我们应该用的解锁数据
% 3.解锁 获取多项式参数 然后RS解码 % define shorthands:
vaultLength = size(vault,1);
numPts = size(testpoints,1); % ===== 1. Sort vault based on distance to closest query point: ===== % define column vector of distances:
dists = zeros(vaultLength,1);
overlapointscount=0;
vaultOverlapping= zeros(1,1); for idx=1:vaultLength
dists(idx) = computeDist1D(testpoints,vault(idx,1),FIELD);
if (dists(idx)<1)
overlapointscount=overlapointscount+1;
vaultOverlapping(overlapointscount)=idx;
end
end
decodeFactor=decodePolynomial(vault(vaultOverlapping,:),FIELD,length(testpoints)-1);%解多项式
fieldKey = rsdec(decodeFactor,n,k);%解码
% initialize `key` as empty string:
key = '';
% convert each coefficient into a string and append to key:
for idx=1:(length(fieldKey))
% convert each coefficient into char and append:
key = strcat(key,fieldToAscii(fieldKey(idx),FIELD));
end
key

运行截图

LOCK 以及查看vault数据


UNLOCK 可以看到解码得到的key 即使我们输入的points 不是完全匹配,有差别,也可以精确得到我们最开始加密的key

FingerPrint Fuzzy Vault Matlab实践的更多相关文章

  1. kmeans算法的matlab实践

    把图像中所有的像素点进行RGB聚类分析,然后输出看结果 img = imread('qq.png'); %取出R矩阵,并将这个R矩阵拉成一列 imgR = img(:,:,1); imgR = img ...

  2. fuzzy commitment 和fuzzy vault

    Alice,这位令人惊异的魔术天才,正表演关于人类意念的神秘技巧.她将在Bob选牌之前猜中Bob将选的牌!注意Alice在一张纸上写出她的预测.Alice很神秘地将那张纸片装入信封中并封上.就在人们吃 ...

  3. matlab基本语法

    MATLAB基本语法 点乘运算 , 常与其他运算符 点乘运算,常与其他运算符联合使用(如.\) 矩阵生成 矩阵生成 向量生成或子阵提取本节将会介绍一些MATLAB的基本语法的使用. 持续更新... 在 ...

  4. KNN分类器

    KNN学习(K-Nearest Neighbor algorithm,K最邻近方法 )是一种统计分类器,对数据的特征变量的筛选尤其有效. 基本原理 KNN的基本思想是:输入没有标签(标注数据的类别), ...

  5. matlab中使用fuzzy工具箱

    4步教你学会使用matlab模糊控制工具箱 Matlab模糊控制工具箱为模糊控制器的设计提供了一种非常便捷的途径,通过它我们不需要进行复杂的模糊化.模糊推理及反模糊化运算,只需要设定相应参数,就可以很 ...

  6. 《数字图像处理原理与实践(MATLAB版)》一书之代码Part6

    本文系<数字图像处理原理与实践(MATLAB版)>一书之代码系列的Part6,辑录该书第281至第374页之代码,供有须要读者下载研究使用.代码运行结果请參见原书配图,建议下载代码前阅读下 ...

  7. 《数字图像处理原理与实践(MATLAB版)》一书之代码Part2

    本文系<数字图像处理原理与实践(MATLAB版)>一书之代码系列的Part2(P43~80),代码运行结果请參见原书配图,建议下载代码前阅读下文: 关于<数字图像处理原理与实践(MA ...

  8. 《数字图像处理原理与实践(MATLAB文本)》书代码Part7

    这篇文章是<数字图像处理原理与实践(MATLAB文本)>一本书的代码系列Part7(由于调整先前宣布订单,请读者注意分页程序,而不仅仅是基于标题数的一系列文章),第一本书特色186经225 ...

  9. 《数字图像处理原理与实践(MATLAB版)》一书之代码Part1

    本文系<数字图像处理原理与实践(MATLAB版)>一书之代码系列的Part1(P1~42).代码运行结果请參见原书配图. P20 I = imread('lena.jpg');BW1 = ...

随机推荐

  1. delphi 压缩

    DELPHI 通过ZLib来压缩文件夹 unit Unit1; interface uses ZLib, Windows, Messages, SysUtils, Variants, Classes, ...

  2. Lua的控制流程

    一.条件语句 if语句 if语句是由一个布尔表达式作为条件判断,或者紧跟其他语句组成. if else语句 if语句可以是else搭配使用,在if条件表达式为false时执行else语句代码 if嵌套 ...

  3. PyQt5显示日期选择框,获取日期保存文件

    一.UI显示选择日期,保存到文件 import sys,os from PyQt5 import QtCore from PyQt5.QtGui import * from PyQt5.QtWidge ...

  4. Codeforces786B

    传送门 n个节点且固定起点最短路,三种加边方法 1.u->v, 边权为w:2. u->[l, r], 边权为w:3. [l, r]->u, 边权为w AC_Code #include ...

  5. 把swf反编译成fla的几种方法

    2007年著 第一种方法: 利用IMPERATOR FLA1.63 ,这个软件有演示版 和正式版 , 演示版不能反编译Action Scropt,在利用正式版反编译的过程中有时会丢失Action Sc ...

  6. Harbor任意管理员注册漏洞复现CVE-2019-16097

    注册时抓包 添加poc "has_admin_role":true 管理员权限 POC POST /api/users HTTP/1.1 Host: 127.0.0.1 Conte ...

  7. 注意:阿里Druid连接池监控的两个坑

    阿里的Druid大家都知道是最好的连接池,其强大的监控功能是我们追求的重要特性.但在实际情况中也有不少坑,说下最近遇到的一个坑吧! 问题1:不断打印error级别的错误日志 session ip ch ...

  8. JDBC_事务说明

    JDBC控制事务:1.事务:一个包含多个步骤的业务操作,如果这个业务操作被事务管理则多个步骤同时成功或同时失败2.操作: 1.开启事务 2.提交事务 3.回滚事务3.使用Connection对象来管理 ...

  9. Eclipse指定JDK版本

    Eclipse有好多版本,同时又分32位和64位,要使用相对应的版本和一样位数的JDK,Eclipse才能正常运行. 对应不上时,Eclipse 甚至不能正常启动.报错:“Failed to load ...

  10. 【2-SAT】[JSOI2010]满汉全席

    感觉方法和题解差不多,但是题解写的好烦啊...也不是烦,就是很复杂 这里建议开一个数组表示当前这个点选或者不选的编号,这样之后自己理思路也会清楚一点 然而我调了一个小时才发现我是Tarjan写错了.. ...