首页
论坛
课程
招聘
[分享]加密方式整理
2020-12-4 15:45 5090

[分享]加密方式整理

2020-12-4 15:45
5090

一.消息摘要算法
1.循环冗余校验CRC
2.MAC系列(空)
(1)HmacMD2
(2)HmacMD4
(3)HmacMD5
(4)HmacSHA1
(5)HmacSHA224
(6)HmacSHA256
(7)HmacSHA384
(8)HmacSHA512
3.SHA系列
(1)SHA-1
(3)SHA-256
4.MD系列
(1)MD2
(2)MD4
(3)MD5
二、对称加密算法
1.rc4
2.DESede
3.PBE
4.DES
5.blowfish
6.AES(AES-128 AES-192 AES-256)
三、非对称加密算法
1.数字签名算法
(1)DSA
(2)RSA
(3)ECC算法
(4)DH算法
四、base64

一、消息摘要算法

1.循环冗余校验(CRC)

假设数据传输过程中需要发送15位的二进制信息g=101001110100001,这串二进制码可表示为代数多项式g(x) = x^14 + x^12 + x^9 + x^8 + x^7 + x^5 + 1,其中g中第k位的值,对应g(x)中x^k的系数。将g(x)乘以x^m,既将g后加m个0,然后除以m阶多项式h(x),得到的(m-1)阶余项r(x)对应的二进制码r就是CRC编码。
h(x)可以自由选择或者使用国际通行标准,一般按照h(x)的阶数m,将CRC算法称为CRC-m,比如CRC-32、CRC-64等

 

g(x)和h(x)的除运算,可以通过g和h做xor(异或)运算。比如将11001与10101做xor运算:
图片描述
明白了xor运算法则后,举一个例子使用CRC-8算法求101001110100001的效验码。CRC-8标准的h(x) = x^8 + x^7 + x^6 + x^4 + x^2 + 1,既h是9位的二进制串111010101。
图片描述
经过迭代运算后,最终得到的r是10001100,这就是CRC效验码。

 

来自:https://www.pianshen.com/article/2649688095/

2.MAC系列

1
不常见 暂不做整理

3.SHA系列

MD5和SHA属于单向散列函数的加密算法

(1)SHA-1

对于任意长度的明文,SHA1首先对其进行分组,使得每一组的长度为512位,然后对这些明文分组反复重复处理。

 

对于每个明文分组的摘要生成过程如下:

 

(1) 将512位的明文分组划分为16个子明文分组,每个子明文分组为32位。

 

(2) 申请5个32位的链接变量,记为A、B、C、D、E。

 

(3) 16份子明文分组扩展为80份。

 

(4) 80份子明文分组进行4轮运算。

 

(5) 链接变量与初始链接变量进行求和运算。

 

(6) 链接变量作为下一个明文分组的输入重复进行以上操作。

 

(7) 最后,5个链接变量里面的数据就是SHA1摘要。
SHA1有4轮运算,每一轮包括20个步骤,一共80步,当第1轮运算中的第1步骤开始处理时,A、B、C、D、E五个链接变量中的值先赋值到另外5个记录单元A′,B′,C′,D′,E′中。这5个值将保留,用于在第4轮的最后一个步骤完成之后与链接变量A,B,C,D,E进行求和操作。

 

SHA1的4轮运算,共80个步骤使用同一个操作程序,如下:

 

A,B,C,D,E←[(A<<<5)+ ft(B,C,D)+E+Wt+Kt],A,(B<<<30),C,D

 

其中 ft(B,C,D)为逻辑函数,Wt为子明文分组W[t],Kt为固定常数。这个操作程序的意义为:

 

● 将[(A<<<5)+ ft(B,C,D)+E+Wt+Kt]的结果赋值给链接变量A;

 

● 将链接变量A初始值赋值给链接变量B;

 

● 将链接变量B初始值循环左移30位赋值给链接变量C;

 

● 将链接变量C初始值赋值给链接变量D;

 

● 将链接变量D初始值赋值给链接变量E。

我们同样举一个例子来说明SHA1哈希算法中的每一步是怎样进行的,比起MD5算法,SHA1相对简单,假设W[1]=0x12345678,此时链接变量的值分别为A=0x67452301、B=0xEFCDAB89、C=0x98BADCFE、D=0x10325476、E=0xC3D2E1F0,那么第1轮第1步的运算过程如下。
 

(1) 将链接变量A循环左移5位,得到的结果为:0xE8A4602C。

 

(2) 将B,C,D经过相应的逻辑函数:

 

(B&C)|(~B&D)=(0xEFCDAB89&0x98BADCFE)|(~0xEFCDAB89&0x10325476)=0x98BADCFE

 

