AES
异或对称加密
密钥
明文
密文
填充
原因
明文和秘文不等长没法执行异或运算
分组加密是:将明文分成多个等长的block模块,对每个模块分别加解密
最后一个明文block模块长度不足时,需要填充
分组加密方式
-
位填充
以bit位为单位填充
|1011 1001 1001 0100 0010 0111 0000 0000|
-
字节填充
- 补零
- ASN| X9.23|DD DD DD DD DD DD DD DD|DD DD DD DD 00 00 00 04|最后一个字节告诉填了几个字节的0
- ISO 10126|DD DD DD DD DD DD DD DD|DD DD DD DD 81 A6 23 04|完全填入随机字符,最后一位告诉填了几个随机字节
- PKC57 (RFC5652) :... |DD DD DD DD DD DD DD DD|DD DD DD DD 04 04 04 04|需要填充的地方告诉填了几个字节,一共填了四个字节每个填充的字节都写04,04。
对称加密分组工作模式
- 允许同一个密钥,多多组数据加密还能保证安全性
- 直接将明文分解为多个块,对每个块独立加密
- 问题 无法隐藏数据特征
ECB工作模式
- 希望全是噪点没有数据特征
- 第一组是密钥和明文做了一组异或,第二组就是第一组的密文和这个第二组的明文做了一组异或。密文就没啥数据特征了。
- 缺点是只能串行化的操作,第三组数据必须等第二组数据做完异或,才能进行加密操作。没有多核cpu串行操作就会很慢。
CTR工作模式
-
同时解决以上两个问题
- 引入计数器
- 对于每一个块,计数器的值都在增加
通过递增一个加密技术器以产生连续密钥流
问题不能提供密文消息完整性校验
完整性校验
hash函数
不管输入多长可以输出定长的串,而且碰撞概率很低
MAC算法
-
发消息者 把消息和MAC算法(密钥通过mac算法会生成一个摘要)
接受者 他会重新用MAC算法和密钥生成摘要 然后判断生成的摘要和传过来的摘要是否相等。相等说明密文没有被篡改过。不想等说明密文被篡改过了。
GCM工作模式就是 CTR模式加上GMAC完整性校验
GCM = CTR + GMAC
AES加解密步骤
AES(Advanced Encription Standard)
常用的填充算法:PKC57
常用的分组工作模式: GCM
AES的分组长度只能是16字节128位
AES | 密钥长度(32位比特) | 分组长度(32位比特) | 加密轮数 |
---|---|---|---|
AES=128 | 4 | 4 | 10 |
AES=192 | 6 | 4 | 12 |
AES=256 | 8 | 4 | 14 |
AES总体加密步骤
- 1把明文按照128bit(16个字节)拆成若干个明文块,每个明文块是4*4矩阵
- 按照选择的填充方式来填充最后一个明文块
- 每一个明文块利用AES加密和密钥,加密成密文块
- 拼接所有的密文块,成为最终密文的结果。
AES加密10轮步骤
- C = E(K,P), E为每一轮算法,每轮密钥皆为不同
- 初始轮
- AddRoudKey密钥加(明文密钥做异或操作)
- 普通轮
- AddRoudKey密钥加(明文密钥做异或操作)
- SubBytes字节替代
- ShiftRows行移位
- MixColumns列混合
- 最终轮
- SubBytes字节代替
- ShiftRows行移位
- AddRoundKey轮密钥加(明文密钥做异或操作)
密钥扩展(不是直接用密钥)
-
函数g的步骤
a字循环: 左移一个字节
b使用s盒字节代换
同轮常量RC[J]J进行异或,其中j表示论数
每一轮使用的密钥生成下一轮使用的新的密钥
-
K0 k4 k8 k12 k1 K5 K9 k13 K2 K6 K10 k14 K3 K7 K11 K15 | | | |
v v v v
g函数
w1 w2 w3 w4
异或
-
g函数过程
w b0移到最后,自循环
b0 b1 b2 b3 B1 B2 B3 B0 s盒 s盒 s盒 s盒
b1' b2' b3' b0'
与RC[j]异或
得到新的W
AES关键把密钥安全的传递给对方
非对称密码
每个参与方都有一对密钥
-
公钥
- 想对方公开
-
私钥
- 自己使用
RSA过程
早期用rsa传递密钥
现在利用RSA生成CA证书
RSA算法共私钥的产生
1选择两个不同的质数p、q
- p = 11 q = 29
2计算p、q的乘积n(明文小于n)
- n = 319
3计算n的欧拉函数
- v = (p-1)*(q-1) = 10cheng28 = 280
4 随机选择一个整数k
- k = 3
5计算k对于v的模反元素d
- d = 187
- 如果两个正整数a和n互质,那么一定可以找到整数b,使得 ab-1 被n整除,或者说ab被n除的余数是1。这时,b就叫做a的“模反元素”
- 3*187 - 1 = 561 -1 = 560 560能被 280整除
6 公钥(k,n)
- (3, 319)
7私钥(d,n)
- (187, 319)
RSA安全的原因
公钥是对外知道的
知道公钥就是知道(k,n) -> k就是一个随机数 n是两个质数p,q的乘积
->v
->v = (p-1)*(q-1),k 计算k对于v的模反元素d
->(d,n)
难在n是一个大数,分解质因数n得到p,q会比较困难
安全性来源于对一个大数做因式分解特别困难。
RSA加密过程
k
加密 密文c = m(mod n)
d
解密 m = c(mod n)
-
对明文123加密
公钥(k,n) (3,319)加密
3
123 mod319 = 140
对140密文用私钥(187,319)解密
3
140(mod319) ->123
对明文123加密
私钥(d,n) (187,319)加密
187
123 mod(319) = 161
公钥解密(3,319)
3
161 mod319 ->123
私钥加密公钥解密相当于做签名
opoen ssl 生成rsa公私钥
// 生成私钥
liuxiaoju@liuxiaojudeMBP EightLocks %
openssl genrsa -out private.pem
liuxiaoju@liuxiaojudeMBP EightLocks % cat /Users/liuxiaoju/Desktop/LagMonitor/EightLocks/EightLocks/private.pem
-----BEGIN RSA PRIVATE KEY-----
MIIEpAIBAAKCAQEAxH/E8JE00rifh0AI3eNlc52IMB8OfDts0ck3YsA+m3jKI3sG
M0lkQPvAHbTLlCetyc1BMt2x5RlhdBEt04BBC4TU2JAETJDZSxV3ovch1EnIEOPz
88WxXNvMLBvVwIjfFMyq0QE6MBClHAzc4U2v5oPLb2HwOwSpElimxghFT5IsVjL+
rRN1OxPhrn2mbmGySsvz7VLq0XijABXc6E05i3TnFI98hgK6RJuvpF7L6oVtgWkX
144hqrWI79UHFep8aO49VaaeMKYYzwdXHigyYTld9ehsAlvkdwGRRhp9I2XtAZrE
FHsqWHxQeydw1w+BaG/wRlhjoy/wyNC07GRSLwIDAQABAoIBAQC+ZQLhCgGB0Awb
E8vDm8s4XEKSRfVWIIpPN0WoNJg1MrPB7zlRxmISqRw8bGr5cfztVSlAbRkq4A3S
VbbugQ4FaD6IW/seaRdyrilOyWCI/riQzR8aa8pwLDTH5GyX8sccszcr7qF/4xDo
ffojgI/YrokWsnH/7YMY2Lc3mNn3vvp7t5lHcog6tP/Zj1hs9wVVFx4A5m71+O+l
ha4ul8wuM+7e1Uw/He02TntH/5quyOSThkz4fEUvxsmm8kY/8gCCdvCd85CkGkTW
V1MuIrbN7wpkZaytOZpb9f20rVwHrbR+IBKhrGIjpuhN9HSozo2t4DRt1dDwbvoK
AkwKf3L5AoGBAOtYKmR+v3uU3ZDufXjUy9uhvPrLbSafLKeqC4SCRElm9UliPaa6
qB6XprBU5GLad076fOAW17jszV1dxASFepi1HYoOhicCYLE2mwci1lvo0nXZVsw5
jNcwvKHj7qXJ2k/gdkc7fesTCXtWYW+VWNxtsSygTNATcT0+oHMVuMh7AoGBANW+
zu25Yo7lXh+jB7BRYWuujTBa2xqTix6dAiid71G4KEZUCz+bDoJr+cCE2tPSUMLr
SzZkGfuaShBRtHWqLT+AEeqdHM14iuUMDld3Wu3MMBgRWFZS9PDg+25rVqXsnPPJ
KYxRNu39SSXTRFTW3hcOIPb15RK3RgGjA0EMmcDdAoGAaPj6b7jZUBYmfe7iqHLC
O0T5NiRmm0OEd4SxfnlcXCFAZ2sadLPtKTgbcatr82veq6uu54VI04NMVsjsFdgz
xsmCU4IG9H9rAaCJpbU0R+qhdU9sF8vTtmhWux8f43MVnWtRVpSCpcfoAsuUymCj
Mi77SBx4JpeFevvkNXEK6uECgYEAnIHJXNHYc89I+xtRvu3nyoQWB6kPM8eDH1hR
w1HZcVnJy60wS1OK7T6IsknVPTKLRh4phVsIl20i/A4Hd/yygwOQmtyNwXmZIhuQ
yMSxRNu0/3p710GI7nOeRvy7hmTZi7vo+0BgWySSEes+5mwqVHFY+9uS7wBZd0tY
T6IdVtUCgYAlZdXIpVPX6l7mQfJk/swZrdKhqI1rr5ji5Tx2jyI8rE3bzz7LSJ3h
KGAxMGJnEAnH2PLW4w1xE9PnUw5U/bcyVMt7xHTUwUVsWDZaEE+Pr+4vFhKlVtsg
Ir2dkPM4OpRRVTj0D5bSQvIYBw9RKUMk1IjoafyeJepUh/V9lkCkZA==
-----END RSA PRIVATE KEY-----
// 生成对应私钥的公钥
openssl rsa -in private.pem -pubout -out public.pem
liuxiaoju@liuxiaojudeMBP EightLocks % cat public.pem
-----BEGIN PUBLIC KEY-----
MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAxH/E8JE00rifh0AI3eNl
c52IMB8OfDts0ck3YsA+m3jKI3sGM0lkQPvAHbTLlCetyc1BMt2x5RlhdBEt04BB
C4TU2JAETJDZSxV3ovch1EnIEOPz88WxXNvMLBvVwIjfFMyq0QE6MBClHAzc4U2v
5oPLb2HwOwSpElimxghFT5IsVjL+rRN1OxPhrn2mbmGySsvz7VLq0XijABXc6E05
i3TnFI98hgK6RJuvpF7L6oVtgWkX144hqrWI79UHFep8aO49VaaeMKYYzwdXHigy
YTld9ehsAlvkdwGRRhp9I2XtAZrEFHsqWHxQeydw1w+BaG/wRlhjoy/wyNC07GRS
LwIDAQAB
-----END PUBLIC KEY-----
私钥的编码格式
ASN.1
解码查看
openssl asn1parse -dump -in private.pem
0:d=0 hl=4 l=1188 cons: SEQUENCE
4:d=1 hl=2 l= 1 prim: INTEGER :00
7:d=1 hl=4 l= 257 prim: INTEGER :C47FC4F09134D2B89F874008DDE365739D88301F0E7C3B6CD1C93762C03E9B78CA237B0633496440FBC01DB4CB9427ADC9CD4132DDB1E5196174112DD380410B84D4D890044C90D94B1577A2F721D449C810E3F3F3C5B15CDBCC2C1BD5C088DF14CCAAD1013A3010A51C0CDCE14DAFE683CB6F61F03B04A91258A6C608454F922C5632FEAD13753B13E1AE7DA66E61B24ACBF3ED52EAD178A30015DCE84D398B74E7148F7C8602BA449BAFA45ECBEA856D816917D78E21AAB588EFD50715EA7C68EE3D55A69E30A618CF07571E283261395DF5E86C025BE4770191461A7D2365ED019AC4147B2A587C507B2770D70F81686FF0465863A32FF0C8D0B4EC64522F
268:d=1 hl=2 l= 3 prim: INTEGER :010001
273:d=1 hl=4 l= 257 prim: INTEGER :BE6502E10A0181D00C1B13CBC39BCB385C429245F556208A4F3745A834983532B3C1EF3951C66212A91C3C6C6AF971FCED5529406D192AE00DD255B6EE810E05683E885BFB1E691772AE294EC96088FEB890CD1F1A6BCA702C34C7E46C97F2C71CB3372BEEA17FE310E87DFA23808FD8AE8916B271FFED8318D8B73798D9F7BEFA7BB7994772883AB4FFD98F586CF70555171E00E66EF5F8EFA585AE2E97CC2E33EEDED54C3F1DED364E7B47FF9AAEC8E493864CF87C452FC6C9A6F2463FF2008276F09DF390A41A44D657532E22B6CDEF0A6465ACAD399A5BF5FDB4AD5C07ADB47E2012A1AC6223A6E84DF474A8CE8DADE0346DD5D0F06EFA0A024C0A7F72F9
534:d=1 hl=3 l= 129 prim: INTEGER :EB582A647EBF7B94DD90EE7D78D4CBDBA1BCFACB6D269F2CA7AA0B8482444966F549623DA6BAA81E97A6B054E462DA774EFA7CE016D7B8ECCD5D5DC404857A98B51D8A0E86270260B1369B0722D65BE8D275D956CC398CD730BCA1E3EEA5C9DA4FE076473B7DEB13097B56616F9558DC6DB12CA04CD013713D3EA07315B8C87B
666:d=1 hl=3 l= 129 prim: INTEGER :D5BECEEDB9628EE55E1FA307B051616BAE8D305ADB1A938B1E9D02289DEF51B82846540B3F9B0E826BF9C084DAD3D250C2EB4B366419FB9A4A1051B475AA2D3F8011EA9D1CCD788AE50C0E57775AEDCC301811585652F4F0E0FB6E6B56A5EC9CF3C9298C5136EDFD4925D34454D6DE170E20F6F5E512B74601A303410C99C0DD
798:d=1 hl=3 l= 128 prim: INTEGER :68F8FA6FB8D95016267DEEE2A872C23B44F93624669B43847784B17E795C5C2140676B1A74B3ED29381B71AB6BF36BDEABABAEE78548D3834C56C8EC15D833C6C982538206F47F6B01A089A5B53447EAA1754F6C17CBD3B66856BB1F1FE373159D6B51569482A5C7E802CB94CA60A3322EFB481C782697857AFBE435710AEAE1
929:d=1 hl=3 l= 129 prim: INTEGER :9C81C95CD1D873CF48FB1B51BEEDE7CA841607A90F33C7831F5851C351D97159C9CBAD304B538AED3E88B249D53D328B461E29855B08976D22FC0E0777FCB28303909ADC8DC17999221B90C8C4B144DBB4FF7A7BD74188EE739E46FCBB8664D98BBBE8FB40605B249211EB3EE66C2A547158FBDB92EF0059774B584FA21D56D5
1061:d=1 hl=3 l= 128 prim: INTEGER :2565D5C8A553D7EA5EE641F264FECC19ADD2A1A88D6BAF98E2E53C768F223CAC4DDBCF3ECB489DE12860313062671009C7D8F2D6E30D7113D3E7530E54FDB73254CB7BC474D4C1456C58365A104F8FAFEE2F1612A556DB2022BD9D90F3383A94515538F40F96D242F218070F51294324D488E869FC9E25EA5487F57D9640A464
// 解析公钥
PKI体系和CA结构
数字签名
- 基于私钥加密,只能使用公钥解密:起到身份认证的作用
- 公钥大家都持有,就是知道消息是我发出来的
- 公钥的管理PKI(public key infrastructure)公钥基础设施
- 由Certificat Authority(CA)数字认证机构将用户个人身份与公开密钥关联在一起
- 公钥数字证书组成
- CA信息,公钥用户信息,公钥,权威机构的签字,有效期
- PKI用户
- 向CA注册公钥的用户
- 希望使用已注册公钥的用户(浏览器使用者)
为什么有证书就安全了,签名验签流程
-
验签
BOB生成公私钥,把它的个人身份+公钥 ——>发给CA登记机构
-
CA登记机构去验证登记人BOB的身份
- 看证书对应的域名是不是BOB的
- 是不是指向他所在的服务器
- 通过后生成CSR发给CA机构,CA用私钥加密传递给证书订阅人BOB
- BOB在服务器上部署证书
- 用户建立好连接进行TLS握手
- 用户握手后先请求证书
- 服务器把证书发给信赖方(例如浏览器)
- (根证书都是内置在浏览器内的或者说所有的操作系统中的)比照判断证书是否是可信的,看证书是否是过期的。公钥证书有个有效期。
- CA机构对证书有效期的判断,CA是又个CRL服务器。
- 信赖方可以到CRL服务器检查证书是否在有效期。过期了证书就不信了。采用链表的方式,性能很差。
- CA又搞出来一个OCSP响应程序更快判断证书是否在有效期。
-
证书信任链,中间人
- 抓包发现,服务器传证书
- 点击浏览器的锁可以看见证书
- 证书类型
- dv证书免费的 域名证书 (domain validated)
- 组织正式OV证书(organization validated) 更贵
- 扩展证书(extended validated) ev证书 最贵金融证书
TLS握手过程 DH密钥交换协议
前向保密性
迫于美国政府压力,server端把私钥给了美国政府
美国政府作为中间人拦截客户端发的消息,公钥发的消息。
然后就用拿到的私钥解密,所有信息都可以看到。
DH密钥交换协议
- 可以让双方在完全没有任何预先信息的条件下,通过不安全通道创建一个密钥。
- client -> server 发一个hello
- sever自己生成公私钥,其中私钥server自己保存,把公钥发给client。
- client基于server的public key利用一种算法,生成了一对公钥私钥,把自己的公钥发给server