認知風格 設計篇

接續上一篇

調整方法

調適能力 (Adaptivity) 與調適性 (Adaptability)。前者能依據使用者的互動 (interaction) 自動修改應用程式的行為,後者則是依照預先定義好的選項來改變應用程式的行為。

網頁設計類型 優點 缺點
Adaptivity 迅速地貼近使用者,使用者不必做過多設定 由於自動變化,對於使用者教學會相當困難
Adaptability 客製化過程有參與感,可以更了解系統功能 入門困難,適應介面到可以客製的過程長

介面初步

1
2
3
4
5
6
7
8
9
10
test version
______ ______ ______ __ __
/\ == \ /\ __ \ /\ __ \ /\ \/ /
\ \ __< \ \ \/\ \ \ \ \/\ \ \ \ _"-.
\ \_____\ \ \_____\ \ \_____\ \ \_\ \_\
\/_____/ \/_____/ \/_____/ \/_/\/_/
+-------------------------------------+ +--------+
| type you want | |Find it!|
+-------------------------------------+ +--------+

從最基礎的設計中,明顯地會需要一個輸入框與觸發的按鈕。但是搜尋條件有幾種,從 作者 本文 標題 出版期刊 … 等,這些要怎麼設計才好?

《大神落伍了?這些搜索引擎比 Google 精確還更有趣》 這裡提到專門的搜尋引擎,可以針對音樂、圖片、社群、找人 … 等內容進行搜尋。他們是怎麼完成的?

介面二步

1
2
3
4
5
6
7
8
9
10
test version
______ ______ ______ __ __
/\ == \ /\ __ \ /\ __ \ /\ \/ /
\ \ __< \ \ \/\ \ \ \ \/\ \ \ \ _"-.
\ \_____\ \ \_____\ \ \_____\ \ \_\ \_\
\/_____/ \/_____/ \/_____/ \/_/\/_/
+-----------+ +--------+ +-------+ +--------+
| BOOK NAME | | AUTHOR | | WHERE | |Find it!|
+-----------+ +--------+ +-------+ +--------+

這裡的設計多了三個欄位,有些欄位可填、可不填,進行分開的搜尋。然而會不會發生有人誤填一些資訊,誤把人名當書名,造成搜尋結果不好。為了考量這些,基本上都是在搜尋結果中做一個排序,排序的優先權可能先按照書名、作者、地點。搜尋方式的比例差異通常呈現普遍性。

為了加速篩選結果,通常會先抓書名,如果書名不夠具有特色,則會嘗試抓作者名稱,如果作者出版很多本書,則會考慮出版時間、內容。能按照內容進行搜索的引擎,肯定規模很大。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
______ ______ ______ __ __
/\ == \ /\ __ \ /\ __ \ /\ \/ /
\ \ __< \ \ \/\ \ \ \ \/\ \ \ \ _"-.
\ \_____\ \ \_____\ \ \_____\ \ \_\ \_\
\/_____/ \/_____/ \/_____/ \/_/\/_/
+-----------+ +--------+ +-------+ +--------+
| BOOK NAME | | AUTHOR | | WHERE | |Find it!|
+-----------+ +--------+ +-------+ +--------+
+---------------+---------------+---------------------+
| BOOK NAME | AUTHOR | WHERE |
+---------------+---------------+---------------------+
+---------------+
| TITLE |
+---------------+
| SUBTITLE |
+---------------+
| CHAPTER |
+---------------+
| NICKNAME |
+---------------+
| PROLOGUE |
+---------------+

有一種方式是提供搜尋條件的細節,來增加使用者的搜尋效率。上面就是一個範例,不僅僅只是官方書名提供搜索,細節劃分也是相當重要。甚至有人會將書給予暱稱,例如書的名稱太普通,卻以某種封裝、寫法出名,那麼這些書的名稱可能就比較特別。

對於場依賴的而言,看得到的搜尋介面相當重要,它們比較容易根據環境提供的條件,因此設計效能上影響很多。反過來看看場獨立的人,對於這個介面操作可能會將自己的想法投入,這些想法可能來自於自身或者是之前學習過的知識。

1
2
3
4
5
6
7
8
9
10
argument version
______ ______ ______ __ __
/\ == \ /\ __ \ /\ __ \ /\ \/ /
\ \ __< \ \ \/\ \ \ \ \/\ \ \ \ _"-.
\ \_____\ \ \_____\ \ \_____\ \ \_\ \_\
\/_____/ \/_____/ \/_____/ \/_/\/_/
+-------------------------------------+ +--------+
| learning in 23 days type:reference | |Find it!|
+-------------------------------------+ +--------+

對於隱藏式的操作想必也是相當上手。但這種使用需要教學,不是相當方便。可以由簡到繁地引領使用者,例如說第一次搜尋操作後,自動填充,提示使用者下一次搜尋的方法。

1
2
3
+-------------------------------------+ *--------*
| learning in 23 days | |Find it!| <--- click
+-------------------------------------+ *--------*

得到結果後

1
2
3
4
5
6
7
8
9
+-------------------------------------+ +--------+
| learning in 23 days type:reference | |Find it!|
+-------------------------------------+ +--------+
----------------------------------------------------------------------
Find result with ...
* learning in 23 days, author:Alice, type:reference
detail ...
* ...

現在的設計大多都是由 簡到繁 的方式,從蘋果軟體中都可以發現到這些特徵,將不常用的功能都先藏在特定的地方,先基礎地提供最低需求,當使用者發現結果越來越不好時,主動地去察覺要怎麼使用更複雜的操作。

介面三步

當然有些人搜尋的結果,會根據場依賴、場獨立來查閱,場依賴偏向是由觀眾評分、評論來判定是否找到正確的書,場獨立純文本內容為主。著重的觀點不同,為了成功銷售所有的書籍,顯示的方法如下兩種參考。

1
2
3
4
5
6
7
----------------------------------------------------------------------
Find result with ...
* Learning in 23 days, author:Alice, type:reference
detail ...
* WTF Learning, author:Blob
detail ..
1
2
3
4
5
6
7
8
----------------------------------------------------------------------
Find result with ...
* [HOT] STAR: 5, learning in 23 days, author:Alice, type:reference
detail ...
* STAR: 3, WTF Learning, author:Blob
detail ..
* ...

以上示範的是場獨立、依賴的兩種。當然上面的設計屬於階層式、也有水平擺放訊息的方式。其實還有很多種的!

1
2
3
4
* 1 TITLE AUTHOR
* 1.1 DETAIL
* 1.2 DETAIL
* 1.2.1 DETAIL
1
2
3
4
5
6
7
8
+-------+ +------------------------------------------+
| | | TITLE |
| | +------------------------------------------+
| COVER |
| | +------------------------------------------+
| | | AUTHOR, DETAIL |
| | | |
+-------+ +------------------------------------------+

如果找書不根據任何別人推坑的想法,階層式會是很好的細節來決策,嘗試把每一本書的概要都仔細讀過,階層式很吃 優先權順序 ,設計起來相當挑戰。

如果是下方的方式,比較偏向大致上已經在事前知道要買哪本書,有了大概目標。這樣的設計方式方便跳躍性的搜索,因為階層式會 改變高度 ,檢索時的位移量不同會造成操作時間會比較久,但是下方的那種方式屬於固定位移量。

至於對色彩學的配色部分,又分單色、雙色欄位,來加快視窗滑動的對齊。而每一個欄位的文字色彩也相當講究,用色數量越多,看起來越五花八門,面向的使用族群也越多。為了讓使用者有 貼切感 (服務的專一性),通常用色不大於三種。

回頭調整

Adaptivity 提供系統自動調整變化,最好提醒使用者可以切換回去舊的介面設計,否則多個使用者在現實中交談時,可能會發生矛盾的錯亂交流。

Adaptability 提供使用者自定義,這些功能從系統中抽離出來,對於開發者來說是件好事,讓所有功能盡可能地讓特定使用者使用,但普遍性來說,大多數的功能都會被忽略,甚至當作從來沒有過。

Adaptability 類型的網頁設計,提供高度穩定性、客製化,有利於長時間的網站經營,培養長遠的顧客為主,對於短期入門的新手而言,對於客製化的吃力程度不一,當尚未熟悉系統前,對於功能設定處於一知半解狀態,需要閱讀文檔或累積經驗。因此在使用前期效率並不高,有待一段時間後,使用效率就有機會突破 Adaptivity 類型的。

正因為使用時間的長短,Adaptability 比較適合高頻率使用的軟體,而且功能性很強。相較於 Adaptivity 給予功能性較低,但操作起來會比較耗時 (滑鼠移動、滾動) 的軟體。

Reference

Evaluation of a personalized digital library based on cognitive styles: Adaptivity vs. adaptability

課程需求才看得,雖然我對裡面的實驗方法一點也不認同,很多地方沒有考慮進去,實驗的順序性有考慮到,卻沒有去考慮適應面向的主體,拿幾次任務的時間來進行比較往往是不夠的,根據時間成長的效率比較也應該被提出。

課程公告

由於明天的課程有多數同學因畢業旅行而無法前來上課,因此明天上課的方式將不在課堂上進行,而改為同學閱讀所附的 paper,並找時間與組員討論所附的問題

請容許我罵一聲!我擦!為什麼不上課!雖然老師上課的認知風格與我不同,無法好好地學習知識,在盡可能地去適應,卻不斷地減少上課次數,學期結束前都還沒有適應吧。

Read More +

認知風格 找你所好

前言

曾想過明明有資源,卻怎麼樣都學不好嗎?在一個群體中學習,偏偏是落單的那一個人嗎?最近上課講到認知風格的相關內容,又對學習上有所障礙,到底是哪裡出了問題?

本文