(3) 将第(1)步,第(2)步的结果与E,W[1],和K[1]相加得:

 

0xE8A4602C+0x98BADCFE+0xC3D2E1F0+0x12345678+0x5A827999=0xB1E8EF2B

 

(4) 将B循环左移30位得:(B<<<30)=0x7BF36AE2。

 

(5) 将第3步结果赋值给A,A(这里是指A的原始值)赋值给B,步骤4的结果赋值给C,C的原始值赋值给D,D的原始值赋值给E。

 

(6) 最后得到第1轮第1步的结果:

 

A = 0xB1E8EF2B

 

B = 0x67452301

 

C = 0x7BF36AE2

 

D = 0x98BADCFE

 

E = 0x10325476

 

按照这种方法,将80个步骤进行完毕。

 

第四轮最后一个步骤的A,B,C,D,E输出,将分别与记录单元A′,B′,C′,D′,E′中的数值求和运算。其结果将作为输入成为下一个512位明文分组的链接变量A,B,C,D,E,当最后一个明文分组计算完成以后,A,B,C,D,E中的数据就是最后散列函数值。

(2)SHA-256

SHA256是SHA-2下细分出的一种算法

1
2
3
4
5
6
SHA-2,名称来自于安全散列算法2(英语:Secure Hash Algorithm 2)的缩写,一种密码散列函数算法标准,由美国国家安全局研发,属于SHA算法之一,是SHA-1的后继者。
 
SHA-2下又可再分为六个不同的算法标准
 
包括了:SHA-224、SHA-256、SHA-384、SHA-512、SHA-512/224、SHA-512/256
这些变体除了生成摘要的长度 、循环运行的次数等一些微小差异外,算法的基本结构是一致的。

SHA256算法中用到了8个哈希初值以及64个哈希常量

 

其中,SHA256算法的8个哈希初值如下:

1
2
3
4
5
6
7
8
h0 := 0x6a09e667
h1 := 0xbb67ae85
h2 := 0x3c6ef372
h3 := 0xa54ff53a
h4 := 0x510e527f
h5 := 0x9b05688c
h6 := 0x1f83d9ab
h7 := 0x5be0cd19

这些初值是对自然数中前8个质数(2,3,5,7,11,13,17,19)的平方根的小数部分取前32bit而来
举个例子来说,$ \sqrt{2} $小数部分约为0.414213562373095048,而
0.414213562373095048 ≈ 6 ∗ 1 6 − 1 + a ∗ 1 6 − 2 + 0 ∗ 1 6 − 3 + . . . 0.414213562373095048 \approx 616^{-1} + a16^{-2} + 0*16^{-3} + ...
0.414213562373095048≈6∗16
−1
+a∗16
−2
+0∗16
−3
+...

 

于是,质数2的平方根的小数部分取前32bit就对应出了0x6a09e667
在SHA256算法中,用到的64个常量如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
428a2f98 71374491 b5c0fbcf e9b5dba5
3956c25b 59f111f1 923f82a4 ab1c5ed5
d807aa98 12835b01 243185be 550c7dc3
72be5d74 80deb1fe 9bdc06a7 c19bf174
e49b69c1 efbe4786 0fc19dc6 240ca1cc
2de92c6f 4a7484aa 5cb0a9dc 76f988da
983e5152 a831c66d b00327c8 bf597fc7
c6e00bf3 d5a79147 06ca6351 14292967
27b70a85 2e1b2138 4d2c6dfc 53380d13
650a7354 766a0abb 81c2c92e 92722c85
a2bfe8a1 a81a664b c24b8b70 c76c51a3
d192e819 d6990624 f40e3585 106aa070
19a4c116 1e376c08 2748774c 34b0bcb5
391c0cb3 4ed8aa4a 5b9cca4f 682e6ff3
748f82ee 78a5636f 84c87814 8cc70208
90befffa a4506ceb bef9a3f7 c67178f2

和8个哈希初值类似,这些常量是对自然数中前64个质数(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…)的立方根的小数部分取前32bit而来。
SHA256算法中的预处理就是在想要Hash的消息后面补充需要的信息,使整个消息满足指定的结构。

 

信息的预处理分为两个步骤:附加填充比特和附加长度

附加填充比特

在报文末尾进行填充,使报文长度在对512取模以后的余数是448

 

填充是这样进行的:先补第一个比特为1,然后都补0,直到长度满足对512取模后余数是448。

 

需要注意的是,信息必须进行填充,也就是说,即使长度已经满足对512取模后余数是448,补位也必须要进行,这时要填充512个比特。

 

因此,填充是至少补一位,最多补512位。

 

