Twofish 128bit的分組密碼

2021-08-19 08:04:44 字數 3599 閱讀 8416

1twofish密碼概述

twofish分組密碼是bruce schneier等人提交給aes的成果,作為5個候選密碼的其中一種。它符合所有nist的標準--128位明文資料; 128位,192,256位可變金鑰長度;在各種平台上高效;等等它可用於設計具有各種同步和錯誤擴充套件屬性的流密碼

,單向雜湊函式,訊息認證碼(mac)和偽隨機數生成器.twofish分組密碼是基於雙射f函式的16輪feistel網路。其中f函式由四個與金鑰相關的乘8位s盒,乙個gf(2

8)上的固定4乘4最大距離可分離矩陣(mds),偽hadamard變換,按位旋轉和精心設計的金鑰表構成

。twofish的密碼的設計符合nidt的aes設計標準具體來說,它們是:

(1)128位對稱分組密碼

(2)金鑰長度可為128位,192位和256位

(3)沒有弱鍵

(4)無論是在inter pentium pro(奔騰)還是其他軟體和硬體平台上都高效

(5)設計靈活:可以接受額外的金鑰長度(對於上面沒有定義的金鑰大小,金鑰在末尾用零位元組填充到定義的下乙個更大的長度);並適用於流密碼,單向雜湊函式和mac

(6)具有可變輪數的變體

(7)設計簡單,既便於分析,又便於實施

twofish的密碼實現的目標如下:

(1)少於2

80個選擇的明文和2

n(n是金鑰長度)時間時,16輪twofish(無輸出處理)應該沒有選擇明文攻擊(selected-plaintext attack)

(2)少於264個選擇的明文和2n / 2(n是金鑰長度)時間時,12輪twofish(無輸出處理)應該沒有相關金鑰攻擊(related-key attcak)

2twofish密碼的相關技術

2.1feistel網路

fiestel網路是一種將任何函式(通常稱為˚f函式)轉換為置換的常規方法,它是絕大部分分組密碼演算法的基礎。

。fiestel網路的基本組成部分是˚f函式,f函式是輸入字串到輸出字串之間的基於金鑰的對映通常˚f函式是非線性的並且可能不是滿射:

f: n / 2× n→ n / 2

其中ñ是fiestel網路中的分組大小,f函式將n / 2位的分組以及ñ位金鑰作為輸入,產生乙個n / 2個位的輸出。在每一次迭代中,源分組作為˚f函式的輸入,同時˚f函式的輸出與目標分組進行異或運算,之後,這兩個分組交換位置進入到下一輪當中。

twofish的使用的就是乙個使用雙射˚f函式的擴充套件feistel網路。

2.2s盒

s盒是乙個用於絕大多數分組密碼演算法中的表驅動非線性置換操作.twofish使用四個不同的,雙射的基於金鑰的8×8的s盒,這些s盒使用兩個固定的8×8位置換和金鑰構建。

2.3mds矩陣

在乙個域上的最大距離差分(mds)編碼是乙個從a元素到b元素的線性對映,它產生了乙個a + b元素的復合向量,它的性質是對任何的非零向量中的非零元素的最小數目最少是b +1。也就是說,任何兩個有mds對映產生的不同向量之間的「距離」(不同元素的數目)至少是b +1。很容易就可以得出這兩個不同向量之間沒有對映可以有更大的最小舉例.mds對映可以通過有a×b元素組成的mds矩陣表示。乙個a×b矩陣是mds的充分條件是所有通過丟棄行或列獲得的正子矩陣都是非奇異的。

在twofish中,使用了乙個基於gf(2

8)的4×4的mds矩陣。

2.4偽阿達瑪變換

給出兩個輸入a和b,32位的pht運算的形式如下:乙個可以在軟體中快速執行的簡單的混合操作。

a'=(a + b)mod 2

32b'=(a + 2b)mod 2

32twofish使用32位的pht混合來自兩個並行g函式的輸出。

2.5whitening

美白是一項在第一次迭代之前和最後一次迭代之後對金鑰進行異或運算的技術。此技術充分的提高了搜尋金鑰攻擊的複雜性。

twofish在第一次feistel迭代之前對128位的子鑰進行異或,並在最後一次feistel迭代中對另128位子進行同樣的運算。這些子鑰按照與迭代中的子鑰相同的方法進行計算,但不用在加密的其他過程之中。

