久久国产成人av_抖音国产毛片_a片网站免费观看_A片无码播放手机在线观看,色五月在线观看,亚洲精品m在线观看,女人自慰的免费网址,悠悠在线观看精品视频,一级日本片免费的,亚洲精品久,国产精品成人久久久久久久

分享

chacha20

 dbn9981 2020-01-30

折疊 ChaCha20

ChaCha系列流密碼,作為salsa密碼的改良版,,具有更強的抵抗密碼分析攻擊的特性,,"20"表示該算法有20輪的加密計算。

由于是流密碼,,故以字節(jié)為單位進行加密,,安全性的關(guān)鍵體現(xiàn)在密鑰流生成的過程,即所依賴的偽隨機數(shù)生成器(PRNG)的強度,,加密過程即是將密鑰流與明文逐字節(jié)異或得到密文,,反之,,解密是將密文再與密鑰流做一次異或運算得到明文,。

算法過程 :

(1)ChaCha20的初始矩陣

ChaCha20有一個初始矩陣,矩陣的輸入為一個256位的密鑰,、64位隨機數(shù),、64位計數(shù)器值以及4×32位的常數(shù),它們均填充在32位整型數(shù)組中作為初始矩陣,。排列方式如下,。

0x61707865 0x3320646e 0x79622d32 0x6b206574

Key[0] Key[1] Key[2] Key[3]

Key[4] Key[5] Key[6] Key[7]

Counter[0] Counter[1] nonce[0] nonce[1]

這里256位密鑰即流密碼的初始密鑰,常數(shù)為通信雙方在握手協(xié)議中協(xié)商的定值,,計數(shù)器值取一個從0開始每次自增1的寄存器(64位)中的值,,隨機數(shù)為偽隨機數(shù)生成器產(chǎn)生,每次生成密鑰矩陣時產(chǎn)生不同的隨機數(shù),。

(2)初始矩陣置換

ChaCha20算法有20輪運算,,其中奇數(shù)輪次與偶數(shù)輪次在執(zhí)行輪函數(shù)前需要分別經(jīng)過行置換和列置換,故20輪運算可以看作10次迭代,,每次迭代先做行置換再做列置換,,具體置換方法如下:

我們將初始矩陣存儲在一個4×4的數(shù)組X中,數(shù)組編號從0到15,,初始矩陣表示為:

X[0],,X[1],X[2],,X[3],,

X[4],X[5],,X[6],,X[7],

X[8],,X[9],X[A],,X[B],,

X[C],X[D],,X[E],,X[F]

經(jīng)過行置換(奇次)后:

X[0],X[4],,X[8],,X[C],

X[1],,X[5],,X[9],X[D],,

X[2],,X[6],X[A],,X[E],,

X[3],X[7],,X[B],,X[F]

經(jīng)過列置換(偶次)后:

X[0],X[5],,X[A],,X[F],

X[1],,X[6],,X[B],X[C],,

X[2],,X[7],X[8],,X[D],,

X[3],X[4],,X[9],,X[E]

(3)輪函數(shù)

在矩陣每次完成置換后,都需要執(zhí)行一次輪函數(shù)QUARTERROUND,,該函數(shù)輸入為4個32位串,,即4個數(shù)組中的元素,,輸出同樣也為4個32位串,這樣執(zhí)行完輪函數(shù)后除了數(shù)據(jù)以外,,矩陣結(jié)構(gòu)未發(fā)生任何變化,,這里拿第一次行置換后的矩陣執(zhí)行輪函數(shù)舉例,執(zhí)行輪函數(shù)操作如下,。

QUARTERROUND(X[0],,X[4],X[8],,X[C]);

QUARTERROUND(X[1],,X[5],X[9],,X[D]);

QUARTERROUND(X[2],,X[6],X[A],,X[E]);

QUARTERROUND(X[3],,X[7],X[B],,X[F]);

輪函數(shù)具體實施步驟,,這里我令輪函數(shù)4個輸入分別是a,,b,,c,d,,經(jīng)過一系列變換后得到輸出a,,b,c,,d(更新后的),,過程如下:

a+=b;d^=a;d<<<16;

c+=d;b^=c;b<<<12;

a+=b;d^=a;d<<<8;

