浅谈加密算法 aes

本文涉及的产品
密钥管理服务KMS,1000个密钥,100个凭据,1个月
简介: 浅谈加密算法 aes

一、目标


搞了这么多期签名和加密解密,今天我们聊聊高大上的东西: 加密算法。


加密算法我们整体可以分为:不可逆加密算法和可逆加密算法。


不可逆加密算法


常见的不可逆加密算法有MD5,HMAC,SHA1、SHA-224、SHA-256、SHA-384,和SHA-512。他们的特点是,不能从加密后的结果解密出原文,主要用于校检数据的一致性,防止篡改数据,我们之前分析的大部分sign签名都是不可逆算法。也叫散列算法或者哈希算法。


可逆加密算法


可逆加密算法就是加密之后的密文可以解密出原文。又可以分为:非对称加密和对称加密。


非对称加密


非对称加密算法的特点是:有两个配对的密钥,通常一个叫公钥,一个叫私钥。 可以公钥加密,私钥解密,也可以私钥加密,公钥来解密。


但是 公钥加密的数据 ,公钥没法解密。同样私钥加密的数据,私钥自己也没法解密。

常用的非对称加密算法有 RSA。


对称加密


对称加密算法的特点是:加密和解密使用的是同一个密钥。常见的对称加密算法有 DES、3DES、AES128、AES192、AES256。 AES的强度比较高,被广泛大量使用。


今天我们详细聊聊AES


二、步骤


AES, Advanced Encryption Standard,其实是一套标准:FIPS 197,而我们所说的AES算法其实是Rijndael算法。


AES标准支持的分组大小固定为128位,也就是16个字节,密钥长度有3种选择:128位(16字节)、192位(24字节)及256位(32字节)。


AES-128 会把原文进行10轮运算来加密。

AES-192 会把原文进行12轮运算来加密。

AES-256 会把原文进行14轮运算来加密。


第一步, 密钥扩展算法(KeyExpansion)


密钥扩展算法是Rijndael的密钥编排实现算法,其目的是根据种子密钥(用户密钥)生成多组轮密钥。轮密钥为多组128位(16字节)密钥,


AES-128 会把原文进行10轮运算来加密,需要11组密钥。

AES-192 会把原文进行12轮运算来加密,需要13组密钥。

AES-256 会把原文进行14轮运算来加密,需要15组密钥。


考虑到有这么一个种子密钥,

BYTE bKey[32] = {0x00,0x01,0x02,0x03,0x04,0x05,0x06,0x07,0x08,0x09,0x0a,0x0b,0x0c,0x0d,0x0e,0x0f,
                     0x10,0x11,0x12,0x13,0x14,0x15,0x16,0x17,0x18,0x19,0x1a,0x1b,0x1c,0x1d,0x1e,0x1f};


经过扩展之后的结果是