2.6金鑰產生

金鑰產生的意思是將金鑰轉化為加密過程需要使用的迭代金鑰.twofish需要大量的金鑰資訊並使用一種複雜的金鑰產生方法。為了便於分析金鑰產生使用了與迭代函式同樣原始的函式。

3twofish基本原理

twofish 使用了 16 輪 feistel 結構迭代並在輸入輸出部分附加了whitening技術。 唯一的非 feistel 元素是一位迴圈移位操作。這種迴圈移位操作可以移入到 f 函式之中, 這樣的網路就成為了乙個純粹的 feistel 網路。 但這樣做就需要在輸出序列進行whitening處理之前附加進行一次字迴圈移位。

twofish演算法的全過程如下圖1所示:

明文被分成了32位一組的四個部分,它們分別與四個金鑰字進行異或,在whitening完成後接下來進行16次迭代運算。在每一次迭代的過程中,左邊的兩個字用來作為g函式的輸入(其中之一首先進行8位的迴圈左移位)。g函式由4個8 × 8的基於金鑰的s盒組成,之後是乙個基於mds矩陣的非線性的混合。兩個g函式的結果使用pht進行結合,並新增兩個金鑰字。這個兩個結果與在右方的兩個部分進行異或。右方的這兩組字串乙個在異或前迴圈左移1位,另乙個在異或後迴圈右移1位。之後,左右兩個部分進行交換,再進入到下一次的迭代當中。經過所有迭代後,最後一次迭代不進行交換。然後的四組字串分別與另外四個密碼字串進行異或操作。經過以上步驟後,產生與明文相對應的密文。

圖1 twofish演算法流程圖

具體來講,首先16個位元組的明文p0,…,p15被分成4個32位的字p0,…,p5,使用小端規範:

在輸入whitening處理階段,這些字與擴充套件的4個金鑰字進行異或:

在16輪的每一輪中,前面的兩個字作為f函式的輸入(輪數也作為輸入)。第三個字與f函式的第乙個輸出進行異或,然後迴圈右移1位;第四個字迴圈左移1位之後與f函式的第二個輸出進行異或。然後,交換左右部分的位置。

這個步驟如下:

ror和rol函式是將其第乙個引數(乙個32位字)迴圈右移或迴圈左移其第二個引數的位數的函式。

最後一輪的輸出不進行交換直接與四個擴充套件金鑰字進行異或而得到密文c:

這4個字的密文最後被儲存為16個位元組c

0,...,c

15,使用與明文相同的小端規範:

3.1函式˚f

函式˚f是64位值上與金鑰相關的置換.f函式具有三個引數,兩個輸入字r0,r1及用於選擇子項的輪數ř步驟如下:

3.2函式克

函式克構成了twofish的的核心。輸入字x被分為4個位元組,每個位元組通過自己的金鑰相關小號盒.s盒是雙射的,8位輸入8位輸出。這四個結果被解釋為

gf(2

8)上長度為4的向量,並乘以4×4的mds矩陣,得到的向量是g函式結果(32位字)。

是與金鑰相關的小號盒,z是克函式的結果。

12月12日作業

第二道 package 作業第二道 3 設計四個類,分別如下 必做題 設計shape表示圖形類,有面積屬性area 周長屬性per,顏色屬性color,有兩個構造方法 乙個是預設的 乙個是為顏色賦值的 還有3個抽象方法,分別是 getarea計算面積 getper計算周長 showall輸出所有資訊...

12月12日感悟續

寫完dty和auta,後面我再寫一些目前自己的工作和生活方面的事情。花了大概有1個月在看 高效人士的七種習慣 了,基本上對個人的部分看的差不多了吧,個人的三個習慣分別是 1.人擁有創造自己生活的能力 2.人應該先構思出自己想要的生活 3.人可以高效管理好自己的生活 目前我的想法是 我已經明白了第一點...

第12周 專案1(2)

問題及 檔名稱 main.cpp 作 者 賈慶嚴 完成日期 2016年6月15日 版 本 號 v1.0 問題描述 用類的成員函式,定義複數類過載運算子 使之能用於複數的加減乘除 include using namespace std class complex complex double r,do...