如果一名學生的認知風格與教師類似,這個學生就會有更積極的學習經歷,學習將會改善。
隊員如果擁有 類似認知風格 ,將會使他們對於參與有更 積極 的感受。而認知風格的匹配將使參與者與人共事時感覺更為 舒適 ,雖然它並不能獨自保證取得勝利的結果。

明明身處同一個環境下,成長幅度卻來得比別人低,沒錯!學習上完全沒有共鳴,導致學起來相當痛苦,建造、聚集知識的方式不同,兩路不相逢,要如何引領另一個走向相同目標?

在思考知識、經驗傳播問題前,先來認識自己,當然以前人所提供的分類方法,既不是唯一也不能二值劃分,必然有人有於兩邊優缺點,呈現自然分布,很少人是相當極端的特例!

接下來要胡言亂語囉!不用擔心!只是學習的過程不同,不代表能力的侷限。

認知風格

Wholist-Analytic

看待一個事物時,採用策略的認知方法 (從舊有事物著手,了解處理事物之間的關聯)。來看看是怎麼 吸收 管理 新訊息。

Field Dependence & Independence

美國心理學家威特金 (Witkin) 在 1940 年代研究垂直知覺時首先發現的。強調認知的過程而非內容。

  • Field Dependence 場依賴
    偏向利用環境訊息來了解事物。
  • Field Independence 場獨立
    不依賴外界資訊,由個體的方式去理解。

場獨立自主、改造能力高,對於社會技能低。相反地,場依賴則在社會技能高,對於自主、改造能力低。當然從成長過程、性別差異,會逐漸地特化、轉變成另一類,並非完全由天生決定。

一種宅宅的既視感,不外乎差別就是願不願意聽外界,當個固執的聰明人還是頑固的蠢蛋,靠著外界成長就能成為現充,當個活在社會的人。場獨立則相當危險似的,若不是聰明的那一群,很容易被誤解、淘汰於社會中。 社會究竟是何物呢?

Leveller & Sharpener

赫爾茲曼 (K.Holzman) 和克萊因 (Klein, 1954) 使用 水平 - 尖銳 認知型來描述認知風格的另一維度。

  • Leveller 水平
    利用舊有資料產生關聯,並且加入新資料進去,但這樣做容易發生混淆,關聯的下場不保證能夠邏輯地去理解,相當於把多個物品放在同一處,「 他們應該是相似的 」的感覺,甚至有時還會因為擺滿物品而捨棄。一種以增加代替修改的 持久化算法 呢!
  • Sharpener 尖銳
    相對於水平,會想盡辦法 取代 掉舊有資料,把相似之處抓出來後,放大物品差異再放回去架子上,減少混淆的情況。但對於相似之處會被移除,聯想某個物品時,只會看到最後擺放的位置,回答問題只會去描述極端的差異?操作起來一定相當耗時,放大差異去分析處理,想必會很慢。

接下來分析行為上,有一種傾向。Leveller 運行 self-inwardness 模式,避免主動參與活動,對於指導、相助有迫切的需要,傾向於 自我貶抑 的性格。Sharpener 運行 self-outwardness 模式,相較於 Leveller 更喜歡 競爭 自我展現 ,對於成就有高度的需求,常常會逼迫自己推進。

看起來,Leveller 只是因為有 Sharpener 的人存在,才會偏向自我貶抑吧!而 Sharpener 擺明就是一個抖 M 推進器。

Impulsivity & Reflectivity

由卡根 (J.Kagan, 1964) 及同事提出來的,指在不確定條件下個體作出決定速度上的差異。

  • Impulsivity 衝動
    快速地成形自己的看法,對於問題可以很快速地回答,有迫切做出決定的慾望。
  • Reflectivity 反思
    相反地,不斷地反思自己看法,考量所有可能性才能回答問題,並且設想所有評估所有答案的優缺。

這兩種在整體性的工作上沒有任何差異,但反思型學習速度比較慢。

Diverging & Converging

由吉爾福特 (Guilford, 1967) 在介紹智力模型時提出的。

  • Diverging 發散
    回答問題時,答案允許多個,接受多種解決方案,強調多樣性、創造性。
  • Converging 收斂
    強調找到一種明確的正確答案。

只有一種答案不是很無趣嗎?對於我而言,越是要求那麼唯一,就越不是答案,也許是因為找不到唯一的答案吧,才去接受多種選項的可能性。

Holist & Serialist

由帕斯克 (G.Pask, 1972) 和司科特 (Scott) 提出的。

  • Holist 整體
    大規模搜索資料,進行較大的特徵假設,嘗試去找到一個模式、關係來理解。
  • Serialist 序列
    單一方向、單一步驟來完成理解,對於細節較為著重,不在意整體的連接關係。

序列導向的人肯定對於讀書這類的序列資料很感興趣,也比較能一頁一頁的讀完,對於整體導向的人而言,常常會跳躍章節去讀,才會逐漸深入理解。

序列導向通常面臨的是細節著重,而無法看到整體概念,整體導向則由整體概念來理解,而缺少細節的驗證。從具有遠見的程度來看,整體導向會比序列導向來得高,正因為不清楚,才有廣闊的視野吧!

Verbaliser-Imager

心理學家 Paivio (1974) 提出了長時記憶信息如何被加工存儲的理論。影像儲存還是文字儲存?有一種原始影像資料和壓縮過後的大綱儲存差別,語言系統一改,壓縮而成的文字內容會造成理解錯誤吧?

Verbaliser & Imager

Riding 和 Taylor 最初提出的。

  • Imager 形象
    傾向於以視覺表象的形式思維的人被稱為形象型的人。
  • Verbaliser 言語
    傾向於以詞的形式思維的人被稱為言語型的人。

根據許多研究,當學習材料不匹配時,得到的成績往往不理想。而在人格性質上,往往言語型偏向外向、形象型偏向內向。等等,好像明白為什麼語言類型的科目會比較難學,因為很難形象化,導致只有言語型的人可以在這一方面學習得不錯。

Reference

Read More +

虛擬實境 論文研讀 Part 2

接續上一篇,接下來會有很多數學,自己也是一知無解狀態。

QEM

QEM 方程如下,當找到許多在等值曲面上的 $p_k$ 時,接著要找到一個最小 $v$ 參數為滿足目標方程

$v^{M} \leftarrow \text{arg } \underset{v}{min} \sum_{k} (n^t_{k} (v - p_{k}))^2$

為了找到這個 $v$

$v^M \leftarrow v^M + Q^+ (q - Q v^M)$

其中矩陣$Q = \sum_{k} n_{k} n^{t}_{k}$

使用 SVD ( singular value decomposition ),奇異值分解去找解,這個計算好像在巨量資料中也存在 SVD,這世界太可怕了! )。 在找到 $v^M$ 之後,進行簡化模型的縮點 (減少節點數)。經由這一步,可以更貼近物體的輪廓線,來強化邊緣的存在。

為了減少退化三角形跟三角網格的品質,可以藉由 Delaunay Tetrahedralization 再刷新一次。修改、刪除的點其實並不多於全局 (大多都是邊緣?),那麼可以利用鬆弛的方式進行更新會比全局刷新還來得快速。

實戰

接下來這篇論文的作者,要進行實戰比較 (一起來吸收別人怎麼去驗證、統計、比較!實驗方法也是相當重要的。),查看每一次迭代的是否可以的過程、速度。

誤差評定

利用模擬的模型 (幾何模型構成,拿真物要找到物體表面的方向量有點麻煩),來看梯度方向的準確性,簡單來說就是拿實際結果與實驗結果中的一個點,於表面上的法向量夾角作為誤差大小。

$\varepsilon_{n}(p) = \text{arccos } (n(p)^t m(p))$

梯度估計

即使是誤差,平滑也是好事。梯度越小越平滑。

接著它拿兩個物體 sphere 和 fandisk mesh (球體和一個 ???) 進行測試,看來在那些特殊的地方的誤差。算法可能會在某些特殊邊緣、平面的運行效果不好 (算法擅長於那些特徵計算、不善長什麼,來釐清這一點)。

視覺化時,利用下列二種方式凸顯梯度 central differences、Sobel operator (索貝爾運算就是在影像處理運用中,檢測邊緣、圖像梯度用的)。論文作者接下來提供一的新穎 CT value 的計算公式,與一般傳統的不同,讓這個誤差梯度下降。經由上面兩種方式的梯度表示,發現論文作者提供的這種會再更好一點點。

討論

  • 提供一個更準確的 CT value 的計算方式
  • 動態運作 ODT, QEM 的方式

比較 Grid-Based

拿其他的建造方案,如 Grid-Based Polygonization,進行邊緣銳利比較。使用 Hausdorff distance 比較好壞,當然地 Grid-Based 沒對齊好,基本上贏不過三角化的版本!Grid-Based 取樣點夠密集才能勝過 vary triangle 的建模吧!在大多共平面的狀況下,三角形建模的方式需要頂點數非常少。

時間消耗

由於精準度上的調校,提出的方法比起常規的建模是消耗更多時間,但 CT 掃描數據的時間通常需要 10min 到 1hr,但是提出的方法比掃描時間還快。

也就是說讀取資料很慢,處理速度不用這麼快也沒關係,算起來有種 $O(n)$ 的效能。

空間消耗

由於過程中需要大量的矩陣、附加值於記憶體中,會消耗上 GB 的使用空間來維護操作。但現代電腦的記憶體可以超過 10GB 以上,因此這個缺點可以忽略不計。

實作細節

為了加速運行,特別將物體表面周圍的取樣多、密集一點,對於其他地方的取樣少點,如此一來計算量會少很多。

插值

$Tiso= (f(gi)+f(gj))/2$ 中提到插值法,但插值法有很多種,如 tricubic interpolation、bicubic interpolation … 等,如果選擇別種的插植法,效果會不會比較好呢?經過它們的梯度估算方法,他們所提到的插值法會稍微好一些。

結論

