• 沒有找到結果。

二、 技術介紹

在此一章節中,我們介紹加密演算法會用到的相關技術。

2.1 HYL encoding

是採自[7]這篇裡的 0-1 encoding,此方法會將數字轉化成兩集合,0 集合和 1 集 合,而若有兩數 a 和 b,則可透過檢查 a 轉化的 1 集合和 b 轉化的 0 集合是否有交集來 推得 a 是否大於 b,以下為詳細步驟。

1.對於輸入數字 k(舉例為 188),把其化為 2 進位形式,也就是 10111100。

2.從第一個 bit 開始往下數,第一次截取長度 1,以例子來說是 1,第二次截取長度 2,

也就是 10,以此類推直到數到最後一位元為止,以範例來說截取了 8 個字串,分別是 1 , 10, 101, 1011, 10111, 101111, 1011110, 10111100。

3.接者檢測這些字串結尾的位元,若為 0,則把結尾改成 1 後加入 0 集合,若為 1,則 直接把字串加入 1 集合,以範例來說:

0 集合: 11, 1011111, 10111101

1 集合: 1, 101, 1011, 10111, 101111

這樣就完成編碼,而比較大小方法如下例,我們假設有 2 數字,207 和 188,而經 過 HYL encoding 後的集合如下:

207 (二進位形式 11001111):

0 集合:111, 1101

8

1 集合:1, 11, 11001, 110011, 1100111, 11001111

188 (二進位形式 10111100):

0 集合: 11, 1011111, 10111101

1 集合: 1, 101, 1011, 10111, 101111

可以看到 207 的 1 集合和 188 的 0 集合有 11 這個交集,故可推得 207 大於 188,而 以下是證明。

證明:

假設兩數 a 與 b,而如果 a 的 1 集合和 b 的 0 集合有一交集 c,c 為 0 和 1 所構成的 字串,假定 c 長度為 n,其前 n-1 個 bit 的字串為 d,即 c=d1(因在轉化時,字串結尾為 0 的會改成 1 後加入 0 集合,結尾為 1 的直接加入 1 集合,故 0 集合和 1 集合裡所有的 字串都以 1 結尾),則代表 a 的二進位形式其前 n 的 bit 的字串為 d1,而 b 的二進位形 式其前 n 個 bit 的字串為 d0,可推得 a 是大於 b 的。

2.2 HMAC

全名為 hash-based message authentication code,此 code 的主要功能是附在訊 息裡,讓擁有鑰匙的使用者去算出訊息的 hash 值,並透過檢查 HMAC 來確認訊息有無遭 受竄改,形式為 HMAC(key,訊息)=hash 值,而 HMAC 具有以下特性:

1.若使用者擁有 key 和訊息,則可在多項式時間內解出此訊息的 hash 值。

2.給定一 hash 值,使用者無法在多項式時間內解出此 hash 值所對應的訊息。

而在此我們在加密方法使用 SHA-512 這個 HMAC。

9

2.3 Bloom filter

通常,我們要檢查一個集合是否包含某個元素,必須要檢查此集合中所有的元素,

但當集合一大時就比較費時間,於是 Burton Howard Bloom 提出了 bloom filter 來節 省時間和空間,伴隨者一點點錯誤機率,以下為詳細介紹。

Bloom filter 是一個長度為 m 的陣列,陣列裡每個元素皆為 0 或 1,另有 k 個 hash 函數,其功用為將字串對應到一整數,範圍 1~m。

當我們要對某一集合 A 做 bloom filter 時,先初始一陣列 b,長度 m,並將陣列 b 裡的值都設為 0,接者對 A 裡每個元素,都對其做 k 個 hash 函數,而每個 hash 函數都 會把集合內的元素對應到陣列裡的某個位置,然後把該位置的值設成 1(不論該值為 0 或 1),如下圖 2,每個箭頭代表一個 hash 函數:

圖 2: Bloom filter 製作示意圖

之後若有檢測元素 d 是否在 A 集合中,便拿 b 來做 k 個 hash 函數,依照輸出的值 找其在陣列 b 中對應的位置是否都為 1,如圖 3

10

圖 3:用 bloom filter 測試元素在不在集合內之示意圖

若都為 1,則表示 d 在 A 集合內,反之則否。

這方法可以把一集合縮成一長度 m 的陣列,並把比較所需時間從 O(n)變成 O(k),

但是他有錯誤機率,有可能檢測元素並不在集合內,但檢測結果卻說有在,這個機率跟 陣列長度 m、集合元素個數 n 及 hash 函數的個數 k 有關,而當滿足k = m ln 2 /n 時,

此機率達到其最低值21𝑘

2.4 Reed Solomon Code

是一種錯誤更正編碼,其透過增加傳送的資料量,使得即使中間傳輸有出錯,只要 在一定比例以下,還是可以還原成本來的資料,而他是一個非二元的 code,以 RS(k,b) code 為例,輸入為 b 個 m-bit symbol,輸出為 k 個 m-bit symbol,k 大於 b 且小於2𝑚+ 2,而 輸出的 k 個 m-bit symbol 中,前 b 個為原本的 symbol,後 k-b 個為新增的 symbol,而 其擁有可以修復𝑘−𝑏2 個 symbol 的能力,並且具有最小漢明距離為 k-b+1,也就是說不論 你輸入的 b 個 symbol 為何,只要不是相同的 2 組 b 個 symbol,2 組輸出的 k 個 symbol 必定至少在 k-b+1 個位置上不相同。

而其詳細 encoding 如下:

1.針對 m-bit symbol,首先找出 GF(2𝑚)的 Primitive polynomial 的根α,

α 也是 GF(1024 的生成元),並作出 g(x)=(𝑥 − 𝛼1) ∗ (x − 𝛼2) … (x − 𝛼𝑘−𝑏)

11

2.接者我們將輸入的 b 個 symbol 看成是方程式係數,並產生方程式

n(x)=𝑏1 + 𝑏2𝑥 + 𝑏3𝑥2+ ⋯ 𝑏𝑏𝑥𝑏−1

3.將 n(x)乘上𝑥𝑘−𝑏後除上 g(x),並得到餘數 r(x)。

4.最後輸出𝑥𝑘−𝑏∗ 𝑛(𝑥) + 𝑟(𝑥)的方程式係數,共 k 個,每個係數為 m-bit symbol。

12

相關文件