例:以信息“abc”为例显示补位的过程。

 

a,b,c对应的ASCII码分别是97,98,99

 

于是原始信息的二进制编码为:01100001 01100010 01100011

 

补位第一步,首先补一个“1” : 0110000101100010 01100011 1

 

补位第二步,补423个“0”:01100001 01100010 01100011 10000000 00000000 … 00000000

 

补位完成后的数据如下(为了简介用16进制表示):

1
2
3
4
61626380 00000000 00000000 00000000
00000000 00000000 00000000 00000000
00000000 00000000 00000000 00000000
00000000 00000000

为什么是448?

 

因为在第一步的预处理后,第二步会再附加上一个64bit的数据,用来表示原始报文的长度信息。而448+64=512,正好拼成了一个完整的结构。

附加长度值

附加长度值就是将原始数据(第一步填充前的消息)的长度信息补到已经进行了填充操作的消息后面。

 

wiki百科中给出的原文是:append length of message (before pre-processing), in bits, as 64-bit big-endian integer

 

SHA256用一个64位的数据来表示原始消息的长度。

 

因此,通过SHA256计算的消息长度必须要小于$ 2^64 $,当然绝大多数情况这足够大了。

 

长度信息的编码方式为64-bit big-endian integer

 

关于Big endian的含义,文末给出了补充

 

回到刚刚的例子,消息“abc”,3个字符,占用24个bit

 

因此,在进行了补长度的操作以后,整个消息就变成下面这样了(16进制格式)

1
2
3
4
61626380 00000000 00000000 00000000
00000000 00000000 00000000 00000000
00000000 00000000 00000000 00000000
00000000 00000000 00000000 00000018

SHA256散列函数中涉及的操作全部是逻辑的位运算
图片描述

计算消息摘要

将消息分解成512-bit大小的块
图片描述
假设消息M可以被分解为n个块,于是整个算法需要做的就是完成n次迭代,n次迭代的结果就是最终的哈希值,即256bit的数字摘要。

 

一个256-bit的摘要的初始值H0,经过第一个数据块进行运算,得到H1,即完成了第一次迭代

 

H1经过第二个数据块得到H2,……,依次处理,最后得到Hn,Hn即为最终的256-bit消息摘要

 

将每次迭代进行的映射用$ Map(H{i-1}) = H{i} $表示,于是迭代可以更形象的展示为:
图片描述
图中256-bit的Hi被描述8个小块,这是因为SHA256算法中的最小运算单元称为“字”(Word),一个字是32位。

 

此外,第一次迭代中,映射的初值设置为前面介绍的8个哈希初值,如下图所示:
图片描述
下面开始介绍每一次迭代的内容,即映射$ Map(H{i-1}) = H{i} $的具体算法
STEP1:构造64个字(word)

 

break chunk into sixteen 32-bit big-endian words w[0], …, w[15]

 

对于每一块,将块分解为16个32-bit的big-endian的字,记为w[0], …, w[15]

 

也就是说,前16个字直接由消息的第i个块分解得到

 

其余的字由如下迭代公式得到:
图片描述

 

STEP2:进行64次循环

 

映射 $ Map(H{i-1}) = H{i} $ 包含了64次加密循环

 

即进行64次加密循环即可完成一次迭代

 

每次加密循环可以由下图描述:
图片描述
图中,ABCDEFGH这8个字(word)在按照一定的规则进行更新,其中

 

深蓝色方块是事先定义好的非线性逻辑函数,上文已经做过铺垫

 

红色田字方块代表 mod $ 2^{32} $ addition,即将两个数字加在一起,如果结果大于$ 2^{32} , 你 必 须 除 以 ,你必须除以,你必须除以 2^{32} $并找到余数。

 

ABCDEFGH一开始的初始值分别为$ H{i-1}(0),H{i-1}(1),…,H_{i-1}(7) $

 

Kt是第t个密钥,对应我们上文提到的64个常量

 

Wt是本区块产生第t个word。原消息被切成固定长度512-bit的区块,对每一个区块,产生64个word,通过重复运行循环n次对ABCDEFGH这八个字循环加密。

 

最后一次循环所产生的八个字合起来即是第i个块对应到的散列字符串$ H_{i} $

 

由此变完成了SHA256算法的所有介绍

 

参考连接:https://blog.csdn.net/u011583927/article/details/80905740

4.MD系列

MD2算法产生于1989年;
MD4算法产生于1990年;
MD5算法产生于1991年。

 

MD5是目前广泛使用的版本,不过其安全性多年前就开始被质疑(碰撞算法)。于是在2008年提出了MD6算法,其后MD6历经数次改进,目前还是试行方案阶段,未被正式使用。这里主要整理一下MD5加密方式