提出一個可以用 CT 圖去建模的方法,仰賴的不是三維空間 volumetric data,並且可以提供一個更高精度的建模方法,用少許的三角形就能構造出相當銳利的結果。

  1. 以上都是建立在單一素材上,如果由複合的素材構成,可能是一個無法解決的問題。
  2. 對於光束敏感的物體,CT 的建造方法可以支持更好。
  3. 如果一開始的四面體不夠完善,有可能無法捕抓到邊緣。自適應的 meshing 也許能解決這問題。

提出一個速度慢、空間多的算法,但是現代電腦記憶體夠,速度慢沒關係,比輸入還快就行了

Read More +

近代加密 快速冪次計算

先來上競賽中最常見到的快速冪次寫法

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
long long mul(long long a, long long b, long long mod) {
long long ret = 0;
for( ; b != 0; b>>=1, (a<<=1)%=mod)
if(b&1) (ret += a) %= mod;
return ret;
}
long long mpow(long long x, long long y, long long mod) {
long long ret = 1;
while (y) {
if (y&1)
ret = mul(ret, x, mod);
y >>= 1, x = mul(x, x, mod);
}
return ret;
}

這樣的寫法,只運算 64-bits 內的結果相當不錯,與接下來講的算法速度差異並不大。但對於近代加密所需要的離散對數過程,則會有放大速度差異,因為 x, y, mod 三個參數的 bit-length 都相當長。

Right-To-Left

做法就是最普遍見到的。

1
2
3
4
5
6
7
8
9
void pow(x, a) {
R = 1, g = x
for i = 0 to n, step 1
if (a[i] == 1) // a[i] mean i-bit in a
R = R * g
g = g * g
return R
}
1
2
3
4
5
6
example: a = 26 = (11010)
---
#iterator 0 1 2 3 4
#g x, x^2, x^4, x^8, x^16, ...
binary 0 1 0 1 1
x^a = x^2 x^8 x^16 = x^26

Left-To-Right

1
2
3
4
5
6
7
8
void pow(x, a) {
R = 1
for i = n-1 to 0, step -1
R = R ^ 2
if (a[i] == 1)
R = R * x
return R;
}
1
2
3
4
5
example: a = 26 = (11010)
---
#iterator 0 1 2 3 4
binary 1 1 0 1 0
R x^1 x^11 x^110 x^1101 x^11010

也就是說,每一次迭代,將會將指數左移 (R = R ^ 2 就是要移動 R^xxxx 變成 R^xxxx0,切著看是否要乘上 x 來變成 R^xxxx1),這方法雖然不錯,但是計算高位元空迴圈可是不能忽略!當然對於設計電路的人,固定變量的迴圈展開後就不存在這問題。

效能上,期望的乘法次數與 Right-To-Left 是差不多的!長度為 n bits 的數字,期望值會有 $n/2$ 個 1,因此大約需要 $n/2$ 次乘法。

Left-To-Right(2-bits)

1
2
3
4
5
6
7
8
9
10
void pow(x, a) {
pre-computation: x^2, x^3
R = 1
for i = n/2 to 0, step -2
R = R ^ 4
if (a[i+1]a[i] != 0)
R = R * x^(a[i+1]a[i])
return R
}
1
2
3
4
5
6
example: a = 1737 = (01 10 11 00 10 01)
---
#iterator 0 1 2 3 4 5
R x^1 x^4 x^24 x^108 x^432 x^1736
x^6 x^27 x^434 x^1737
a[i+1]a[i] 01 10 11 00 10 01

長度為 n bits 的數字,倆倆一起期望值會有 $3n/8$ 個非 0 (00, 01, 10, 11 中 4 個有 3 個 $!= 0$,計算組數只有 $n/2$),因此大約需要 $3n/8$ 次乘法。比剛剛快上一點呢 ( $3n/8 < n/2$ )!

Left-To-Right(sliding)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
void pow(x, a) {
pre-computation: x^3
R = 1
for i = n-1 to 0
if a[i]a[i-1] = (11)
R = R ^ 4
R = R * x^3
i -= 2
else if a[i]a[i-1] = (00)
R = R ^ 4
i -= 2
else if a[i] = (0)
R = R ^ 2
i -= 1
else if a[i] = (1)
R = R ^ 2
R = R * x
i -= 1
return R
}
1
2
3
4
5
example: a = (1 10 11 00 10 01)
---
#iterator 0 1 2 3 4 5 6
R x^11 x^11011 x^11011001 x^11011001001
x^110 x^1101100 x^1101100100

期望的乘法次數 $n/3$,這很可怕,別問我!

Summary

Algorithm Name Table Size #squaring Average #Multiplication
Right-To-Left 1: $x^{2^i}$ $n$ $n/2$
Left-To-Right 1: $x$ $n$ $n/2$
Left-To-Right(2-bits) 3: $x$, $x^2$, $x^3$ $n$ $3n/8$
Left-To-Right(sliding) 2: $x$, $x^3$ $n$ $n/3$

Attack

上述四種方法中,不外乎都存在 Conditional Jump 出現,會導致執行速度跟程式計數器 (Program Counter) 移動上會有所差別。可以進行實作攻擊,從分析時間、電源不穩攻擊,來找到 $a$ 究竟是何物 (通常要偷的都是 $x^a$ 上面的 $a$)!電源雜訊干擾於當指令執行到 Conditional Jump 時,干擾 $R$ 的計算發生錯誤,如果沒有發生錯誤,表示 $a \left [ i \right ] = 0$,反之就能知道 $a \left [ i \right ] = 1$

很趣味地是提供一個不需要 Conditional Jump 的寫法 (實作上),一樣會有這種問題!

error example

1
2
3
4
5
R[1] = 1
for i = n-1 to 0, step -1
R[1] = R[1] ^ 2
R[a[i]] = R[1] × g
return R[1]

提供一個不相干的垃圾暫存器 (redundancy register) 來減少 Jump 的問題,很明顯地 電源雜訊干擾 的攻擊仍然存在!這作法很有趣的啊!只是會被攻擊。

Montgomery Ladder