00:  rs: 00010203
    01:  rs: 04050607
    02:  rs: 08090a0b
    03:  rs: 0c0d0e0f
    04:  rs: 10111213
    05:  rs: 14151617
    06:  rs: 18191a1b
    07:  rs: 1c1d1e1f
    08:  rot: 1d1e1f1c sub: a472c09c rcon: 01000000 xor: 9cc072a5 rs: a573c29f
    09:  equ: a573c29f rs: a176c498
    10:  equ: a176c498 rs: a97fce93
    11:  equ: a97fce93 rs: a572c09c
    12:  sub: 0640bade rs: 1651a8cd
    13:  equ: 1651a8cd rs: 0244beda
    14:  equ: 0244beda rs: 1a5da4c1
    15:  equ: 1a5da4c1 rs: 0640bade
    16:  rot: 40bade06 sub: 09f41d6f rcon: 02000000 xor: 6f1df40b rs: ae87dff0
    17:  equ: ae87dff0 rs: 0ff11b68
    18:  equ: 0ff11b68 rs: a68ed5fb
    19:  equ: a68ed5fb rs: 03fc1567
    20:  sub: 7bb05985 rs: 6de1f148
    21:  equ: 6de1f148 rs: 6fa54f92
    22:  equ: 6fa54f92 rs: 75f8eb53
    23:  equ: 75f8eb53 rs: 73b8518d
    24:  rot: b8518d73 sub: 6cd15d8f rcon: 04000000 xor: 8f5dd168 rs: c656827f
    25:  equ: c656827f rs: c9a79917
    26:  equ: c9a79917 rs: 6f294cec
    27:  equ: 6f294cec rs: 6cd5598b
    28:  sub: 5003cb3d rs: 3de23a75
    29:  equ: 3de23a75 rs: 524775e7
    30:  equ: 524775e7 rs: 27bf9eb4
    31:  equ: 27bf9eb4 rs: 5407cf39
    32:  rot: 07cf3954 sub: c58a1220 rcon: 08000000 xor: 20128acd rs: 0bdc905f
    33:  equ: 0bdc905f rs: c27b0948
    34:  equ: c27b0948 rs: ad5245a4
    35:  equ: ad5245a4 rs: c1871c2f
    36:  sub: 78179c15 rs: 45f5a660
    37:  equ: 45f5a660 rs: 17b2d387
    38:  equ: 17b2d387 rs: 300d4d33
    39:  equ: 300d4d33 rs: 640a820a
    40:  rot: 0a820a64 sub: 67136743 rcon: 10000000 xor: 43671377 rs: 7ccff71c
    41:  equ: 7ccff71c rs: beb4fe54
    42:  equ: beb4fe54 rs: 13e6bbf0
    43:  equ: 13e6bbf0 rs: d261a7df
    44:  sub: b5ef5c9e rs: f01afafe
    45:  equ: f01afafe rs: e7a82979
    46:  equ: e7a82979 rs: d7a5644a
    47:  equ: d7a5644a rs: b3afe640
    48:  rot: afe640b3 sub: 798e096d rcon: 20000000 xor: 6d098e59 rs: 2541fe71
    49:  equ: 2541fe71 rs: 9bf50025
    50:  equ: 9bf50025 rs: 8813bbd5
    51:  equ: 8813bbd5 rs: 5a721c0a
    52:  sub: be409c67 rs: 4e5a6699
    53:  equ: 4e5a6699 rs: a9f24fe0
    54:  equ: a9f24fe0 rs: 7e572baa
    55:  equ: 7e572baa rs: cdf8cdea
    56:  rot: f8cdeacd sub: 41bd87bd rcon: 40000000 xor: bd87bd01 rs: 24fc79cc
    57:  equ: 24fc79cc rs: bf0979e9
    58:  equ: bf0979e9 rs: 371ac23c
    59:  equ: 371ac23c rs: 6d68de36


一共60个结果, 每4个结果是一组,可以组成15组密钥,用于后面的 1+14 = 15次运算


TIP:  KeyExpansion详细的原理和代码参照文后的参考资料。


第二步 轮密钥加(AddRoundKey)


听起来很高端,其实就是把入参明文和本轮密钥做一次异或。


结果如下

// 明文  string strIn = "Hello World ! i like aes";
 Round 0:
   input:  48 65 6c 6c 6f 20 57 6f 72 6c 64 20 21 20 69 20
   round:  00 01 02 03 04 05 06 07 08 09 0a 0b 0c 0d 0e 0f
   state:  48 64 6e 6f 6b 25 51 68 7a 65 6e 2b 2d 2d 67 2f


第三步 AES-256 开始进行14轮运算来加密


这14轮运算基本类似,主要包含4种主要运算操作:字节代换(SubByte)、行移位(ShiftRow)、列混合(MixColumn)、轮密钥加(AddRoundKey)。需要注意的是最后一轮 不做 列混合(MixColumn)。


字节代换(SubByte)


