Homomorphic-Encryption

如何使用全同態加密對“加密指紋特徵矩陣”進行匹配?

  • May 26, 2014

我正在做一個指紋認證過程。使用細節的特徵提取已經完成,我得到一個N x 6矩陣,其中 6 列是 { $ x_i $ , $ y_i $ , 的交叉數 $ i $ 細節,方向 $ i_{th} $ 細節,其餘 2 列不用於匹配}。前兩個是(x,y)檢測到的第 i 個細節點的座標。交叉數檢測細節的類型(ridge=1,bifurcation=3)

我想加密這個矩陣。在加密域中執行匹配並以加密形式(如同態加密)將結果發送回。

有這樣做的程式碼或想法嗎?請幫忙。

以下是 C 中簡單匹配程式碼的範例(沒有任何加密)…

特徵提取後作為輸出得到的特徵矩陣是t1t2。可以看到這些值分配給矩陣t1t2程序。這些是 FVC2002 數據庫的特徵向量101_1.tif101_2.tif來自 FVC2002 數據庫的特徵向量。(同一個人的圖像)。它將輸出作為相似度得分0.7(滿分 1),這意味著圖像匹配。

從 80 個圖像數據庫中觀察到的另一件事是,在應用特徵提取時,“N”(特徵數)的最大值為82。也就是說,行大小是最大的。82 列大小始終為 6(固定)。這是程序(在 C 中進行匹配):

#include stdio.h
#include math.h


float t1[26][6]= {216.0000,46.0000, 3.0000, 0.5030,0, 1.0000,190.0000,49.0000, 1.0000, 3.5827,0, 1.0000,146.0000,64.0000, 1.0000, 3.2684,0, 1.0000,247.0000,80.0000, 1.0000, 0.7002,0, 1.0000,173.0000,86.0000, 1.0000, 0.3666,0, 1.0000,302.0000,93.0000, 1.0000, 0.8372,0, 1.0000,176.0000,127.0000, 3.0000, 0.2761,0, 1.0000,227.0000,131.0000, 3.0000, 0.5634,0, 1.0000,164.0000,135.0000, 1.0000, 3.3159,0, 1.0000,117.0000,140.0000, 1.0000, 5.7642,0, 1.0000,216.0000,169.0000, 1.0000, 0.7320,0, 1.0000,256.0000,170.0000, 3.0000, 3.8934,0, 1.0000,196.0000,181.0000, 1.0000, 3.7386,0, 1.0000,176.0000,187.0000, 3.0000, 0.4613,0, 1.0000,151.0000,195.0000, 1.0000, 5.7175,0, 1.0000,285.0000,215.0000, 3.0000, 0.7886,0, 1.0000,227.0000,218.0000, 1.0000, 0.8161,0, 1.0000,152.0000,219.0000, 1.0000, 2.2884,0, 1.0000,169.0000,233.0000, 1.0000, 4.1407,0, 1.0000,147.0000,242.0000, 1.0000, 4.6064,0, 1.0000,186.0000,250.0000, 1.0000, 4.1676,0, 1.0000,240.0000,332.0000, 1.0000, 0.4986,0, 1.0000,165.0000,227.0000, 5.0000,0,0, 1.0000,72.0000,360.0000, 7.0000,0,1.0000,1.0000,324.0000,12.0000, 7.0000,0, 1.0000, 1.0000,120.0000,312.0000, 7.0000,0, 1.0000, 1.0000};


float t2[19][6]= {190.0000,45.0000,3.0000,0.5896,0,1.0000
                 ,139.0000,46.0000,3.0000,0.1600,0,1.0000
                 ,126.0000,54.0000,1.0000,3.3025,0,1.0000
                 ,79.0000,64.0000,1.0000,5.7130,0,1.0000
                 ,181.0000,83.0000,1.0000,0.6658,0,1.0000
                 ,219.0000,84.0000,3.0000,3.9261,0,1.0000
                 ,159.0000,98.0000,1.0000,3.7340,0,1.0000
                 ,136.0000,110.0000,1.0000,0.2556,0,1.0000
                 ,118.0000,115.0000,1.0000,5.8276,0,1.0000
                 ,248.0000,130.0000,3.0000,0.8766,0,1.0000
                 ,192.0000,134.0000,1.0000,0.8088,0,1.0000
                 ,117.0000,137.0000,1.0000,2.3575,0,1.0000
                 ,132.0000,150.0000,3.0000,2.4106,0,1.0000
                 ,111.0000,164.0000,1.0000,4.6623,0,1.0000
                 ,149.0000,169.0000,1.0000,4.1655,0,1.0000
                 ,129.0000,148.0000,5.0000,0,0,1.0000
                 ,60.0000,264.0000,7.0000,0,1.0000,1.0000
                 ,276.0000,264.0000,7.0000,0,1.0000,1.0000
                 ,84.0000,264.0000,7.0000,0,1.0000,1.0000
                };

float t3[30][4],t4[20][4],tnew[30][4];
void transform(float t1[26][6],int i,int flag);
void transform2(float t4[20][4],float thref);
float score(float x1[22][4],float x2[15][4]);