1
2
3
4
5
R[0] = 1, R[1] = g
for i = n-1 to 0, step -1
R[1-a[i]] = R[0] × R[1]
R[a[i] = R[a[i]] × R[a[i]]
return R[0]

這作法避開之前的問題,解決其中一種被攻擊的方案。

過程中都滿足 $R \left [ 0 \right ] = R \left [ 1 \right ] \times g$,同時 $R \left [ 0 \right ]$ 會是最後的答案。

1
2
3
4
5
6
example: a = 26 = (11010)
---
#iterator 0 1 2 3 4 5
binary 0 1 1 0 1 0
R[0] 1 x x^3 x^6 x^13 x^26
R[1] x x^2 x^4 x^7 x^14

明顯地,$R \left [ 1 \right ]$ 的計算是為了下一次為 $a \left [ i+1 \right ] = 1$ 而存在的!

Read More +

資訊安全 期中考筆記

筆記錯誤多多,請以僅供參考的角度去質疑

Problem

  1. Please compare the CFB mode the OFB mode by providing a table indicating at least 5 of their advantage and corresponding disadvantage.

  2. This question is about issues of random access of encryption and decryption. Define notations or symbols you need before providing your answer. Please describe how to use CFB mode and CTR mode to randomly encrypt and decrypt a file Why OFB mode is inappropriate to randomly encrypt and decrypt a file?

  3. What is the one-time pad (please provide a figure to explain it) and what is the main security requirement ?

  4. Follow

    1. What is the main weakness (disadvantage) of ECB mode ?
    2. How CBC resolves this security problem (explained in mathematical approach) ?
  5. Follow

    1. Block ciphers process messages in blocks like an extremely large substitution, but this is very difficult to implement for a very big block size. What is Shannon’s idea to realize a block cipher with big block size ?
    2. Feistel cipher structure provides a real implementation of Shannon’s idea. Please explain the main features of Feistel cipher structure.
  6. What is the avalanche effect of a block cipher ?

  7. What is the Triple -DES with two keys ? Please explain the process the derive the complexity of meet-in-the-middle attack on Triple-DES with two keys.

  8. For all AES round operations, which operation(s) provides substitution and which operations(s) provides diffusion ?

  9. Please describe the details of BBS pseudorandom number generator.

  10. Below is the pseduo code of RC4. Please design a modified RC4 version with message dependent property of key stream.

1
2
3
4
5
6
7
8
9
init(master_key) // shuffle S-array with master_key
i = j = 0
for each message byte M
i = (i + 1) mod 256
j = (j + S[i]) mod 256
swap(S[i], S[j])
t = (S[i] + S[j]) mod 256
C = M xor S[t]

Notes

Part 1

請參照 《資訊安全 小考筆記》

Part 2

請參照 《資訊安全 小考筆記》

Part 3

one-time pad 概念圖如下

1
2
3
4
5
6
7
8
9
10
11
12
13
14
+------------+ +------------+
| random key | | random key |
| generator | | generator |
+------------+ +------------+
| |
| |
| Ki | Ki
| |
| |
Pi +--v--+ Ci +--v--+ Pi
------------------>+ XOR +---------------------->+ XOR +---------------->
+-----+ +-----+
From Alice To Blob

one-time pad 主要是靠 key 不重複使用來維護資料安全,但是雙方同時產生出相同的 random key 是很困難。由於不重複使用,靠一個 random key 的產生提供 random mask 消除明文和祕聞之間的關係。但是雙方都要相同 random key 是相當困難的,通常 generator 是由某個偽隨機數產生器,由演算法產生的到底是不是隨機數呢?

一定要 random key,不能有任何的 dependent、 不能重複 (reuse) ,否則會有 已知明文攻擊

Part 4

ECB mode 在相同明文對應相同的密文,這容易受到大多數的攻擊,如收集已知明文或密文所進行的攻擊。由於明文和密文的關係明確,也因此在 圖片資料 加密傳送,會出現 大量重複 的密文。

CBC mode 提供 random mask 的效果

$$C_{-1} = IV \\ C_{i} = E_{k}(C_{i-1} \text{ XOR } P_{i}) \\$$

$C_{i-1} \text{ XOR } P_{i}$ 操作中可以發現到,讓相同的明文對應到不同的密文 (在前一個密文不同時),解決 ECB 在相同明文加密只會對應種密文。

Part 5

Shannon’s idea 請參照 《資訊安全 小考筆記》

Feistel cipher structure 藉由三個規則實作

  • 多個回合 (round)
  • 藉由一半的訊息加密另一半的訊息
  • 兩個半段訊息位置交換

Part 6

Avalanche effect 讓相似的明文 Pi, Pj (漢明距離 $H(Pi, Pj) = 1$ … 之類的) 對應的密文 Ci, Cj 能有相當大的差異 (漢明距離 $H(Ci, Cj) = \text{half-bit}$ 的期望值),將只有一點不同的差異,擴散到密文的每個地方,放大差異的效果。

Part 7

Triple-DES

$E_{k_{1}}\left [ D_{k_{2}} \left [ E_{k_{1}} \left [ P_{i} \right ] \right ] \right ] = C_{i}$

當指使用兩次的 DES,受到中間相遇法的攻擊,理論上的複雜度與 1 個 DES 一樣,複雜度大約都在 $O(2^{56})$,因此效果並沒有變得更好。然而在 Triple-DES 複雜度就提升到 $O(2^{112})$

中間相遇法攻擊

$$X = D_{k_{2}} \left [ E_{k_{1}} \left [ P_{i} \right ] \right ] \\ C_{i} = E_{k_{1}} \left [ Y \right ]$$

從已知的明文、密文,目標是讓 $X = Y$,窮舉 key,如果發生 $X = Y$ 則表示找到一組可行的解。窮舉得到 $X$ 的複雜度為 $O(2^{56} \times 2^{56}) = O(2^{112})$,而 $Y$ 則需要 $O(2^{56})$,當 $X = Y$ 符合時,則表示 key 找到!

當然也可以抽換相遇的地點,如下是另外一種

$$X = E_{k_{1}} \left [ P_{i} \right ] \\ C_{i} = E_{k_{1}} \left [ D_{k_{2}} \left [ Y \right ] \right ]$$

不管怎麼切割,都至少要窮舉兩把 key 來得到其中一個相遇結果,複雜度都落在 $O(2^{112})$。如果說對應兩個表的結果需要 $O(log \text{ n})$ 的時間,則複雜度為 $O(112 \times 2^{112})$

Part 8

Step Function
Substition Bytes substitution
Shift Rows diffusion
Mix Column diffusion, substitution
Add Round Key substitution

比較討厭的是 Shift Rows 為什麼提供是 diffusion,明明對於兩個相似明文加密上,漢明距離沒有增加!但是 diffusion 不只是讓差異數量增加,還要考量差異位置的變動,相鄰差異的位置被轉移到兩個遠處,就能提供 diffusion!這會讓攻擊者無從判定差異的對應。

Part 9

Blum Blum Shub

$$X_{i} = X_{i-1}^2 \text{mod } N \\ N = p \times q \\ p, q \text{ is prime nubmer, } \\ p \equiv 3 (\text{mod } 4) \\ q \equiv 3 (\text{mod } 4)$$

Part 10

message dependent RC4

第一版本

1
2
3
4
5
6
7
8
9
10
11
i = j = 0, Cprev = 0
for each message byte M
i = (i + 1) mod 256
j = (j + S[i]) mod 256
swap(S[i], S[j])
t = (S[i] + S[j] + Cprev) mod 256
C = M xor S[t]
if sender
Cprev = C
if receiver
Cprev = M

好像不管怎麼寫兩邊似乎都很難相同。

第二版本

1
2
3
4
5
6
7
i = j = 0, C = 0
for each message byte M
i = (i + C) mod 256
j = (j + S[i]) mod 256
swap(S[i], S[j])
t = (S[i] + S[j]) mod 256
C = M xor S[t]

感覺上述的寫法,萬一 C 被竄改,會導致錯誤擴散,而且是全部失效,這讓我非常納悶。

Read More +

虛擬實境 論文研讀 Part 1

期末上繳報告啊,不知道要寫多少才對得起自己。理解正確性不敢保證,相當可怕。

單詞概要

  • Computed Tomography - 電腦斷層掃描 (X 光),簡稱 CT
  • Shepp-Logan filter - 影像去噪中,一種運算操作
  • Delaunay - 計算幾何中 Delaunay Triangulation
  • ODT - optimal Delaunay Triangulation
  • Tetrahedron - 四面體
  • Isosufrface - 等價曲面
  • Truncate - 切去頭端
  • Hausdorff distance - 空間中,集合之間的距離描述 wiki
  • Marching cubes - 用於 CT 模型,重建時的建構 3D 時,根據取樣點得到的最小構造單位。
  • QEM - Quadric Error Mactrics

本文

The Sinogram Polygonizer for Reconstructing 3D Shapes 這篇論文主要拿 Grid-base 掃描重建方法以及根據取樣點重建 3D 模型的算法探討。

首先從離散取樣中重建,最基礎的做法是根據 z-index 作切割,得到 xy 平面,在其上作 Grid-base 網格狀的取樣,得到座標 (x, y, z) 是否在該物體內部。

當取樣數量越多時,密集程度越高,能造就的邊緣就越明顯。藉由 Grid-base 取樣的缺點在於邊緣的凸顯仍然不夠明確於三角化,取樣點的數量必須非常多,才能表示非平行三軸的邊緣。

從 CT 圖中,掃描資料為數張正弦圖 (sinogram),將一個物體放置於轉盤上,轉動轉盤將 X 光照射上去,根據物體的阻射程度得到正弦圖,相當於是光線投影到平面的強度 (CT value)。當一個物體只由一種材質構成時,其阻礙程度與阻礙光線的長度成線性關係,如此一來 CT value 就能有效地反應在物體表面的距離。

這裡補充一點,通常物體不會只由一個材質構成,因此在某些重建工作時會特別弱,如人體掃描重建,則會在眼睛材質上難以得到好的效果。阻礙能力會擴散到其他的正弦圖上,在複合材料的重建工作則會相對地困難。

CT 圖存在些許的干擾,受到鄰近材質的阻射影響。看到網路上文章寫到,即便現代的降噪算法相當厲害,對於醫院普遍使用的成像仍然使用幾十年前的算法,其最重要的原因是擔憂降噪算法捨棄掉的部分到底是不是正確的,去掉資訊若是重要的反而會造成判斷失誤,因此學術界使用 CT 圖的降噪算法仍然不普及於醫學界。

CT

目前 Shepp-Logan filter 相當好用,在 CT 去噪效果受到肯定!公式如下:

$$f(p) = \frac{1}{2} \int_{0}^{2 \pi} \alpha(R_\theta p)^{2} S_{\theta}(P(R_{\theta} p)) d \theta \\ S_{\theta}(q) \leftarrow \int_{-\infty }^{\infty} {\beta(\tilde{q}(x)) S_{\theta}(\tilde{q} (x)) h(x - (q)_{x})} dx \\ h(t) = 2 / (\pi^{2} \delta^{2} - 4 t^{2}) \\$$ $S_{\theta}(q)$ 表示在轉盤角度為$\theta$ 時成像於 q 點的數值$\beta(q) = cos(\angle qso)$,點 q 連線到光源 s、再連線到圓盤圓心點 o。並且$\tilde{q}$ 限定為與點 q 具有相同的 y 值,就是說對水平方向上鄰近點數值去噪$\delta$ 為取樣的像素大小於成像畫面。

從數學公式中看出,受到鄰近點$\tilde{q}$ 影響與光源的偏角差異、與點 q 的距離呈現的關係。

#### 補充 CT 重建 ####

CT 重建方法 中,存在三種常見的方式

迭代法 反投影法 backprojection
濾波反投影法 filtered backprojection

在掃瞄資料中,根據不同角度進行掃描投影,會得到數張 2D 影像,對於實際物體離散取樣,把每一個樣本都當作一個變數 $x_{i}$,根據模擬的方式,可以得到好幾條方程式,解出方程式後,就能知道每個位置上是否有實體 (在物體內部)。但是這樣的效能並不好,會有成千上萬的變數和方程式,甚至有可能發生多組解。


##### 迭代法 #####

迭代法提供一個逼近方法,類似模擬退火法的那種梯度迭代,每一次迭代逐漸將變數數值增加,增加後與實際投影比較,不斷地逼近投影實際值,捨棄掉不合法的數值,每迭代一次讓解更加地接近,當誤差小於某個定值後即可停止。這種作法通常會很慢,但迭代過程中可以加入很多彈性的參數變化,彈性較高。

##### 反投影法 #####

反投影法則是將投影值結果反投影回去,投影的 2D 影像上的某一個點的數值,會反投影到射線上的每一個點,多次反投影後。若該位置存在於物體中,則貢獻於投影像的次數會很多,因此反投影的累加的值也會比較高。接著給定閥值、誤差修正來判斷,效果會更為顯著。反投影法概念上非常簡單,但在邊緣的結果會很模糊。

##### 濾波反投影法 #####

濾波反投影法這部分不是很理解,看起來是先利用 卷積 (Convolution) 操作,再利用傅立葉卷積的反變換,變換過程中需要一個濾波器協助,反變換回來後,再進行反投影法。在傅立葉反變換中需要濾波器,因此選擇濾波器變得相當重要,本篇論文選的是 Shepp-Logan filter 來完成。濾波反投影法的優點是在於輪廓清楚,但會發生 吉布斯現象 (Gibbs phenomenon),逼近原圖時,不連續的函數截面附近會發生震盪。

## 接續 ##

在濾波後,反投影後得到 CT value $f(p)$。當然 $f(p)$ 是一個連續函數的積分,事實上處理時離散的 (因為機器再怎麼精密,齒輪轉角也不會是連續,就看齒數多寡來決定)。

論文中用了 迭代法 濾波反投影法 重建比較,可以得到非常相似的結果。來確認使用的儀器是相當可靠的精準度。

接下來要進行建模,簡單會具有以下幾個步驟。

1. 可以決定要用幾個四面體構成。
2. 三角網格藉由二值化 (CT value 來判定是在物體中還是外部) 抓取,並且加入四面體中。
3. 三角網格到等值曲面的 QEM (Quadric Error Mactrics) 要最小化。
4. 三角網格上的點座標,移動距離購小的時候,算法停止迭代。否則返回第二步,繼續鬆弛新的節點。

第一步進行四面體構成時,通常會採用 * Delaunay Tetrahedralization
(相對於 2D 平面的 Delaunay Trianglution,Delaunay Trianglution 是由 2D Voronoi Diagram,那麼 Delaunay Tetrahedralization 就是由 3D Voronoi Diagram 搭建完成),事實上還有數種建模的方法 (如 Marching cubes 之類的),稍後有機會會提及到。但不管一開始選定的四面體採用哪種策略,經由往後的迭代,將會修整到差不多 QEM。

### 邊緣擷取 ###

對於每一個四面體,找到四面體的重心$g_{i}$ 並且計算 CT value $f(g_{i})$

對於相鄰的四面體,計算 $Tiso= (f(gi)+f(gj))/2$ 接下來要找等值曲面 $Tiso$,找到一個點 p 位於等值曲面上,並且 p 在 gi, gj 的連線上。對於 p 所在的等值曲面上計算法向量 $n_{k}$,等下要用來計算 QEM 用的。

QEM

下篇待續

Read More +

資訊安全 Galois Fields C++ 軟體實作體驗

Problem

在 AES 中,利用 Galois fields$GF(2^{8})$ 為運算單位,有效地在 8-bits CPU 上高效地實作。

Galois Fields$GF(p^{n})$ 限定在質數 p 的 n 次方,便可存在有限的元素集合,支持加減乘除,同時可以利用 擴充歐幾里算法 得得到乘法反元素。從最簡單的 p = 2 開始看起,將 f(x) 視為一個元素。則

$$f(x) = a_{n-1}x^{n-1} + a_{n-2}x^{n-2} + ... + a_{1}x + a_{0} \\ a_{i} \in [0, p)$$

當 p = 2 時,f(x) 就跟一般的二進制數字儲存相同。當選定在 p 的 n 次方時,必須找一個 degree = n 的多項式,不被集合內的任何元素整除,來約束所有的運算保持在一個大小內。特別的是當 p = 2 時,加法和減法是等價運算 (在 p = 2 下,1 乘法反元素是自己本身)。

AES 取 8-bits 作為運算單位的用意很多,其一反元素可以在極小空間內儲存,可以用查表的方式得到。之所以選定 p = 2 的好處在於計算機的儲存架構,若在某些特殊硬體可以支持三進位的情況下,p = 3 則會比較有效率的使用,不然取用 p = 3 在二進制的電腦架構,需要轉換的儲存單位是很沒效率,並且覆蓋的集合大小也沒辦法全部使用。

GF 有什麼好處呢?其一的道理在於加解密設計要 防止線性關係 (線性代數太邪惡,很多種攻擊可以繞過線性關係的運算,拋開未知數也能求解),對於 AES 的設計概念來說 GF 恰好符合這個條件。

AES

AES 選用$GF(2^{8})$,並且取$m(x) = x^8 + x^4 + x^3 + x + 1$ 作為模數,然後再設計一個以 GF 作為常數類型的多項式 Polynominal

$f(x) = s_{3}x^{3} + s_{2}x^{2} + s_{1}x + s_{0}$

每一個$s_{i}$ 都是一個 8-bits 的儲存單位,也就是說這個多項式是 32-bits 儲存。並且取用$m(x) = x^4 + 1$ 作為多項式的模數。AES 藉由 多項式相乘 ,將 4 個 8-bits 的資料交互影響產生出新的 4 個 8-bits,這在密碼學裡面造成 雪崩效應

跟之前講的一樣,GF 一定存在反操作,也就是乘法反元素,因此取用$03 x^{3} + 01 x^{2} + 01 x^{1} + 02$ 其乘法反元素為$0B x^{3} + 0D x^{2} + 09 x^{1} + 0E$

接著,寫一個程式驗證反元素的計算吧!

備註:GF 裡面套用 GF 相當有趣,感覺可以無限擴充大小,當然任意質數也可以找反元素,但也只有 梅森質數 比較適合在電腦二進制系統中吧?

Sample Input

1
no input

Sample Output

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
00 01 8D F6 CB 52 7B D1 E8 4F 29 C0 B0 E1 E5 C7
74 B4 AA 4B 99 2B 60 5F 58 3F FD CC FF 40 EE B2
3A 6E 5A F1 55 4D A8 C9 C1 0A 98 15 30 44 A2 C2
2C 45 92 6C F3 39 66 42 F2 35 20 6F 77 BB 59 19
1D FE 37 67 2D 31 F5 69 A7 64 AB 13 54 25 E9 09
ED 5C 05 CA 4C 24 87 BF 18 3E 22 F0 51 EC 61 17
16 5E AF D3 49 A6 36 43 F4 47 91 DF 33 93 21 3B
79 B7 97 85 10 B5 BA 3C B6 70 D0 06 A1 FA 81 82
83 7E 7F 80 96 73 BE 56 9B 9E 95 D9 F7 02 B9 A4
DE 6A 32 6D D8 8A 84 72 2A 14 9F 88 F9 DC 89 9A
FB 7C 2E C3 8F B8 65 48 26 C8 12 4A CE E7 D2 62
0C E0 1F EF 11 75 78 71 A5 8E 76 3D BD BC 86 57
0B 28 2F A3 DA D4 E4 0F A9 27 53 04 1B FC AC E6
7A 07 AE 63 C5 DB E2 EA 94 8B C4 D5 9D F8 90 6B
B1 0D D6 EB C6 0E CF AD 08 4E D7 E3 5D 50 1E B3
5B 23 38 34 68 46 03 8C DD 9C 7D A0 CD 1A 41 1C
03 x^3 + 01 x^2 + 01 x^1 + 02 x^0
0B x^3 + 0D x^2 + 09 x^1 + 0E x^0
00 x^3 + 00 x^2 + 00 x^1 + 01 x^0
0B x^3 + 0D x^2 + 09 x^1 + 0E x^0

Solution

暴力實作,模擬運算,不考慮電路架構,用最樸素的方式儲存每一個欄位。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
#include <stdio.h>
#include <string.h>
// in AES, GF(2^8), m(x) = x^8 + x^4 + x^3 + x + 1
class GaloisField {
public:
unsigned char v[32];
int n;
GaloisField() {
n = 8;
memset(v, 0, sizeof(v));
}
GaloisField(int val) {
n = 8;
memset(v, 0, sizeof(v));
for (int i = 0; i < 8; i++)
v[i] = (val>>i)&1;
}
GaloisField(const int a[], int an) {
memset(v, 0, sizeof(v));
n = 8;
for (int i = 0; i <= an; i++)
v[i] = a[i];
}
GaloisField operator+(const GaloisField &a) const {
GaloisField r;
for (int i = 0; i <= r.n; i++)
r.v[i] = v[i] xor a.v[i];
r.normal();
return r;
}
GaloisField operator-(const GaloisField &a) const {
return (*this) + a;
}
GaloisField operator*(const GaloisField &a) const {
GaloisField r;
for (int i = 0; i <= n; i++)
for (int j = 0; j <= a.n; j++)
r.v[i+j] = r.v[i+j] xor (v[i] and a.v[j]);
r.normal();
return r;
}
GaloisField shift(int sn) const {
GaloisField r;
for (int i = 0; i < n; i++)
r.v[i + sn] = v[i];
return r;
}
bool operator<(const GaloisField &a) const {
for (int i = 16; i >= 0; i--) {
if (v[i] == 1 && a.v[i] == 1)
return true;
if (v[i] == 1 && a.v[i] == 0)
return false;
if (v[i] == 0 && a.v[i] == 1)
return false;
}
return false;
}
GaloisField operator/(const GaloisField &a) const {
for (int i = 16; i >= 0; i--) {
if (a.v[i] == 1 && v[i] == 0)
return GaloisField();
if (a.v[i] == 0 && v[i] == 1)
break;
}
GaloisField r, b = (*this), c;
for (int i = n; i >= 0; i--) {
c = a.shift(i);
if (c < b) {
r.v[i] = 1;
for (int j = 16; j >= 0; j--)
b.v[j] = b.v[j] xor c.v[j];
}
}
r.normal();
return r;
}
GaloisField operator%(const GaloisField &a) const {
GaloisField ret = (*this) - (*this) / a * a;
return ret;
}
bool isZero() const {
for (int i = 16; i >= 0; i--)
if (v[i]) return 0;
return 1;
}
GaloisField inverse() {
const int m[] = {1, 1, 0, 1, 1, 0, 0, 0, 1}, mn = 8; // m(x) = x^8 + x^4 + x^3 + x + 1
GaloisField y(m, mn);
GaloisField g, a, b;
exgcd((*this), y, g, a, b); // a x + b y = g
return a;
}
void exgcd(GaloisField x, GaloisField y, GaloisField &g, GaloisField &a, GaloisField &b) {
if (y.isZero()) {
g = x, a = GaloisField(1), b = GaloisField(0);
} else {
exgcd(y, x%y, g, b, a), b = b - (x / y) * a;
}
}
void normal() {
const int m[] = {1, 1, 0, 1, 1, 0, 0, 0, 1}, mn = 8; // m(x) = x^8 + x^4 + x^3 + x + 1
for (int i = 16; i - mn >= 0; i--) {
if (v[i] == 1) {
for (int j = mn, k = i; j >= 0; j--, k--)
v[k] = v[k] xor (m[j]);
}
}
}
void print() const {
for (int i = 7; i >= 0; i--) {
printf("%d", v[i]);
if (i%4 == 0) printf(" ");
}
puts("");
}
int getHbits() const {
return v[7]<<3 | v[6]<<2 | v[5]<<1 | v[4];
}
int getLbits() const {
return v[3]<<3 | v[2]<<2 | v[1]<<1 | v[0];
}
};
void testGF() {
int va[] = {1, 1, 1, 0, 1, 1, 0, 0};
int vb[] = {0, 1, 0, 0, 0, 0, 1, 0};
for (int i = 0; i < 256; i++) {
GaloisField a(i);
GaloisField b = a.inverse();
printf("%X%X ", b.getHbits(), b.getLbits());
if (i%16 == 15) puts("");
}
}
class GF_Polynominal {
public:
GaloisField v[32];
int n;
GF_Polynominal() {
n = 4;
for (int i = 0; i < 16; i++)
v[i] = GaloisField();
}
GF_Polynominal(const GaloisField a[], int an) {
n = 4;
for (int i = 0; i <= an; i++)
v[i] = a[i];
}
GF_Polynominal operator+(const GF_Polynominal &a) const {
GF_Polynominal r;
for (int i = 0; i <= r.n; i++)
r.v[i] = v[i] + a.v[i];
r.normal();
return r;
}
GF_Polynominal operator-(const GF_Polynominal &a) const {
return (*this) + a;
}
GF_Polynominal operator*(const GF_Polynominal &a) const {
GF_Polynominal r;
for (int i = 0; i <= n; i++)
for (int j = 0; j <= a.n; j++)
r.v[i+j] = r.v[i+j] + (v[i] * a.v[j]);
r.normal();
return r;
}
GF_Polynominal shift(int sn) const {
GF_Polynominal r;
for (int i = 0; i < n; i++)
r.v[i + sn] = v[i];
return r;
}
bool operator<(const GF_Polynominal &a) const {
for (int i = 8; i >= 0; i--) {
if (!v[i].isZero() && !a.v[i].isZero())
return true;
if (v[i].isZero() != a.v[i].isZero())
return false;
}
return false;
}
GF_Polynominal operator/(const GF_Polynominal &a) const {
for (int i = 8; i >= 0; i--) {
if (!a.v[i].isZero() && v[i].isZero())
return GF_Polynominal();
if (a.v[i].isZero() && !v[i].isZero())
break;
}
GF_Polynominal r, b = (*this), c;
for (int i = n; i >= 0; i--) {
c = a.shift(i);
if (c < b) {
GaloisField t, x, y;
for (int j = 16; j >= 0; j--) {
if (!c.v[j].isZero()) {
y = c.v[j], x = b.v[j];
break;
}
}
t = y.inverse() * x;
// b.print();
// c.print();
// printf("gg %d\n", i);
// y.print();
// x.print();
// y.inverse().print();
// t.print();
r.v[i] = t;
for (int j = 8; j >= 0; j--)
b.v[j] = b.v[j] - c.v[j] * t;
}
}
// printf("---> mod "); b.print();
// puts("");
// puts("div begin");
// print();
// a.print();
// r.print();
// (r * a).print();
// (r * a + b).print();
// puts("div end\n");
r.normal();
return r;
}
GF_Polynominal operator%(const GF_Polynominal &a) const {
GF_Polynominal ret = (*this) - (*this) / a * a;
return ret;
}
bool isZero() {
for (int i = 8; i >= 0; i--)
if (!v[i].isZero()) return 0;
return 1;
}
GF_Polynominal inverse() {
const GaloisField m[] = {GaloisField(1), GaloisField(0), GaloisField(0), GaloisField(0), GaloisField(1)};
const int mn = 4; // m(x) = x^4 + 1
GF_Polynominal y(m, mn);
GF_Polynominal g, a, b;
exgcd((*this), y, g, a, b); // a x + b y = g
return a / g;
}
void exgcd(GF_Polynominal x, GF_Polynominal y, GF_Polynominal &g, GF_Polynominal &a, GF_Polynominal &b) {
// puts("exgcd -----------------");
// x.print();
// y.print();
// getchar();
if (y.isZero()) {
const GaloisField m1[] = {GaloisField(1)};
const GaloisField m0[] = {GaloisField(0)};
g = x, a = GF_Polynominal(m1, 1), b = GF_Polynominal(m0, 1);
// a = g.inverse();
} else {
exgcd(y, x%y, g, b, a), b = b - (x / y) * a;
}
}
void normal() {
const GaloisField m[] = {GaloisField(1), GaloisField(0), GaloisField(0), GaloisField(0), GaloisField(1)};
const int mn = 4; // m(x) = x^4 + 1
for (int i = 16; i - mn >= 0; i--) {
if (!v[i].isZero()) {
GaloisField t = v[i];
for (int j = mn, k = i; j >= 0; j--, k--)
v[k] = v[k] - (m[j] * t);
}
}
}
void print() const {
for (int i = 3; i >= 0; i--) {
printf("%X%X ", v[i].getHbits(), v[i].getLbits());
printf("x^%d", i);
if (i) printf(" + ");
}
puts("");
}
};
void testPoly() {
const GaloisField m[] = {GaloisField(2), GaloisField(1), GaloisField(1), GaloisField(3)};
const GaloisField m2[] = {GaloisField(14), GaloisField(9), GaloisField(13), GaloisField(11)};
const int mn = 3, mn2 = 3;
GF_Polynominal a(m, mn), b(m2, mn2);
a.print();
b.print();
GF_Polynominal c = a * b;
c.print();
GF_Polynominal d = a.inverse();
d.print();
}
int main() {
testGF();
testPoly();
return 0;
}
Read More +

資訊安全 小考筆記

Problem

  1. Follow

    1. What is a monoalphabetic cipher ?
    2. How large is the key space of the monoalphabetic cipher applied to English (just consider lower case letters) ?
    3. What is the main security weakness of a monoalphabetic cipher ?
    4. Please provide at least 4 approaches to prevent the above weakness.
  2. Block ciphers process messages in blocks like an extremely large substitution, but this is very difficult to implement for a very big block size. What is Shannon’s idea to realize a block cipher with big block size ?

  3. The S-box of DES round operation is not invertable, but why DES can decrypt ?

  4. Follow

    1. Please explain the OFB mode.
    2. In the OFB mode, we never reuse the same sequence (key+IV). If we reuse the key, then the attacker can recover message. Please describe very precisely (mathematiclly with symbols) how the attack works.
  5. Please compare the CFB mode the OFB mode by providing a table indicating at least 5 of their advantage and corresponding disadvantage.

  6. This question is about issues of random access of encryption and decryption. Define notations or symbols you need before providing your answer. Please describe how to use CFB mode and CTR mode to randomly encrypt and decrypt a file Why OFB mode is inappropriate to randomly encrypt and decrypt a file?

  7. Describe the details (as much as you remember) of AES operation and describe how efficiently implement AES on an 8-bit CPU ?

  8. How avalanche happens in AES within the first tow rounds ?

Notes

Part 1

monoalphabetic cipher 簡單來說比凱薩加密難一點,從每個字母都 shift 固定的數量來說,變成變動式的。換句話說就是單純的英文字母替換 (substitute)。由於要維持可逆的解密,替換必須符合一對一,所以方法數為 26! = 403291461126605635584000000

但這種替換方式容易受到語言統計的攻擊,也就是說在英文的特性中,不是每個字母都出現相同的頻率,因為很多冗詞的使用,導致有些字母會特別多。也因此在找對應時,可以藉由這一個觀點,反向查找可能的替換,大幅度地降低搜索可能,讓解密變得相當容易。

為了解決這一語言統計的攻擊,可以藉由

  • 壓縮明文,破壞語言特性,但是壓縮算法有儲存的字典部分,仍可能發生字典結構被攻擊,進而進行解壓縮。
  • 增加垃圾字,撥點冗詞穿插在其中,把頻率不均的問題消彌。
  • 多個字符一起加密,相對於單一字母的替換,可以同時替換兩個以上,如 AA -> WT 之類的。
  • 使用多種替換,在不同時刻使用不同的替換表,同樣地可以把頻率問題解決。
  • 參照後續區段加密的一些技巧,如 CFB、OFB … 等,讓替換表進行變動。

Part 2

區段加密具有相當大的強度,當一次加密 64 bits 時,可以達到的對應種類高達 (2^64)!,沒有辦法將這種表格存放在記憶體,因為也要消耗 2^64 bits。

因此有 Shannon’s idea,利用 substitution (S-box)、permutation (P-box) 來完成對應,藉由 S-P 的組合,提供 混淆(confusion) 和 差異 (diffusion)。組合的效應遠比想像中的還大,儘管組合的方法數遠小於 (2^64)!,連兆分之一都不到,但簡單的概念可以在 64KB 記憶體大小內完成,效應上算相當划算。

Part 3

DES 的 S-box 屬於不可逆的操作 (8-bits to 6-bits),然而 DES 在解密時,不需要將 S-box 往回推導,也就是不需要逆向操作,因為加密的 key 來自於 master key 和另一段的訊息 L(i) ,最後用 key 加密 R(i) 得到 L(i+1)。解密時,只需要將 R(i+1) (L(i) 會變成 S(i+1))帶入 S-box,就能重新產生出 key。

至於 DES 為什麼可以正確加解密,定義對於所有的任意明文 A, B,產生的密文 E(A) != E(B)。若明文差異在 L(i),則在 R(i+1) 一定會不同。若明文差異在 R(i),則在 key 相同,做 L(i+1) = R(i) XOR key 時,L(i+1) 也必定會不同。

Part 4

$$O_{i} = E_{k}(O_{i-1}); O_{-1} = IV \\ C_{i} = P_{i} \text{ XOR } O_{i}$$

為什麼 OFB 不能重新使用 key + IV 呢?原因是因為 已知明文攻擊 (Known plaintext attack) 。假設每一天都重新啟動,那麼攻擊者可以在事後得到密文對應的明文 (可能隔天才知道,儘管對應仍然是很難的),那麼可以藉由數學概念來完成解密,無須考慮 key 是什麼內容。

$$C_{i} = P_{i} \text{ XOR } O_{i} \\ C_{j} = P_{j} \text{ XOR } O_{i} \\ C_{i} \text{ XOR } C_{j} = P_{i} \text{ XOR } P_{j}$$

假設 i 和 j 重複使用 key,那麼會發生已知密文$C_{i}, C_{j}$ (傳輸上一定會被發現) 和已知明文$P_{i}$,只要夾擊做 XOR,就可以直接得到$P_{j}$,當已知明文相當長時,竊取的效果就越好。

Part 5

比較 CFB 和 OFB。

特性\模式 CFB OFB
自同步 (self-synchronization) 不可
錯誤擴散 (error propagation)
預先計算 (preprocess key) 不可
隨機存取 (random access) 不可
資訊安全性 (message security)
  • 自同步 (self-synchronization) ,不用告知對方加密狀態,可以藉由數次的傳輸訊息,自動地將兩邊的狀態一致,在此之前會造成一段雜訊。斷線時,不必重複使用 IV 讓兩邊同步 (狀態相同時,才能正確解密)。
  • 錯誤擴散 (error propagation) ,也因為自同步的設計,導致在同步前都會有雜訊,或者在訊息被攻擊者竄改時,會影響該週期的狀態 ($C_{i-k}, C_{i-k+1}, ..., C_{i-1}$ )。
  • 預先計算 (preprocess key) ,預先計算 key 可以加快加解密速度,同時便可支持平行運算,這原因是因為 message-independent/dependent 之間的差異,狀態不依靠正在傳遞的訊息時,就可以預先處理。
  • 隨機存取 (random access) ,當要解析某個密文時,CFB 可以往前查找密文$C_{i-k}, C_{i-k+1}, ..., C_{i-1}$,得到當前的解密器所需要的狀態,放上 master key 就能進行解密。OFB 辦不到這一點,狀態不依賴訊息,那就要知道當前是哪個回合,從 IV 開始推導狀態,若密文在第 n 個位置,需要 O(n) 的時間來得到狀態,相對於 CFB 的 O(k) = O(1)來說相當耗時。
  • 資訊安全性 (message security) ,由於狀態與訊息獨立,會導致被攻擊者竄改內容時不易發現。在 CFB 中,由於依賴傳遞的訊息,當攻擊者竄改某個密文時會造成錯誤擴散,影響的解密時的明文不只一個,這也讓安全性提高。可以說是一體兩面的特性。

Part 6

  • CFB 狀態為 master key +$C_{i-k}, C_{i-k+1}, ..., C_{i-1}$
  • CTR 狀態為 master key + counter

CFB 解密某個密文時,往前查找密文即可解密。CTR 知道密文 offset 便可得到 counter。在獲得資訊上都是 O(k) 常數,因此支持隨機存取。

OFB 辦不到這一點,狀態不依賴訊息,那就要知道當前是哪個回合,從 IV 開始推導狀態,若密文在第 n 個位置,需要 O(n) 的時間來得到狀態,相對於 CFB 的 O(k) = O(1)來說相當耗時。

CFB 和 CTR 到底誰的隨機存取能力好呢?若檔案儲存會切割成數個,那 CFB 的隨機存取能力就更高一點。CTR 必須計算 offset,相較於 CFB 的紀錄架構會稍微地麻煩。

Part 7

AES 的計算結構都落在 GF(2^8),一個 cell 的內容都是 GF(2^8)

  • substitue 需要 8-bits to 8-bits
  • shift rows 對於 8-bit 關聯不大 (移動記憶體的位置)
  • mixColume 上是 8-bits x 8-bits
  • add round key 對於每一個 cell XOR 8-bit keys

因此 AES 可以在 8-bits CPU 上有更好的實作效能,所需要的 clock cycle 會比較短。

Part 8

假設有兩個明文的 漢明距離 (Hamming distance) 為 1,在 128 bits 中有一個 1 bits 不同,意即$H(P, Q) = 1$

Step\Round Round 1 Round 2
Substitue bytes 4 bits 16 bits
Shift rows 4 bits 16 bits
Mix Columes 16 bits 64 bits
Add Round key 16 bits 64 bits
  • 在 Substitue bytes 步驟時,S-box 會設計成期望當有一個 1-bits 不同,則替換出來的結果會有 4-bits 不同 (一個 cell 具有 8-bits。替換 8-bits 時,差異最少 0 bits、最多 8-bits,期望值是 4-bits)。
  • 在 Shift rows 步驟時,單純移動 cell 不影響差異。
  • 在 Mix Columes 步驟時,每一個 colume 會根據上一個 colume 的 4 個元素相互影響,因此會增加 4 倍。
  • 在 Add Round key 步驟時,由於 XOR 相同的 key,因此差異並不會改變。

最後,在 Round 2 時,能得到平均 64 bits 的差異。加密的明文一次 128 bits,差異期望值也就是一半的情況 64 bits,因此很快地就能達到期望的差異性。在隨後的 Round X 中,差異會在 64-bits 上下浮動都是有可能的。

Read More +

Game Maker 遊戲介面設計

前言

學校課程番外篇,有興趣者可以查閱 Github

本文

本課程一開始著重 尼爾森法則 的介面設計,不只是在網頁操作等介面設計,雖然遊戲沒有複雜的狀態跟操作流程,但在設計上的操作反應、都應該要符合尼爾森法則。

Game Maker 這套軟體只是製作 UI 方便,遊戲性跟高難度設計不是很著重, 不看你的代碼或實作複雜度 。這也是本課程最弔詭的地方。Game Maker 有一個缺點,製作時的分工無法按照軟體分工的方式,實作部分代碼來完成,除非組員們都會寫 script 並且了解語法的變數存取方式。

從設計開始講起

可以從課程問卷中看到 link 幾個遵循的法則。

Visibility of system status

狀態可視有幾格要點,玩家方便知道當前狀態,例如所在關卡、遊戲模式的狀態、角色資訊的狀態、完成關卡的結算畫面 … 等。

紅框位置處表示狀態

同時在需要連續操作的完成流程,如銀行手續的設計,會顯示當前步驟進行到幾分之幾,來提示使用者其實還沒有完成所有步驟。然而在遊戲上,完成比例通常不是著重的一環,而是有哪關卡可以玩、有哪些關卡還沒去探訪過。

Match between system and the real world

主要為圖示運用,icon 對應的操作符合普遍性,通常會遇到的第一個錯誤設計是將原本用在某個地方的圖示拿來放在不應擺放的位置。例如音樂撥放器的撥放、暫停、停止、前轉、循環、 … 等,很容易在選擇上誤用箭頭的格式。

接著是在文字對應,選項的文字也要具有普遍性,符合直觀的反應文字,詞性也應選擇恰當 (當心誤用形容詞當選項文字),問題描述的正面詢問與反面詢問,反應在選擇選項時應足夠明確 (反問內容是否合理,不常見的反面詢問應該捨棄,防止使用者用既有概念進行操作)。

遊戲規則設計符合合理,當要貼切真實世界時,如物理反應與遊戲元素之間的關聯應該符合,如遊戲中運用到水和火,兩物體若發生碰撞,反應結果應符合消滅對方的關係。

User control and freedom

所謂的自由度,玩家不會被困在一本道的遊戲設計,但是在抖 M 類型的遊戲中,只要一失敗就必須從頭打起。玩家不會一直被系統帶著跑,而無法中斷、暫停遊戲,同時也表明重新步入遊戲時,可以選擇自己進行的模式。

自由度的操控有很多,客製化玩家的操作、給予玩家改變遊戲的部分設計,如鍵盤控制的改變、允許玩家更動角色的樣貌、樣式,可以更動關卡模式,例如 L4D2 可以選擇專家模式 … 等。

Consistency and standards

一致性設計,相當於風格設計。

  • 按鈕的圖示在不同狀態若具有相同功能,使用圖示相同。
  • UI 擺放位置,不常因不同模式而更動 (突然放左、突然放右。)
  • 文字字型的使用統一使用,並且區分遊戲劇情與系統介面,相同類型的文字說明應符合一致。

Error prevention

防止錯誤操作,當玩家已經在別款遊戲中擅長使用快捷鍵時,那很有可能在遊戲中使用快捷鍵操作,這可能會造成不預期的反應,如快速關閉遊戲、啟動某個遊戲的系統功能。

因此在防止錯誤,通常會用 第二次詢問 來防止。在快捷操作上,二次詢問要利用不同的快捷鍵觸發,防止連按的快速操作,如連按兩次 ESC 突然跳出遊戲的蠢事。

提示操作的後果也是相當重要,必須在文字說明上明確描述,盡可能使用簡短的句子和例子來說明操作後果。說明時著重使用者觀點,而非功能性介紹 (介紹對於使用者的感受可能會變成怎麼樣,而不去說明電腦架構的效能 … 等專業知識)。

當遊戲需要高度複雜的邏輯,導致道具使用上的 順序性會影響流程 。當玩家處於無法通關的狀態時,提示哪個步驟錯誤,同時也告知玩家應該重新挑戰。這一類型就是引導提示。

Recognition rather than recall

在遊戲功能分類上,遊戲道具的使用類型應該設計主動操作與被動操作,在欄位劃分上是其中一種設計。當空間不足與進行欄位劃分,在道具的背景、顏色上的區分是一個解決方案,例如用三角形的外框表示消耗型道具、六角形表示永久的增益型道具。 用圖示背景與位置來區分操作類型 ,防範使用者如猴子般地等待道具效果。

Flexibility and efficiency of use

操作相當具有彈性跟有效地使用!

有些遊戲需要高度複雜的組合鍵來完成一個動作,同時也要求組合鍵的有效時間。先不論組合鍵的設計,若存在組合鍵,是否符合效率使用,是否可縮減成另一個指令,當分化深度歧異過大時,考量壓縮組合鍵的長度。例如有 5 個技能是由 3 個鍵組合觸發,4 個技能是由 5 個鍵組合觸發,壓縮到 4 個鍵以內 … 等。

正常情況下,有多少使用者會直觀這麼做,組合鍵設計是否合理,是否可以藉由 系統輔助來簡化操作流程 ?這些考量將成為易上手,入門玩家最需要的部分。就如 vim 編輯器的使用,直接面向高端使用者,入門就會相當地困難。

Aesthetic and minimalist design

提示、排版設計,在 Apple 軟體看得很明顯,操作相當簡單,不會一次把很多功能塞在同一個頁面。在功能性很強的軟體,常常會把很多參數調校放在同一個頁面,而沒有做好區別與預設,即使功能性很強、軟體很好用,但很多功能反而會被忽略,由於沒有好的簡化設計,第一手想要嘗試的使用者,會跳過好幾個功能設定進行反饋。 開發者開發的功能就白費了!

盡可能讓畫面簡潔,縮減不必要的進階資訊,用額外的方式體現,設計不同的介面模式。

Help users recognize, diagnose, and recover from errors

系統發生錯誤時,是否有足夠的資訊讓使用者查覺到 不是遊戲正常設定 ,來讓使用者回報這些程式設計 Bug。在系統設計的魯棒性,不應一個 Bug 產生而造成系統崩潰,遊戲也是一樣,讓使用者返回上一個正常的狀態,不會造成卡關、或者卡關之後遊戲損毀。

復原狀態對於小遊戲設計上相當困難啊!

Game

  • 故事劇情 (Storyline)
  • 遊戲性 (GamePlay)
  • 美學圖形 (Artistic/Graphics)
  • 音效特效 (Sound/Special effects)
  • 人工智慧 (AI)

故事劇情可以結合真實部分,在真假交織下發展。

可以參考 《额外加分 Extra Credits》 《TUN高品位低调宅》 系列影片,這將會告訴你遊戲如何設計才具有特色。

下面列了兩個影片,更多可以直接去觀看 youtube 上的頻道。

其他的列點就是一種個人價值觀體現,還沒有詳細學習。

Demo

影片加速展示內容。

Github

遊戲執行檔和開源代碼都在其中,當然還有遊戲的編輯器。更多的遊戲截圖在裡頭,只支持 windows 平台。

Read More +

區段加密筆記

本篇筆記,僅為個人淺見

什麼是區段加密

先了解 stream ciphers 和 block ciphers 的差異

  • stream ciphers 特別在於加密用的 key 不斷地變更,並且以極少數的情況下重複使用,每一次加密針對一個 byte 或者是 bit 進行加密。加解密的兩方,可以同時產生出相同 random key。

  • block ciphers 只用同一份 key,把加密文件一次用一個 block 文字進行加密,利用換位 (位置交換)、替換 (文字替換) … 等方式,讓相似內容的明文,可以產出差異極大的密文 (訊息獨立)。

從概念上,串流加密是絕對安全,如果雙方有辦法在不通訊下,可以產生出 random key,而且不重複使用 key,攻擊者會無從下手。但是現今很多 random 的產生方法仍然是演算法的數學模型,因此一定有規則。

而區段加密的好處,在於換位、替換、 … 等方式,將密文的相似度降低,即使明文長得很相似,攻擊者無法誘導相似明文的傳遞,導致 key 快速被發現,因為密文的差異性導致規則難以被破解。

加密設計基礎原則

  • confusion 困惑
    密文跟 key 的關係盡可能混亂,根據加密的方式,有可能某些 key 會造成特殊的密文規則,這種弱 key 要不不存在、要不不使用。減少攻擊者對密文的觀察,就可以找到 key。

  • diffusion 散播
    當明文相當相似時,也許只有幾個 bit 不同,產生出來的密文的差異性也要相當高,否則攻擊者可以推導加密原理,藉由 bitwise 將密文修改,讓解密者受到誤導。

Data Encryption Standard (DES)

  • 每一次加密 64 -bit 的資料,用 56 -bit 的 key。
    這是一個很詭異的現象,通常 key 的長度會比 data 的長度來得大。
  • 經過 16 回合的加密,並且每一個回合用 56 -bit 的 key 產生出 48 -bit 的 subkey 針對 64 -bit 的資料加密。
  • 加密過程會有擴充 subkey 和選擇一部分的 subkey,並且拿一部分的明文對 subkey 加密。

將明文對切成兩個部分,一部分加密 subkey,另一部分根據加密過的 subkey 進行加密。在下一個回合,交換部分明文和部分密文的位置,讓所有的明文都進入到混亂狀態。

在解密時,知道 subkey 的產生規則,然後拿部分明文,加密 subkey 後,得到部分密文的加密要件,逆推回去。這一個繁複的過程,主要是製造 confusion,而 diffusion 的部分,則是在擴充 key 和拿部分明文加密 subkey 時,發生雪崩效應,因為拿部分明文進行加密 subkey,會造成 key 差異性放大。

儘管明文相似程度很高,卻會因為處理過程將差異轉移到 subkey 很多的位置的不同,經過輪替加密。無法利用頻率的方式,找到明文差異會造成密文的哪一個部分的差異。

正確性

為什麼 DES 可以被正確解密?概念上,一個密文只能對應一個明文,這樣才符合正確解密的定義。因此不同的明文,也要產生出來不同的密文。

證明從輪替下手,部分明文 A 會保留到下一個輪替,而部分明文 A 會加密部分明文 B,假設兩個明文在 A 部分不同,則在密文部分就會不同 (因為保留),假設是 B 部分不同,加密 (XOR 加密) 後也會不同。數學歸納法得證。

加密強度分析

因為 subkey 產生方式和換位、替換的規格是明定,與 key 無關。因此 key 長短將影響加密的強度,從現在分析 56 -bit 在數個小時內就會被解出來。

為什麼 subkey 產生方式和換位、替換的規格是明定?
因為雪崩效應的造成需要某些放大效果,因此表格要符合某些設計規則。

攻擊方法

  • Timing Attacks 加密時間攻擊,因為電腦運算的速度受輸入要件影響,如果 bit 變換數大,會導致加密時間拉長,藉以分析明文。

  • Power Attacks 偵測能源消耗,因為運算所需要的能量不同,隨著時間能到得到能源使用圖,就能分析加密過程的情況。也有為了防止這種偵測,考慮將所有運算做得一樣耗電,這有可能本末倒置。

  • Analytic Attacks 分析攻擊,從統計學的角度進行攻擊,從密文差異下手、從已知密文、明文解方程式、key 與加密結果的關聯性 … 等。

Block mode

ECB

Electronic CodeBook (ECB),不變的 key,需要加密器和解密器,加解密的複雜度可能不同。

  • 優點:
    構造簡單、容易實做
  • 缺點:
    長時間下,容易被偵測。影像資料的差異性不大,很容易被辨識到重複性,相較於文字很容易受前後文的影響。

CBC

Cipher Block Chaining (CBC),不變的 key,以及前一個密文會先針對明文加密。

  • 優點:
    相同明文,會因為前一個的密文不同造就出不同的密文,也就是加密器多一個新的狀態。
  • 缺點:
    • 一個密文 Ci 的錯誤,會導致兩個明文解析錯誤 (Pi & Pi+1)。
    • 第一次加密很容易被抽換 bitwise,因為每次驅動的 Initial Vector 都相同。

CFB

Cipher FeedBack (CFB),類似 CBC,但前一個密文的結果只影響一部分的加密關係,然後將前一段密文狀態加密 key,再對明文加密。

  • 優點:
    • 支持即時 (real-time) 通訊
    • 只需要加密器,加密做兩次相當於解密。
    • 支持自同步 (self-synchronization),即使中斷連線、訊息錯誤,可以在數個週期後再次同步運作。
    • 藉由自同步的概念,可以捨棄掉 Initial Vector。
    • 後半部的明文,可以透過週期性的部分密文建立解密狀態,支持 random access。
  • 缺點:
    • error propagation 錯誤增長,當一個訊息錯誤時,需要好幾個週期後才能修正回來,這導致中間的解密訊息都不能用。
    • 雜訊過多的情況下,不宜使用。

OFB

Output FeedBack (OFB),類似於 CFB,將前一段的加密 key 拿回來加密,不依賴接收的密文狀態。

  • 優點:
    • 支持即時 (real-time) 通訊
    • 只需要加密器,加密做兩次相當於解密。
    • 相較於 CFB,沒有錯誤增長的情況。
    • 依序使用的 key,可以事先算出來,然後依次使用。
    • 雜訊下支持的能力好。
  • 缺點:
    • 必須一直保持同步
    • 訊息被修改時,不易被發現,只單純影響單一明文 (沒有錯誤增長)。
    • 起始狀態的 Initial Vector,不能重複使用,否則很容易被攻擊者抓到。
    • 加設沒有預先算 key,沒辦法解密出後半部的明文。

CTR

Counter (CTR),類似於 OFB,直接利用計數器作為加密 key。

  • 優點:
    • 加解密可以平行化處理,如果加解密速度耗時,可以選擇這一種。
    • 支持 random access。
  • 缺點:
    • 必須一直保持同步
    • 訊息被修改時,不易被發現,只單純影響單一明文 (沒有錯誤增長)。
    • 起始狀態的 Initial Vector,不能重複使用,否則很容易被攻擊者抓到。
Read More +