本文实践了指纹识别生物特征识别研究论文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. ShellExecute打开文件打开文件夹的用法

    1 #include <uf.h> 2 #include <uf_part.h> 3 #include <atlstr.h> 4 #include <iost ...

  2. k8s 映射 外部服务

    把外部的服务,通过创建service和endpoint,把它映射到k8s内部来使用. 操作步骤: 在10.0.0.13上安装数据库 yum install mariadb-server -y syst ...

  3. linux centos 装g++安装不了

    今天需要编译一个项目的时候在装g++都装不上, [root@master hadoop]# yum install g++ Loaded plugins: fastestmirror, refresh ...

  4. springDataJpa的官方API

    一 .  Core concepts(核心概念) 1.springdata中的中心接口是——Repository.这个接口没有什么重要的功能(原句称没什么惊喜的一个接口).主要的作用就是标记和管理.其 ...

  5. sp_executeSql 用法 执行有参数的sql字符串 出现必须声明标量变量 "@XXX"。

    今天遇到了一个难题 就是把 一个拼接sql语句 的返回值 赋值给一个变量 经研究 要用sp_executeSql这个存储过程 据说是从sql 2005才开始有的 代码如下: declare @str ...

  6. python中字典排序

    一.Python的排序 1.reversed() 这个很好理解,reversed英文意思就是:adj. 颠倒的:相反的:(判决等)撤销的 print list(reversed(['dream','a ...

  7. Immutable 想破坏它也没办法

    上一章讲的是线程互斥的synchronized实现,这样做会影响性能,如何才能做到既不影响性能又能达到线程安全的目的呢,就是使用状态绝不会改变的类,Java中的应用就是String类. public ...

  8. myeclipse问题

    eclipse使用过程中发现汉字太小,几乎不可辨识. 更改办法:eclipse界面依次选择“window”–“preference”–“general”–“appearance”–“color and ...

  9. java内存模型和垃圾回收

    摘抄并用于自查 JVM内存模型 1. Java程序具体执行的过程: Java源代码文件(.java后缀)会被Java编译器编译为字节码文件(.class后缀) 由JVM中的类加载器加载各个类的字节码文 ...

  10. Linux 常用命令:开发调试篇

    前言 Linux常用命令中有一些命令可以在开发或调试过程中起到很好的帮助作用,有些可以帮助了解或优化我们的程序,有些可以帮我们定位疑难问题.本文将简单介绍一下这些命令. 示例程序 我们用一个小程序,来 ...