main()
{
   float sm=0,S=0;
   int i,j,a,i1,j1;
   printf("Matching Program\n\n");

   for(i=0; i<22; i++)
   {
       transform(t1,i,1);
       for(j=0; j<15; j++)
       {
           if(t1[i][2]==t2[j][2])
           {
               transform(t2,j,2);
               for(a=-5; a<6; a++)
               {
                   transform2(t4,(a*3.1416/180));
                   sm=score(t3,tnew);
                   if(S<sm)
                   {
                       S=sm;
                   }
               }
           }
       }
   }
   if(S>0.4) printf("Match");
   else printf("Mismatch");
}

//COORDINATION TRANSFORM FUNCTION
void transform(float t1[26][6],int i,int flag)
{
   float xref,yref,thref;
   int k,l,j,c,count,i1,j1;
   float b[3][1],t[5][5];
   xref=t1[i][0];
   yref=t1[i][1];
   thref=t1[i][3];
   float r[3][3]= {cos(thref),sin(thref),0,-sin(thref),cos(thref),0,0,0,1};
   if(flag==1)
       count=22;
   else if(flag==2)
       count=15;
   for(i=0; i<count; i++)
   {
       b[0][0]=t1[i][0]-xref;
       b[1][0]=t1[i][1]-yref;
       b[2][0]=t1[i][3]-thref;
       for(j=0; j<3; j++)
       {
           for(k=0; k<3; k++)
           {
               t[j][k]=0;
               for(c=0; c<3; c++)
                   t[j][k]=t[j][k]+(r[j][c]*b[c][k]);
           }
       }
       if(flag==1)
       {
           for(c=0; c<3; c++)
           {
               t3[i][c]=t[c][0];
           }
           t3[i][3]=t1[i][2];
       }
       if(flag==2)
       {
           for(c=0; c<3; c++)
           {
               t4[i][c]=t[c][0];
           }
           t4[i][3]=t1[i][2];
       }
   }
}

//COORDINATION TRANSFORM FUNCTION2
void transform2(float t4[20][4],float thref)
{
   float r[4][4]= {cos(thref),sin(thref),0,0,-sin(thref),cos(thref),0,0,0,0,1,0,0,0,0,1},b[4][1],t[5][5];
   int k,l,i,j,c,i1,j1;
   for(i=0; i<15; i++)
   {
       for(j=0; j<4; j++)
           b[j][0]=t4[i][j];
       b[2][0]=b[2][0]-thref;
       for(j=0; j<4; j++)
       {
           for(k=0; k<4; k++)
           {
               t[j][k]=0;
               for(c=0; c<4; c++)
                   t[j][k]=t[j][k]+(r[j][c]*b[c][k]);
           }
       }
       for(j=0; j<4; j++)
       {
           tnew[i][j]=t[j][0];
       }
   }
}

//Transformed Minutiae Matching Score
float score(float x1[22][4],float x2[15][4])
{
   int i,j,i1,j1;
   float n,thres,thres_theta,found,dx,dy,sm;
   float dtheta,d;
   n=0;
   thres=15;
   thres_theta=14;
   for(i=0; i<22; i++)
   {
       found=0;
       j=0;
       while((found==0)&&(j<15))
       {
           dx=x1[i][0]-x2[j][0];
           dy=x1[i][1]-x2[j][1];
           d=sqrt(pow(dx,2)+pow(dy,2));
           if(d<thres)
           {
               dtheta=(abs(x1[i][2]-x2[j][2]))*180/3.1416;
               if(dtheta>(360-dtheta))
                   dtheta=360-dtheta;
               if(dtheta<thres_theta)
               {
                   n=n+1;
                   found=1;
               }
           }
           j=j+1;
       }
   }
   sm=sqrt(pow(n,2)/(22*15));
   return sm;
}

我還沒有完全閱讀您的程式碼,但快速瀏覽一下它會告訴我,您將很難將它簡單地“移植”到類似helib的東西。首先,我認為 helib 沒有對浮點的原生支持。其次,即使你有浮點數學,像 sqrt、sin、cos 等函式也可能需要相當多的工作才能進入像 helib 這樣的東西。

也就是說,理論上您應該能夠使用同態加密對加密的指紋矩陣進行匹配。然而,HE 的應用還沒有達到超級容易和實用的程度。

有這樣做的程式碼或想法嗎?

由於你沒有具體說明你做了什麼研究,或者你已經知道什麼,我只能猜測。

如果您還沒有這樣做,您可以檢查:

最後但並非最不重要

根據您已經(或尚未完成)的研究,它們中的每一個都可能為您提供有用的指導。

我希望你能明白我不會扔程式碼……你提供的原始碼還沒有顯示任何加密實現的努力,我當然不打算為你編寫所有程式碼會有點太多,而且回答有點過分。畢竟,這不是 GitHub 之類的……(但是,我絕對想回應@mikeazo,他已經指出了潛在的可移植性問題。)

引用自:https://crypto.stackexchange.com/questions/16353