字节代换就是把原文替换成对应的(Substitution-box)S盒中的数据,S盒是256个元素,也是我们逆向分析中来定位是否使用AES算法的一个重要特征。


有深厚密码学功底的大厂会自己魔改S盒,这是需要很强的数学知识的,不是我等市井小民随便改改就行的。


行移位(Shift Rows)


这个代码比较好看懂,每四个一组,首位不变,后面的挪挪位置。


列混合(Mix Columns)


这个运算有点复杂,我木有看懂。


轮密钥加(Add Round Key)


我们之前不是生成了15组密钥吗? 第一组在 第0轮的 轮密钥加中用了,后面的14组就用在这里。

Round 1:
   input:  48 64 6e 6f 6b 25 51 68 7a 65 6e 2b 2d 2d 67 2f
     sub:  52 43 9f a8 7f 3f d1 45 da 4d 9f f1 d8 d8 85 15
   shift:  52 3f 9f 15 7f 4d 85 a8 da d8 9f 45 d8 43 d1 f1
     mix:  6f 83 77 7c 04 d9 c0 02 06 8e e8 b8 4e c7 2a 18
   round:  10 11 12 13 14 15 16 17 18 19 1a 1b 1c 1d 1e 1f
   state:  7f 92 65 6f 10 cc d6 15 1e 97 f2 a3 52 da 34 07
 Round 2:
   input:  7f 92 65 6f 10 cc d6 15 1e 97 f2 a3 52 da 34 07
     sub:  d2 4f 4d a8 ca 4b f6 59 72 88 89 0a 00 57 18 c5
   shift:  d2 4b 89 c5 ca 88 18 a8 72 57 4d 59 00 4f f6 0a
     mix:  2e 01 c4 3e bc 41 91 9e 09 52 54 3e 2d 95 a6 ad
   round:  a5 73 c2 9f a1 76 c4 98 a9 7f ce 93 a5 72 c0 9c
   state:  8b 72 06 a1 1d 37 55 06 a0 2d 9a ad 88 e7 66 31
 Round 3:
   input:  8b 72 06 a1 1d 37 55 06 a0 2d 9a ad 88 e7 66 31
     sub:  3d 40 6f 32 a4 9a fc 6f e0 d8 b8 95 c4 94 33 c7
   shift:  3d 9a b8 c7 a4 d8 33 32 e0 94 6f 6f c4 40 fc 95
     mix:  b0 06 9e f0 21 68 4c 78 7c 0d 1b 1e 3a ce c3 da
   round:  16 51 a8 cd 02 44 be da 1a 5d a4 c1 06 40 ba de
   state:  a6 57 36 3d 23 2c f2 a2 66 50 bf df 3c 8e 79 04
 Round 4:
   input:  a6 57 36 3d 23 2c f2 a2 66 50 bf df 3c 8e 79 04
     sub:  24 5b 05 27 26 71 89 3a 33 53 08 9e eb 19 b6 f2
   shift:  24 71 08 f2 26 53 b6 27 33 19 05 3a eb 5b 89 9e
     mix:  21 2c 48 ea 28 66 6b c1 72 34 6e 3d 37 43 00 d3
   round:  ae 87 df f0 0f f1 1b 68 a6 8e d5 fb 03 fc 15 67
   state:  8f ab 97 1a 27 97 70 a9 d4 ba bb c6 34 bf 15 b4
 Round 5:
   input:  8f ab 97 1a 27 97 70 a9 d4 ba bb c6 34 bf 15 b4
     sub:  73 62 88 a2 cc 88 51 d3 48 f4 ea b4 18 08 59 8d
   shift:  73 88 ea 8d cc f4 59 a2 48 08 88 d3 18 62 51 b4
     mix:  02 d0 b8 f6 7f 76 77 bd d3 08 25 e5 73 9b 1f 68
   round:  6d e1 f1 48 6f a5 4f 92 75 f8 eb 53 73 b8 51 8d
   state:  6f 31 49 be 10 d3 38 2f a6 f0 ce b6 00 23 4e e5
 Round 6:
   input:  6f 31 49 be 10 d3 38 2f a6 f0 ce b6 00 23 4e e5
     sub:  a8 c7 3b ae ca 66 07 15 24 8c 8b 4e 63 26 2f d9
   shift:  a8 66 8b d9 ca 8c 2f ae 24 26 3b 15 63 c7 07 4e
     mix:  b3 3b b3 a7 81 16 f1 a1 0c 30 4b 5b dd b1 78 f9
   round:  c6 56 82 7f c9 a7 99 17 6f 29 4c ec 6c d5 59 8b
   state:  75 6d 31 d8 48 b1 68 b6 63 19 07 b7 b1 64 21 72
 Round 7:
   input:  75 6d 31 d8 48 b1 68 b6 63 19 07 b7 b1 64 21 72
     sub:  9d 3c c7 61 52 c8 45 4e fb d4 c5 a9 c8 43 fd 40
   shift:  9d c8 c5 40 52 d4 fd 61 fb 43 c7 4e c8 3c 45 a9
     mix:  e7 02 04 31 5f 9c c4 1d a1 61 ff 0e 23 d6 9e 73
   round:  3d e2 3a 75 52 47 75 e7 27 bf 9e b4 54 07 cf 39
   state:  da e0 3e 44 0d db b1 fa 86 de 61 ba 77 d1 51 4a
 Round 8:
   input:  da e0 3e 44 0d db b1 fa 86 de 61 ba 77 d1 51 4a
     sub:  57 e1 b2 1b d7 b9 c8 2d 44 1d ef f4 f5 3e d1 d6
   shift:  57 b9 ef d6 d7 1d d1 1b 44 3e b2 2d f5 e1 c8 f4
     mix:  47 c2 4a 18 58 9e 5e 98 55 d8 72 1a f5 9b 98 de
   round:  0b dc 90 5f c2 7b 09 48 ad 52 45 a4 c1 87 1c 2f
   state:  4c 1e da 47 9a e5 57 d0 f8 8a 37 be 34 1c 84 f1
 Round 9:
   input:  4c 1e da 47 9a e5 57 d0 f8 8a 37 be 34 1c 84 f1
     sub:  29 72 57 a0 b8 d9 5b 70 41 7e 9a ae 18 9c 5f a1
   shift:  29 d9 9a a1 b8 7e 5f a0 41 9c 57 70 18 72 5b ae
     mix:  19 94 27 61 16 05 83 a9 1a eb e3 e8 53 bf 35 46
   round:  45 f5 a6 60 17 b2 d3 87 30 0d 4d 33 64 0a 82 0a
   state:  5c 61 81 01 01 b7 50 2e 2a e6 ae db 37 b5 b7 4c
 Round 10:
   input:  5c 61 81 01 01 b7 50 2e 2a e6 ae db 37 b5 b7 4c
     sub:  4a ef 0c 7c 7c a9 53 31 e5 8e e4 b9 9a d5 a9 29
   shift:  4a a9 e4 29 7c 8e a9 7c e5 d5 0c 31 9a ef 53 b9
     mix:  b9 1d 4b c1 a4 e7 3f 5b 88 71 7b 8f ef 13 03 60
   round:  7c cf f7 1c be b4 fe 54 13 e6 bb f0 d2 61 a7 df
   state:  c5 d2 bc dd 1a 53 c1 0f 9b 97 c0 7f 3d 72 a4 bf
 Round 11:
   input:  c5 d2 bc dd 1a 53 c1 0f 9b 97 c0 7f 3d 72 a4 bf
     sub:  a6 b5 65 c1 a2 ed 78 76 14 88 ba d2 27 40 49 08
   shift:  a6 ed ba 08 a2 88 49 c1 14 40 65 76 27 b5 78 d2
     mix:  c9 ba 3c b6 54 b3 e0 a5 fb 4d 04 f5 20 0c 0f 1b
   round:  f0 1a fa fe e7 a8 29 79 d7 a5 64 4a b3 af e6 40
   state:  39 a0 c6 48 b3 1b c9 dc 2c e8 60 bf 93 a3 e9 5b
 Round 12:
   input:  39 a0 c6 48 b3 1b c9 dc 2c e8 60 bf 93 a3 e9 5b
     sub:  12 e0 b4 52 6d af dd 86 71 9b d0 08 dc 0a 1e 39
   shift:  12 af d0 39 6d 9b 1e 52 71 0a b4 86 dc e0 dd 08
     mix:  27 05 4d 3b 20 30 3c 96 ce 24 99 3a 4d 73 85 52
   round:  25 41 fe 71 9b f5 00 25 88 13 bb d5 5a 72 1c 0a
   state:  02 44 b3 4a bb c5 3c b3 46 37 22 ef 17 01 99 58
 Round 13:
   input:  02 44 b3 4a bb c5 3c b3 46 37 22 ef 17 01 99 58
     sub:  77 1b 6d d6 ea a6 eb 6d 5a 9a 93 df f0 7c ee 6a
   shift:  77 a6 93 6a ea 9a ee d6 5a 7c 6d 6d f0 1b eb df
     mix:  e6 e4 52 78 42 3a d6 e6 30 78 4b 25 e2 3f 5c 5e
   round:  4e 5a 66 99 a9 f2 4f e0 7e 57 2b aa cd f8 cd ea
   state:  a8 be 34 e1 eb c8 99 06 4e 2f 60 8f 2f c7 91 b4
 Round 14:
   input:  a8 be 34 e1 eb c8 99 06 4e 2f 60 8f 2f c7 91 b4
     sub:  c2 ae 18 f8 e9 e8 ee 6f 2f 15 d0 73 15 c6 81 8d
   shift:  c2 e8 d0 8d e9 15 81 f8 2f c6 18 6f 15 ae ee 73
   round:  24 fc 79 cc bf 09 79 e9 37 1a c2 3c 6d 68 de 36
   state:  e6 14 a9 41 56 1c f8 11 18 dc da 53 78 c6 30 45
