https://blog.51cto.com/13479739/2484361
有關(guān)13種常見密碼學(xué)算法的一個(gè)系列
分組加密算法
DES
長度:8字節(jié)胀滚,加密輪數(shù):16
https://xz.aliyun.com/t/6748
識別:S盒,IP置換表,P置換表
AES
AES | 密鑰長度(32位比特字) | 分組長度(32位比特字) | 加密輪數(shù) |
---|---|---|---|
AES-128 | 4 | 4 | 10 |
AES-192 | 6 | 4 | 12 |
AES-256 | 8 | 4 | 14 |
加密輪數(shù):10-14
https://www.anquanke.com/post/id/85656
識別:S盒(但是S盒可能是動態(tài)生成的)、列混合(矩陣乘法{ 2, 3, 1, 1, 1, 2, 3, 1, 1, 1, 2, 3, 3, 1, 1, 2})、密鑰生成時(shí)的輪常量(01000000, 02000000, 04000000, 08000000, 10000000)
RC6
序列密碼
RC4
Rabbit
主要有幾個(gè)常數(shù):
a0 = a3 = a6 = 0x4d34d34d
a1 = a4 = a7 = 0xd34d34d3
a2 = a5 = 0x34d34d34
Hash算法
Md5
https://blog.csdn.net/u012611878/article/details/54000607
對MD5算法簡要的敘述可以為:MD5以512位分組來處理輸入的信息,且每一分組又被劃分為16個(gè)32位子分組呕屎,經(jīng)過了一系列的處理后,算法的輸出由四個(gè)32位分組組成敬察,將這四個(gè)32位分組級聯(lián)后將生成一個(gè)128位散列值秀睛。
第一步、填充:如果輸入信息的長度(bit)對512求余的結(jié)果不等于448莲祸,就需要填充使得對512求余的結(jié)果等于448蹂安。填充的方法是填充一個(gè)1和n個(gè)0。填充完后锐帜,信息的長度就為Nx512+448(bit)田盈;
第二步、記錄信息長度:用64位來存儲填充前信息長度缴阎。這64位加在第一步結(jié)果的后面允瞧,這樣信息長度就變?yōu)镹512+448+64=(N+1)512位。
第三步、裝入標(biāo)準(zhǔn)的幻數(shù)(四個(gè)整數(shù)):標(biāo)準(zhǔn)的幻數(shù)(物理順序)是(A=(01234567)16瓷式,B=(89ABCDEF)16,C=(FEDCBA98)16语泽,D=(76543210)16)贸典。
第四步、四輪循環(huán)運(yùn)算:循環(huán)的次數(shù)是分組的個(gè)數(shù)(N+1)
SHA1
SHA1算法的輸入是最大長度小于2^64比特的消息踱卵,輸入消息以512比特的分組為單位處理廊驼,輸出是160比特的消息摘要。SHA1的初始化散列值:
H0 = 0x67452301
H1 = 0xEFCDAB89
H2 = 0x98BADCFE
H3 = 0x10325476
H4 = 0xC3D2E1F0
SHA256
SHA256算法的輸入是最大長度小于2^64比特的消息惋砂,輸出是256比特的消息摘要妒挎,輸入以512比特的分組為單位處理。
SHA256中用到兩種常量:
8個(gè)哈希初值=>自然數(shù)中前8個(gè)質(zhì)數(shù)(2,3,5,7,11,13,17,19)的平方根的小數(shù)部分取前32bit :
h0 := 0x6a09e667
h1 := 0xbb67ae85
h2 := 0x3c6ef372
h3 := 0xa54ff53a
h4 := 0x510e527f
h5 := 0x9b05688c
h6 := 0x1f83d9ab
h7 := 0x5be0cd19
64個(gè)哈希常量=>自然數(shù)中前64個(gè)質(zhì)數(shù)(2,3,5,7,11,13,17,19,23,29,31,37,41,43,47,53,59,61,67,71,73,79,83,89,97…)的立方根的小數(shù)部分取前32bit :
428a2f98 71374491 b5c0fbcf e9b5dba5
3956c25b 59f111f1 923f82a4 ab1c5ed5
......
SHA512
SHA256算法的輸入是最大長度小于2^128比特的消息西饵,輸出是512比特的消息摘要酝掩,輸入以1024比特的分組為單位處理。
H(0)0 = 6a09e667f3bcc908
H(0)1 = bb67ae8584caa73b
H(0)2 = 3c6ef372fe94f82b
H(0)3 = a54ff53a5f1d36f1
H(0)4 = 510e527fade682d1
H(0)5 = 9b05688c2b3e6c1f
H(0)6 = 1f83d9abfb41bd6b
H(0)7 = 5be0cd19137e2179
非對稱加密
DH密鑰交換
RSA
https://www.cnblogs.com/P201521440001/p/11439344.html#cjsEEbwk
ElGamal
http://www.reibang.com/p/cd36ae7dca47
安全基礎(chǔ):離散對數(shù)求解的困難性
橢圓曲線公鑰加密體制
https://xz.aliyun.com/t/6295
有限域GF(p)上的橢圓曲線:
p是大素?cái)?shù)眷柔,a期虾、b、x和y均在有限域GF(p)中驯嘱,且滿足镶苞,通常用
表示。
MH背包公鑰加密體制
基礎(chǔ):超遞增序列背包問題的解容易求得鞠评。
密鑰生成:是一個(gè)超遞增整數(shù)序列茂蚓,取素?cái)?shù)p、b,
剃幌,計(jì)算
則公鑰為
和p,私鑰為A和b
加密算法:設(shè)明文塊二進(jìn)制表示為聋涨,則使用加密算法
解密算法:通過公式計(jì)算得到S, 對超遞增序列A以及整數(shù)S,利用超遞增背包問題求解负乡。
Rabin公鑰加密體制
密鑰生成:隨機(jī)選取兩個(gè)大素?cái)?shù)p,q,并且,
,將p,q作為私鑰牛郑,
作為公鑰
加密算法:設(shè)明文塊為m(m<n),運(yùn)用公式進(jìn)行加密
https://xz.aliyun.com/t/5113
分組密碼工作模式
-
電子密碼本模式ECB
-
密碼分組鏈接模式CBC
-
密碼反饋模式CFB
-
輸出反饋模式OFB
-
計(jì)數(shù)器模式(CTR)
填充方式
轉(zhuǎn)載:http://www.reibang.com/p/fbfc886a9f73
一個(gè)記錄敬鬓,侵刪淹朋。
位填充
位填充可用于任意長度的信息。
在原始信息后添加一個(gè)“設(shè)定”位(“1”)钉答,再添加“重設(shè)”位(“0”)至要求的長度础芍。“重設(shè)”位(“0”)的數(shù)量取決于原始信息末尾到塊邊緣的距離数尿。其中填充的0的個(gè)數(shù)可以為0仑性。
例如:
一段23位的信息可填充9位以填滿一個(gè)32位的塊
... | 1011 1001 1101 0100 0010 0111 0000 0000 |
位填充在很多哈希函數(shù)(例如MD5和SHA)中作為兩步填充方案中的第一步。
字節(jié)填充
字節(jié)填充可用于可編碼為整數(shù)字節(jié)(一個(gè)字節(jié)為8位)大小的信息右蹦。
ANSI X.923
塊的大小為8字節(jié)诊杆,需要填充4字節(jié)
... | DD DD DD DD DD DD DD DD | DD DD DD DD 00 00 00 04 |
無論原始信息的最后一個(gè)塊是否滿8字節(jié)歼捐,都需要在后面進(jìn)行填充。所以DD DD DD DD 00 00 00 04中的00 00 00 04只能理解為填充信息晨汹,如果原始信息為DD DD DD DD 00 00 00 04豹储,則填充后的結(jié)果應(yīng)該為DD DD DD DD 00 00 00 04 | 00 00 00 00 00 00 00 08。如此便消除了歧義淘这。
ISO 10126
塊的最后一個(gè)字節(jié)寫入填充的長度剥扣,其他填充位置寫入隨機(jī)數(shù)
... | DD DD DD DD DD DD DD DD | DD DD DD DD 81 A6 23 04 |
同樣,為了避免歧義铝穷,如果長度剛好是8字節(jié)的整數(shù)倍則填充8字節(jié)
PKCS #5 & PKCS #7
每個(gè)填充字節(jié)的值是用于填充的字節(jié)的個(gè)數(shù)钠怯,即是說,若需要填充N個(gè)字節(jié)曙聂,則每個(gè)填充字節(jié)值都是N晦炊。填充的字節(jié)數(shù)取決于算法可以處理的最小數(shù)據(jù)塊的字節(jié)數(shù)量。
... | DD DD DD DD DD DD DD DD | DD DD DD DD 04 04 04 04 |
任何情況下都需要填充宁脊。PKCS #5和PKCS #7填充方式相同刽锤,但PKCS #5僅為使用64位塊大小的塊密碼定義使用。
ISO/IES 7816-4
ISO/IES 7816-4與位填充的方式相同朦佩,在需要填充的第一個(gè)位置填充80并思,之后填充多個(gè)00(00的個(gè)數(shù)可以為0)
... | DD DD DD DD DD DD DD DD | DD DD DD DD 80 00 00 00 |
補(bǔ)零
在塊的最后填充0以達(dá)到塊的定長
... | DD DD DD DD DD DD DD DD | DD DD DD DD 00 00 00 00 |
該方式在原始信息末尾幾個(gè)字節(jié)為00時(shí)同樣會產(chǎn)生歧義,而且前面的方法無法解決該歧義语稠。但0填充可以應(yīng)用在從其他方面可以獲知原始消息長度的情況下宋彼。通常0填充可以應(yīng)用在二進(jìn)制編碼的字符串中,在字符串中仙畦,填充的0作為空字符而不需要顯示输涕。
Openssl中的填充方式
Openssl中的填充方式有以下幾種
- 不填充
- PKCS #7
- 0填充
- ANSI X.923
- ISO 10126
其中 PKCS #7是默認(rèn)的填充方式