c+=d;b^=c;b<<<7;

這里"+"是按位邏輯加,"^"是按位異或,,"<<<"是循環(huán)左移,。經(jīng)過輪函數(shù)變換后得到一個新的矩陣,新矩陣再進行列置換,,然后在執(zhí)行輪函數(shù),,到此,初始矩陣已經(jīng)執(zhí)行過一次行置換,、一次列置換以及兩次輪函數(shù),,完成了一輪迭代即兩個周期。

關(guān)于輪函數(shù)里的計算操作,,舉個例子,,這里令a=0x 11111111,,b=0x 01020304,

c=0x 77777777,,d=0x 01234567,,然后我們分別執(zhí)行"+""^""<<<"運算如下:

c=c+d=0x 77777777+0x 01234567=0x 789abcde;

b=b^c=0x 01020304^0x 789abcde=0x 7998bfda;

b=b<<<7=0x 7998bfda<<<7=0x cc5fed3c;

(4)生成密鑰流

在經(jīng)過輪函數(shù)20輪周期(10輪行周期+10輪列周期)后,初始矩陣已經(jīng)變成了一個新的4×4矩陣,,此時將新矩陣與初始矩陣矢量相加,,得到的矩陣再拆分倒序序列化處理后即得到一個512位的密鑰比特流。

(5)加密

將需要加密的信息(明文)與密鑰流按位異或即得到密文,,當明文大于512位時,,按照上述步驟依次生成密鑰流,由于計數(shù)器是32位,,理論上可以生成

2 ^ 512 bit(256GB)的密鑰流,,所以一般長度的信息加密完全足夠。

(6)解密

接收方使用發(fā)送方傳輸過來的初始密鑰,、隨機數(shù)以及協(xié)商好的常數(shù)和依次遞增的計數(shù)器值按照ChaCha20的密鑰流生成規(guī)則產(chǎn)生與加密相同的密鑰流,,按位與密文異或即可得到明文。

折疊 Poly1305消息認證碼

消息認證碼(帶密鑰的Hash函數(shù)):密碼學(xué)中,,通信實體雙方使用的一種驗證機制,,保證消息數(shù)據(jù)完整性的一種工具。構(gòu)造方法由M.Bellare提出,,安全性依賴于Hash函數(shù),,故也稱帶密鑰的Hash函數(shù)。消息認證碼是基于密鑰和消息摘要所獲得的一個值,,可用于數(shù)據(jù)源發(fā)認證和完整性校驗,。

Poly1305 是Daniel.J.Bernstein創(chuàng)建的消息認證碼,可用于檢測消息的完整性和驗證消息的真實性,,現(xiàn)常在網(wǎng)絡(luò)安全協(xié)議(SSL/TLS)中與salsa20或ChaCha20流密碼結(jié)合使用,。

Poly1305消息認證碼的輸入為32字節(jié)(256bit)的密鑰和任意長度的消息比特流,經(jīng)過一系列計算生成16字節(jié)(128bit)的摘要,。算法的具體實施步驟 如下,。

(1) 密鑰處理

首先將32字節(jié)的密鑰分成16字節(jié)的兩組,前16字節(jié)稱作"r",,后16字節(jié)稱作"s",,申請兩個大小為16的數(shù)組r[]和s[],對于s,,將其以字節(jié)為單位,,倒序排列,即s[0]=s[15],s[1]=s[14],……,s[15]=s[0]("="前后的s[]為兩個數(shù)組):

這里假設(shè)s=01:03:80:8a:fb:0d:b2:fd:4a:bf:f6:af:41:49:f5:1b

倒序排列后s=1bf54941aff6bf4afdb20dfb8a800301(這里去掉分組號,, 形成比特流),。

對于r,,將r[3],r[7],r[11],r[15]前4位清零(使其小于16),r[4],r[8],r[12]最后兩位清零(能夠被4整除),,前4位清零操作可以通過與00001111邏輯乘得到,,后2位清零可以通過與11111100邏輯乘得到,完成清零操作后,,類似于s一樣對r進行按字節(jié)倒序排列:

這里假設(shè)r=85:d6:be:78:57:55:6d:33:7f:44:52:fe:42:d5:06:a8