MD5(转)

对MD5算法简要的叙述可以为:MD5以512位分组来处理输入的信息,且每一分组又被划分为16个32位子分组,经过了一系列的处理后,算法的输出由四个32位分组组成,将这四个32位分组级联后将生成一个128位散列值。

 

在MD5算法中,首先需要对信息进行填充,使其字节长度对512求余的结果等于448。因此,信息的字节长度(Bits Length)将被扩展至N512+448,即N64+56个字节(Bytes),N为一个正整数。填充的方法如下,在信息的后面填充一个1和无数个0,直到满足上面的条件时才停止用0对信息的填充。然后,在在这个结果后面附加一个以64位二进制表示的填充前信息长度。经过这两步的处理,现在的信息字节长度=N512+448+64=(N+1)512,即长度恰好是512的整数倍。这样做的原因是为满足后面处理中对信息长度的要求。

 

MD5中有四个32位被称作链接变量(Chaining Variable)的整数参数,他们分别为:A=0×01234567,B=0x89abcdef,C=0xfedcba98,D=0×76543210。

 

当设置好这四个链接变量后,就开始进入算法的四轮循环运算。循环的次数是信息中512位信息分组的数目。

 

将上面四个链接变量复制到另外四个变量中:A到a,B到b,C到c,D到d。

 

主循环有四轮(MD4只有三轮),每轮循环都很相似。第一轮进行16次操作。每次操作对a、b、c和d中的其中三个作一次非线性函数运算,然后将所得结果加上第四个变量,文本的一个子分组和一个常数。再将所得结果向右环移一个不定的数,并加上a、b、c或d中之一。最后用该结果取代a、b、c或d中之一。
以一下是每次操作中用到的四个非线性函数(每轮一个)。

 

F(X,Y,Z) =(X&Y)|((~X)&Z)
G(X,Y,Z) =(X&Z)|(Y&(~Z))
H(X,Y,Z) =X^Y^Z
I(X,Y,Z)=Y^(X|(~Z))
(&是与,|是或,~是非,^是异或)

 

这四个函数的说明:如果X、Y和Z的对应位是独立和均匀的,那么结果的每一位也应是独立和均匀的。
F是一个逐位运算的函数。即,如果X,那么Y,否则Z。函数H是逐位奇偶操作符。

 