Output:
  cypher:  e6 14 a9 41 56 1c f8 11 18 dc da 53 78 c6 30 45


三、总结


水了这么多,其实最重要的就是这个总结。


1、判断是否是AES或者说类AES算法的一个重要思路是:定位到加解密函数之后,观察它的入参是不是和上一轮运算的结果有关系。  如果本轮的结果会当成下一轮的入参传进来,那么大概率就是 AES 算法了。


2、S盒重要,如果明显发现S盒,那么大概率是用了AES。但是确实有大厂魔改过S盒,不过如果发现加密算法中有明显的 字节代换(SubByte) 动作,起码也是类AES算法了。

IDA的插件findcrypt-yara可以试试


github.com/polymorf/fi…


AES详细原理读读这篇文章吧, (比读我这篇强)


www.anquanke.com/post/id/856…

6666.png


之前的沟通不在于讲什么,而是对方接收到什么。


TIP: 本文的目的只有一个就是学习更多的逆向技巧和思路,如果有人利用本文技术去进行非法商业获取利益带来的法律责任都是操作者自己承担,和本文以及作者没关系,本文涉及到的代码项目可以去 奋飞的朋友们 知识星球自取,欢迎加入知识星球一起学习探讨技术。有问题可以加我wx: fenfei331 讨论下。