清零操作后r=85:d6:be:08:54:55:6d:03:7c:44:52:0e:40:d5:06:08

倒序排列后r=806d5400e52447c036d555408bed685

(2) 加密函數(shù)

加密之前在系統(tǒng)中分配一個寄存器作為累加器ACC(程序中以數(shù)組表示),,ACC初始值為0。

明文劃分為16字節(jié)一組,,這里舉例假設(shè)明文如下:

000 43 72 79 70 74 6f 67 72 61 70 68 69 63 20 46 6f Cryptographic Fo

016 72 75 6d 20 52 65 73 65 61 72 63 68 20 47 72 6f rum Research Gro

032 75 70 up

(最左邊為序號,,右邊部分為明文所對應(yīng)的消息內(nèi)容)

明文這里為34字節(jié),所以劃分為3組,,其中最后一組只有2字節(jié),,加密之前每組明文需要按字節(jié)倒序排列(類似上文中密鑰的倒序排列操作),由于有3組明文,,故加密需要3輪:

第一次加密:

ACC=00

Block(當前加密塊)=6f4620636968706172676f7470797243

在明文前加上字符串01:

Block with 0x01 byte = 016f4620636968706172676f7470797243

累加器值與當前加密塊值相加覆蓋累加器值(這里是初始值00):

Acc + Block = 016f4620636968706172676f7470797243

與密鑰r相乘

(Acc+Block) * r(806d5400e52447c036d555408bed685)=

b83fe991ca66800489155dcd69e8426ba2779453994ac90ed284034da565ecf

對常數(shù)P取余后將得到的值賦給ACC

Acc=(Acc+Block)*r)%P = 2c88c77849d64ae9147ddeb88e69c83fc

(P是常數(shù)2^130-5:3fffffffffffffffffffffffffffffffb,這里的取余是為了讓ACC變成16.5字節(jié)---132bit)

此時ACC中的值為第一輪加密后的結(jié)果

后面的加密模式和第一次相同,,參與運算的為前一次運算結(jié)果(ACC中的值)和當前分組的明文。

第2,、3次加密過程如下:

#2

Acc = 2c88c77849d64ae9147ddeb88e69c83fc

Block = 6f7247206863726165736552206d7572

Block with 0x01 byte = 016f7247206863726165736552206d7572

Acc + block = 437febea505c820f2ad5150db0709f96e

(Acc+Block) * r =

21dcc992d0c659ba4036f65bb7f88562ae59b32c2b3b8f7efc8b00f78e548a26

Acc=(Acc+Block)*r)%P = 2d8adaf23b0337fa7cccfb4ea344b30de

#3

Acc = 2d8adaf23b0337fa7cccfb4ea344b30de

Block = 7075

Block with 0x01 byte = 017075

Acc + block = 2d8adaf23b0337fa7cccfb4ea344ca153

(Acc + Block) * r =

16d8e08a0f3fe1de4fe4a15486aca7a270a29f1e6c849221e4a6798b8e45321f

((Acc + Block) * r) % P = 28d31b7caff946c77c8844335369d03a7

3輪加密后得到的ACC=28d31b7caff946c77c8844335369d03a7

將其與密鑰s相加(s=1bf54941aff6bf4afdb20dfb8a800301):

Acc + s = 2a927010caf8b2bc2c6365130c11d06a8

可以發(fā)現(xiàn)ACC由于計算時附加01這半字節(jié)的原因,,一直都是16.5字節(jié),最后與s(16字節(jié))相加后仍為16.5字節(jié),,此時將與s相加結(jié)果倒序排列后去掉最后半個字節(jié)即得到16字節(jié)的明文摘要:

Tag: a8:06:1d:c1:30:51:36:c6:c2:2b:8b:af:0c:01:27:a9

    本站是提供個人知識管理的網(wǎng)絡(luò)存儲空間,,所有內(nèi)容均由用戶發(fā)布,不代表本站觀點,。請注意甄別內(nèi)容中的聯(lián)系方式,、誘導(dǎo)購買等信息,謹防詐騙,。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請點擊一鍵舉報,。
    轉(zhuǎn)藏 分享 獻花(0

    0條評論

    發(fā)表

    請遵守用戶 評論公約

    類似文章 更多