假设Mj表示消息的第j个子分组(从0到15),<<
FF(a,b,c,d,Mj,s,ti)表示a=b+((a+(F(b,c,d)+Mj+ti)<<    GG(a,b,c,d,Mj,s,ti)表示a=b+((a+(G(b,c,d)+Mj+ti)<<    HH(a,b,c,d,Mj,s,ti)表示a=b+((a+(H(b,c,d)+Mj+ti)<<    II(a,b,c,d,Mj,s,ti)表示a=b+((a+(I(b,c,d)+Mj+ti)<<
这四轮(64步)是:

 

第一轮

 

FF(a,b,c,d,M0,7,0xd76aa478)
FF(d,a,b,c,M1,12,0xe8c7b756)
FF(c,d,a,b,M2,17,0x242070db)
FF(b,c,d,a,M3,22,0xc1bdceee)
FF(a,b,c,d,M4,7,0xf57c0faf)
FF(d,a,b,c,M5,12,0x4787c62a)
FF(c,d,a,b,M6,17,0xa8304613)
FF(b,c,d,a,M7,22,0xfd469501)
FF(a,b,c,d,M8,7,0x698098d8)
FF(d,a,b,c,M9,12,0x8b44f7af)
FF(c,d,a,b,M10,17,0xffff5bb1)
FF(b,c,d,a,M11,22,0x895cd7be)
FF(a,b,c,d,M12,7,0x6b901122)
FF(d,a,b,c,M13,12,0xfd987193)
FF(c,d,a,b,M14,17,0xa679438e)
FF(b,c,d,a,M15,22,0x49b40821)

 

第二轮

 

GG(a,b,c,d,M1,5,0xf61e2562)
GG(d,a,b,c,M6,9,0xc040b340)
GG(c,d,a,b,M11,14,0x265e5a51)
GG(b,c,d,a,M0,20,0xe9b6c7aa)
GG(a,b,c,d,M5,5,0xd62f105d)
GG(d,a,b,c,M10,9,0×02441453)
GG(c,d,a,b,M15,14,0xd8a1e681)
GG(b,c,d,a,M4,20,0xe7d3fbc8)
GG(a,b,c,d,M9,5,0x21e1cde6)
GG(d,a,b,c,M14,9,0xc33707d6)
GG(c,d,a,b,M3,14,0xf4d50d87)
GG(b,c,d,a,M8,20,0x455a14ed)
GG(a,b,c,d,M13,5,0xa9e3e905)
GG(d,a,b,c,M2,9,0xfcefa3f8)
GG(c,d,a,b,M7,14,0x676f02d9)
GG(b,c,d,a,M12,20,0x8d2a4c8a)

 

第三轮

 

HH(a,b,c,d,M5,4,0xfffa3942)
HH(d,a,b,c,M8,11,0x8771f681)
HH(c,d,a,b,M11,16,0x6d9d6122)
HH(b,c,d,a,M14,23,0xfde5380c)
HH(a,b,c,d,M1,4,0xa4beea44)
HH(d,a,b,c,M4,11,0x4bdecfa9)
HH(c,d,a,b,M7,16,0xf6bb4b60)
HH(b,c,d,a,M10,23,0xbebfbc70)
HH(a,b,c,d,M13,4,0x289b7ec6)
HH(d,a,b,c,M0,11,0xeaa127fa)
HH(c,d,a,b,M3,16,0xd4ef3085)
HH(b,c,d,a,M6,23,0x04881d05)
HH(a,b,c,d,M9,4,0xd9d4d039)
HH(d,a,b,c,M12,11,0xe6db99e5)
HH(c,d,a,b,M15,16,0x1fa27cf8)
HH(b,c,d,a,M2,23,0xc4ac5665)

 

第四轮

 

II(a,b,c,d,M0,6,0xf4292244)
II(d,a,b,c,M7,10,0x432aff97)
II(c,d,a,b,M14,15,0xab9423a7)
II(b,c,d,a,M5,21,0xfc93a039)
II(a,b,c,d,M12,6,0x655b59c3)
II(d,a,b,c,M3,10,0x8f0ccc92)
II(c,d,a,b,M10,15,0xffeff47d)
II(b,c,d,a,M1,21,0x85845dd1)
II(a,b,c,d,M8,6,0x6fa87e4f)
II(d,a,b,c,M15,10,0xfe2ce6e0)
II(c,d,a,b,M6,15,0xa3014314)
II(b,c,d,a,M13,21,0x4e0811a1)
II(a,b,c,d,M4,6,0xf7537e82)
II(d,a,b,c,M11,10,0xbd3af235)
II(c,d,a,b,M2,15,0x2ad7d2bb)
II(b,c,d,a,M9,21,0xeb86d391)

 

常数ti可以如下选择:

 

在第i步中,ti是4294967296*abs(sin(i))的整数部分,i的单位是弧度。(4294967296等于2的32次方)
所有这些完成之后,将A、B、C、D分别加上a、b、c、d。然后用下一分组数据继续运行算法,最后的输出是A、B、C和D的级联。

 

按照上面所说的方法实现MD5算法以后,可以用以下几个信息对你做出来的程序作一个简单的测试,看看程序有没有错误。

 

MD5 (“”) = d41d8cd98f00b204e9800998ecf8427e
MD5 (“a”) = 0cc175b9c0f1b6a831c399e269772661
MD5 (“abc”) = 900150983cd24fb0d6963f7d28e17f72
MD5 (“message digest”) = f96b697d7cb7938d525a2f31aaf161d0
MD5 (“abcdefghijklmnopqrstuvwxyz”) = c3fcd3d76192e4007dfb496cca67e13b
MD5 (“ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789″) =
d174ab98d277d9f5a5611c2c9f419d9f
MD5 (“123456789012345678901234567890123456789012345678901234567890123456789
01234567890″) = 57edf4a22be3c955ac49da2e2107b67a

二、对称加密算法

1.rc4

RC4是序列密码算法,优点:速度快,缺点:需要事先秘密地传递密钥。
图片描述
特点:xxxx%256
图片描述

2.DESede

实现代码:https://blog.csdn.net/github_34457546/article/details/51290390

3.PBE

PBE算法在加密过程中并不是直接使用口令来加密,而是加密的密钥由口令生成,这个功能由PBE算法中的KDF函数完成。KDF函数的实现过程为:将用户输入的口令首先通过“盐”(salt)的扰乱产生准密钥,再将准密钥经过散列函数多次迭代后生成最终加密密钥,密钥生成后,PBE算法再选用对称加密算法对数据进行加密,可以选择DES、3DES、RC5等对称加密算法。

4.DES

首先要生成一套加密密钥,从用户处取得一个64位长的密码口令,然后通过等分、移位、选取和迭代形成一套16个加密密钥,分别供每一轮运算中使用。

 

DES对64位(bit)的明文分组M进行操作,M经过一个初始置换IP,置换成m0。将m0明文分成左半部分和右半部分m0 = (L0,R0),各32位长。然后进行16轮完全相同的运算(迭代),这些运算被称为函数f,在每一轮运算过程中数据与相应的密钥结合。

 

在每一轮中,密钥位移位,然后再从密钥的56位中选出48位。通过一个扩展置换将数据的右半部分扩展成48位,并通过一个异或操作替代成新的48位数据,再将其压缩置换成32位。这四步运算构成了函数f。然后,通过另一个异或运算,函数f的输出与左半部分结合,其结果成为新的右半部分,原来的右半部分成为新的左半部分。将该操作重复16次。

 

经过16轮迭代后,左,右半部分合在一起经过一个末置换(数据整理),这样就完成了加密过程。
图片描述
来自:https://www.jianshu.com/p/c44a8a1b7c38

5.blowfish(对称的分组加密算法)

数据加密由一个16轮的Feistel网络完成,每轮由一个密钥相关置换和一个密钥与数据相关的替换组成。
Feistel结构就是顺序地执行两个或多个基本密码系统,使最后结果的密码强度高于每个密码系统的结果
假设加密过程的输入为分组长2w的明文和一个密钥K(K在运算过程中将分成多个子密钥Ki),将明文分为两部分,左边记为L0,右边记为R0.
第一轮:R0与子密钥k0进行运算,记为F(R0,k0),得到的结果与L0进行异或运算。
最终得到的结果将作为第二轮运算的右半部分记为R1,而R0直接作为第二轮的左半部分记为L1。
第二轮:L1和F(R1,K1)(R1和K1运算的结果)进行异或运算,产生的结果为第三轮的R2,R1直接变为L2
第三轮以后一次类推,n轮迭代之后,左右两边再合并到一起为最后的密文分组
Feistel解密结构:
本质上与加密过程一样,就是把加密过程反过来。

6.AES

aes根据加密轮数的不同可分为三类:aes-128、aes-192、aes-256

 

AES-128,也就是密钥的长度为128位,加密轮数:10轮
矩阵的每一列被称为1个32位比特字。
通过密钥编排函数该密钥矩阵被扩展成一个44个字组成的序列W[0],W[1], … ,W[43],该序列的前4个元素W[0],W[1],W[2],W[3]是原始密钥,用于加密运算中的初始密钥加
图片描述
对密钥进行分割,设K = “abcdefghijklmnop”,则K0 = a, K15 = p, W[0] = K0 K1 K2 K3 = “abcd”。
图片描述
AES加密包括四个操作:字节代换、行位移、列混合和轮密钥加,最后一轮迭代不执行列混合,在第一轮迭代之前,先将明文和原始密钥进行一次异或加密操作。
图片描述

字节代换

AES的S盒
图片描述
例如,加密时,输出的字节S1为0x12,则查S盒的第0x01行和0x02列,得到值0xc9,然后替换S1原有的0x12为0xc9。状态矩阵经字节代换后的图如下:
图片描述
逆字节替换所用的逆s盒
图片描述

行位移

行移位的逆变换是将状态矩阵中的每一行执行相反的移位操作,例如AES-128中,状态矩阵的第0行右移0字节,第1行右移1字节,第2行右移2字节,第3行右移3字节。

列混合

列混合操作

图片描述
图片描述

列混合逆运算

图片描述

轮密钥加

密钥Ki中每个字W[4i],W[4i+1],W[4i+2],W[4i+3]为32位比特字,包含4个字节,他们的生成算法下面在下面介绍。轮密钥加过程可以看成是字逐位异或的结果,也可以看成字节级别或者位级别的操作。也就是说,可以看成S0 S1 S2 S3 组成的32位字与W[4i]的异或运算。
这个4*4矩阵的每一列的4个字节组成一个字,矩阵4列的4个字依次命名为W[0]、W[1]、W[2]和W[3],它们构成一个以字为单位的数组W。例如,设密钥K为”abcdefghijklmnop”,则K0 = ‘a’,K1 = ‘b’, K2 = ‘c’,K3 = ‘d’,W[0] = “abcd”。
图片描述
图片描述
图片描述

ida中看到的样子:(aes-128)
 

图片描述
sub_40144B:
图片描述
图片描述
图片描述

三、非对称加密算法

1.数字签名算法

(1)DSA

背景
  DSA (Digital Signature Algorithm) 是 Schnorr 和 ElGamal 签名算法的变种,被美国 NIST 作为 DSS (DigitalSignature Standard)。 DSA 是基于整数有限域离散对数难题的。
  简单的说,这是一种更高级的验证方式,用作数字签名。不单单只有公钥、私钥,还有数字签名。私钥加密生成数字签名,公钥验证数据及签名,如果数据和签名不匹配则认为验证失败。数字签名的作用就是校验数据在传输过程中不被修改,数字签名,是单向加密的升级。
  DSA是基于整数有限域离散对数难题的,其安全性与RSA相比差不多。DSA的一个重要特点是两个素数公开,这样,当使用别人的p和q时,即使不知道私钥,你也能确认它们是否是随机产生的,还是作了手脚。RSA算法却做不到。

 

原理
  (1) 使用消息摘要算法将发送数据加密生成数字摘要。
  (2) 发送方用自己的私钥对摘要再加密,形成数字签名。
  (3) 将原文和加密的摘要同时传给对方。
  (4) 接受方用发送方的公钥对摘要解密,同时对收到的数据用消息摘要算法产生同一摘要。
  (5) 将解密后的摘要和收到的数据在接收方重新加密产生的摘要相互对比,如果两者一致,则说明在传送过程中信息没有破坏和篡改。否则,则说明信息已经失去安全性和保密性。

 

注意:

 

1、整数p,q,g可以公开,也可以仅由一组特定用户共享。

 

2、私钥x和公钥y称为一个密钥对(x,y),私钥只能由签名者本人独自持有,公钥则可以公开发布。密钥对可以在一段时间内持续使用。

 

签名产生过程如下:

  1. P产生随机数k,k < q;

  2. P计算 r = ( g^k mod p ) mod q

s = ( k^(-1) (H(m) + xr)) mod q

 

签名结果是( m, r, s )。

  1. 验证时计算 w = s^(-1)mod q

u1 = ( H( m ) * w ) mod q

 

u2 = ( r * w ) mod q

 

v = (( g^u1 * y^u2 ) mod p ) mod q

 

若v = r,则认为签名有效。

 

DSA加密算法的安全性:

 

DSA加密算法主要依赖于整数有限域离散对数难题,素数P必须足够大,且p-1至少包含一个大素数因子以抵抗Pohlig &Hellman算法的攻击。M一般都应采用信息的HASH值。DSA加密算法的安全性主要依赖于p和g,若选取不当则签名容易伪造,应保证g对于p-1的大素数因子不可约。

 

重要特点:两个素数公开

 

DSA是基于整数有限域离散对数难题的,其安全性与RSA相比差不多。DSA的一个重要特点是两个素数公开,这样,当使用别人的p和q时,即使不知道私钥,你也能确认它们是否是随机产生的,还是作了手脚。

 

小知识之公开密钥:

 

公开密钥也称为非对称密钥,每个人都有一对唯一对应的密钥:公开密钥(简称公钥)和私人密钥(简称私钥),公钥对外公开,私钥由个人秘密保存;用其中一把密钥加密,就只能用另一把密钥解密。

DSA和RAS本质上是一样的

(2)RSA(不太能理解 后期补充)

RSA用到的数学知识:质数、欧拉函数、模反元素

 

欧拉定理:
正整数a与n互质,则下式恒成立
a^ψ(n) ≡1(mod n)
即:
a的ψ(n)次幂除以n,余数恒为1
图片描述

 

模反元素
如果两个正整数a和n互质,则必定存在整数b使得a*b-1被n除余数为1
ab ≡1(mod n)
其中b被称为a的模反元素

 

随意选择两个大的质数p和q,p不等于q,计算N=pq。
根据欧拉函数,求得r = (p-1)(q-1)
选择一个小于 r 的整数 e,求得 e 关于模 r 的模反元素,命名为d。(模反元素存在,当且仅当e与r互质)
将 p 和 q 的记录销毁。

 

扩展欧几里得算法可用于RSA加密等领域。
详见:https://blog.csdn.net/hhr603894090/article/details/108758969

(3)ECC算法

椭圆加密算法(ECC)是一种公钥加密算法,最初由 Koblitz 和 Miller 两人于1985年提出,其数学基础是利用椭圆曲线上的有理点构成 Abel 加法群上椭圆离散对数的计算困难性。公钥密码体制根据其所依据的难题一般分为三类:大整数分解问题类、离散对数问题类、椭圆曲线类。有时也把椭圆曲线类归为离散对数类。
ECC 的主要优势是在某些情况下它比其他的方法使用更小的密钥 (比如 RSA),提供相当的或更高等级的安全。ECC 的另一个优势是可以定义群之间的双线性映射,基于 Weil 对或是 Tate 对;双线性映射已经在密码学中发现了大量的应用,例如基于身份的加密。不过一个缺点是加密和解密操作的实现比其他机制花费的时间长。

 

ECC 被广泛认为是在给定密钥长度的情况下,最强大的非对称算法,因此在对带宽要求十分紧的连接中会十分有用。

(4)DH算法

DH,全称为"Diffie-Hellman",它是一种确保共享 KEY 安全穿越不安全网络的方法,也就是常说的密钥一致协议。由公开密钥密码体制的奠基人 Diffie 和 Hellman 所提出的一种思想。简单的说就是允许两名用户在公开媒体上交换信息以生成"一致"的、可以共享的密钥。也就是由甲方产出一对密钥 (公钥、私钥),乙方依照甲方公钥产生乙方密钥对 (公钥、私钥)。

 

以此为基线,作为数据传输保密基础,同时双方使用同一种对称加密算法构建本地密钥 (SecretKey) 对数据加密。这样,在互通了本地密钥 (SecretKey) 算法后,甲乙双方公开自己的公钥,使用对方的公钥和刚才产生的私钥加密数据,同时可以使用对方的公钥和自己的私钥对数据解密。不单单是甲乙双方两方,可以扩展为多方共享数据通讯,这样就完成了网络交互数据的安全通讯。

四、base64

base64是将3个8位的字节转换成4个6位的字节,然后每个不足8位的再补0:
图片描述
因为Base64有效位只有六位,所以最大能表示的字符就为2的6次方64;

 

上面的例子种使用的是“ace”,三个字节,当字节数量不是3倍数的情况剩余的字节根据编码规则继续单独转(不够的位数用0补全),再用=号补满4个字节。这就是为什么有些Base64编码会以一个或两个等号结束的原因,但等号最多只有两个。
图片描述
一个原字节至少会变成两个目标字节(原字节八位,目标字节六位),两个原字节至少会变成三个目标字节;

 

所以如果余数为1的话,转成2个Base64编码字符,这个时候我们需要补2个等号;如果余数为2的话,转成3个Base64编码字符,这个时候我们需要补1个等号;Base64用\x00字节在末尾补足后,再在编码的末尾加上1个或2个=号,表示补了多少字节

 

由于标准的Base64编码后可能出现字符+和/,在URL中就不能直接作为参数,所以又有一种"url safe"的base64编码,其实就是把字符+和/分别变成-和_

 

如果反过来解码的话,base64字符串长度不能小于4字节

 

在ida中会看到base64编码表(一共64个字符)“a~z”“A~Z”“0~9”“+”“\”

 

这篇文章讲的挺好的:(6条消息) 为什么会有base64 以及base64的说明和使用_别闹的博客-CSDN博客


[看雪官方培训] Unicorn Trace还原Ollvm算法!《安卓高级研修班》2021年6月班开始招生!!

收藏
点赞0
打赏
分享
最新回复 (9)
雪    币: 8902
活跃值: 活跃值 (4509)
能力值: ( LV13,RANK:370 )
在线值:
发帖
回帖
粉丝
TkBinary 活跃值 5 2020-12-4 16:54
2
0
收藏看
雪    币: 3762
活跃值: 活跃值 (384)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
xianhuimin 活跃值 2020-12-4 17:10
3
0
点赞~
雪    币: 458
活跃值: 活跃值 (295)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
青丝梦 活跃值 2020-12-4 17:38
4
0
收藏吃灰
雪    币: 1096
能力值: ( LV1,RANK:0 )
在线值:
发帖
回帖
粉丝
舒默哦 活跃值 2020-12-4 17:44
5
0
感谢,收藏了,美滋滋
雪    币: 1822
活跃值: 活跃值 (743)
能力值: ( LV3,RANK:30 )
在线值:
发帖
回帖
粉丝
Vn小帆 活跃值 2020-12-4 17:49
6
0
tea 也挺多的
雪    币: 689
活跃值: 活跃值 (487)
能力值: ( LV3,RANK:25 )
在线值:
发帖
回帖
粉丝
大河向东流哇 活跃值 2020-12-6 17:55
7
0
Vn小帆 tea 也挺多的
好的 后面整理补充 感谢 
雪    币: 689
活跃值: 活跃值 (487)
能力值: ( LV3,RANK:25 )
在线值:
发帖
回帖
粉丝
大河向东流哇 活跃值 2020-12-6 17:56
8
0
TkBinary 收藏看
哇塞 大佬 
雪    币: 2794
活跃值: 活跃值 (172)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
mb_D34purZj 活跃值 2020-12-7 03:17
9
0
谢谢大佬,先收藏起来
雪    币: 10537
活跃值: 活跃值 (262)
能力值: (RANK:190 )
在线值:
发帖
回帖
粉丝
看场雪 活跃值 3 2020-12-23 12:12
10
0
值得收藏
游客
登录 | 注册 方可回帖
返回