关注微信公众号: 奋飞安全,最新技术干货实时推送


相关文章
|
3月前
|
存储 安全 数据安全/隐私保护
打造安全防线!Python AES&RSA加密工具,黑客绕道走的秘籍
【9月更文挑战第9天】随着数字化时代的到来,信息安全问题日益凸显。本文将介绍如何使用Python结合AES与RSA两种加密算法,构建强大的加密工具。AES以其高效性和强安全性著称,适用于大量数据的快速加密;RSA作为非对称加密算法,在加密小量数据及实现数字签名方面表现卓越。通过整合两者,可以构建既安全又灵活的加密系统。首先,需要安装pycryptodome库。接着,实现AES加密与解密功能,最后利用RSA加密AES密钥,确保其安全传输。这种设计不仅提高了数据传输效率,还增强了密钥交换的安全性,为敏感数据提供坚实保护。
237 43
|
3月前
|
存储 安全 数据安全/隐私保护
浅谈对称加密(AES与DES)
浅谈对称加密(AES与DES)
82 1
|
1月前
|
存储 安全 算法
AES算法
【10月更文挑战第30天】AES算法
88 2
|
3月前
|
数据安全/隐私保护
aes之ecb模式的加密解密
aes之ecb模式的加密解密
|
3月前
|
存储 安全 数据安全/隐私保护
安全升级!Python AES加密实战,为你的代码加上一层神秘保护罩
【9月更文挑战第12天】在软件开发中,数据安全至关重要。本文将深入探讨如何使用Python中的AES加密技术保护代码免受非法访问和篡改。AES(高级加密标准)因其高效性和灵活性,已成为全球最广泛使用的对称加密算法之一。通过实战演练,我们将展示如何利用pycryptodome库实现AES加密,包括生成密钥、初始化向量(IV)、加密和解密文本数据等步骤。此外,还将介绍密钥管理和IV随机性等安全注意事项。通过本文的学习,你将掌握使用AES加密保护敏感数据的方法,为代码增添坚实的安全屏障。
156 8
|
2月前
|
安全 测试技术 Go
Python 和 Go 实现 AES 加密算法的技术详解
Python 和 Go 实现 AES 加密算法的技术详解
135 0
|
3月前
|
安全 算法 数据安全/隐私保护
深度揭秘!Python加密技术的背后,AES与RSA如何守护你的数据安全
【9月更文挑战第10天】随着数字化时代的到来,数据安全成为企业和个人面临的重大挑战。Python 作为功能强大的编程语言,在数据加密领域扮演着重要角色。AES 和 RSA 是两种主流加密算法,分别以对称和非对称加密方式保障数据安全。AES(Advanced Encryption Standard)因其高效性和安全性,在数据加密中广泛应用;而 RSA 则利用公钥和私钥机制,在密钥交换和数字签名方面表现卓越。
89 3
|
3月前
|
存储 安全 数据库
双重防护,无懈可击!Python AES+RSA加密方案,构建最强数据安全堡垒
【9月更文挑战第11天】在数字时代,数据安全至关重要。AES与RSA加密技术相结合,构成了一道坚固防线。AES以其高效性保障数据加密,而RSA则确保密钥安全传输,二者相辅相成,提供双重保护。本文通过Python代码示例展示了这一加密方案的魅力,强调了其在实际应用中的重要性和安全性。使用HTTPS等安全协议传输加密密钥和密文,确保数据在数字世界中自由流通而无忧。
81 1
|
3月前
|
安全 数据安全/隐私保护 Python
情书也能加密?Python AES&RSA,让每一份数据都充满爱的密码
【9月更文挑战第8天】在这个数字化时代,情书不再局限于纸笔,也可能以电子形式在网络中传递。为了确保其安全,Python提供了AES和RSA等加密工具,为情书编织爱的密码。首先,通过安装pycryptodome库,我们可以利用AES对称加密算法高效保护数据;接着,使用RSA非对称加密算法加密AES密钥和IV,进一步增强安全性。即使情书被截获,没有正确密钥也无法解读内容。让我们用Python为爱情编织一张安全的网,守护每份珍贵情感。
54 2
|
4月前
|
JavaScript 数据安全/隐私保护 Python
网易云音乐搜索接口JS逆向: Params、encSecKey加密和AES实战
网易云音乐搜索接口JS逆向: Params、encSecKey加密和AES实战
281 4