iOS-密码学(一)哈希-DES、AES、RSA、md5

2018-05-16  本文已影响43人  lukyy

密码学简介:

领域 --> 军事
起源公元前 : 凯撒大帝
有一个密码本:
a -- e
b -- c
c -- z
...
美国!设备是最先进的! 截取日军的电报信息!(密文传递的) -- 破译
时间 事件(大规模的集结) 地点?AF(中途岛)
持续到 上世纪70年代 ,70 年代出现了一个特别伟大的算法叫RSA(三个人名)

1. 哈希(Hash 散列函数)

- 不可逆:密码"识别",文件"识别"
- 简单的说就是一种将任意长度的消息压缩到某一固定长度的消息摘要的函数。
- 一个二进制数据,只有一个Hash值

注意:base64是编码格式,不是加密方式

加密方式:

1.1 散列函数:

特点:

1.2 散列破解:
1.3 MD5用途
1.4 MD5 的基本安全
1.加"盐" - 早期使用!
2.HMAC,近一两年,在国内开始使用增多!
    给定一个密钥,对明文进行密钥拼接,并且做"两次散列" -> 得到32位结果!
1.5 HMAC :
- 用户在注册的那一刻,向服务器索取 密钥(key)!!
- 客户端拿到KEY的这一刻,就将KEY保存在本地!!
- 切换了新的设备(换手机登录,登录新的已有账号!) -- 重新找服务器获取!!

二、对称加密算法

2.0 可逆,传统加密算法)
2.1 加密和解密使用同一个"密钥"!!
2.2 密钥的保密工作非常重要(密钥会定期更换!密钥的管理很重要!!)

- DES   (数据加密标准:用的少,应为强度不够)
- 3DES  (使用3个密钥,对相同的数据执行三次加密,强度增加:更加用的少!)
- AES    (高级密码标准,美国国家安全局使用的,iOS系统使用的加密方式(钥匙串))!
    破解需要2000年!!

ECB:
1.电子代码本,就是说每个代码块都是独立加密的:就是将一个数据拆分为多块,然后独立加密!
2.将8个数据块,一个个加密,然后进行拼接;一个个解密,然后拼接成完整数据!

CBC:
1.密码快链
2.后面的每个加密数据块,都与上一个数据快有关;使用一个密钥和一个"初始化向量(IV)"对数据执行进行加密
3.如果在传输数据的过程中,一个数据块被破坏了,后面所有的数据将会被破坏!那么整个数据就无法解密了!
4.向量:某个方向的数量,现代的密码学都和几何有关!因为几何(包含圆形\椭圆\球体)的变量是有规律的,但是结果是多变的!

三、非对称加密算法

RSA:是三个人(可逆,现代加密算法,效率低:因为是简单的数学计算,所以加密的效率低)
3.1 公钥和私钥(公钥也是私钥加密过的)
3.2 公钥加密,私钥解密
3.3 私钥加密,公钥解密

四、iOS终端指令:加密解密测试

/**
 *  终端测试指令 unix
 *
 *  DES(ECB)加密
 *  $ echo -n hello | openssl enc -des-ecb -K 616263 -nosalt | base64
 *
 *  DES(CBC)加密
 *  $ echo -n hello | openssl enc -des-cbc -iv 0102030405060708 -K 616263 -nosalt | base64
 *
  *
 *  AES(ECB)加密
 *  $ echo -n hello | openssl enc -aes-128-ecb -K 616263 -nosalt | base64
 *
 *  AES(CBC)加密
 *  $ echo -n hello | openssl enc -aes-128-cbc -iv 0102030405060708 -K 616263 -nosalt | base64
 *
 *
 *
 *  DES(ECB)解密
 *  $ echo -n HQr0Oij2kbo= | base64 -D | openssl enc -des-ecb -K 616263 -nosalt -d
 *
 *  DES(CBC)解密
 *  $ echo -n alvrvb3Gz88= | base64 -D | openssl enc -des-cbc -iv 0102030405060708 -K 616263 -nosalt -d
 *
 *
 *
 *  AES(ECB)解密
 *  $ echo -n d1QG4T2tivoi0Kiu3NEmZQ== | base64 -D | openssl enc -aes-128-ecb -K 616263 -nosalt -d
 *
 *  AES(CBC)解密
 *  $ echo -n u3W/N816uzFpcg6pZ+kbdg== | base64 -D | openssl enc -aes-128-cbc -iv 0102030405060708 -K 616263 -nosalt -d
 *
 *
 *  MD5加密
 *  $ md5 -s "zm"   //md5加密 字符串
 *  $ md5 + 文件      //md5加密 文件
 *
 * 
 *
 *  提示:
 * 1> 加密过程是先加密,再base64编码
 * 2> 解密过程是先base64解码,再解密
 * 3> 加密字符串 hello,密钥abc(abc 的 ASCII可显示字符: 616263)
//输出hello 通过管道 | 到 openssl
 * 4> $ echo -n hello | openssl:    
    
//base64解码
 * 5> $ base64 -D:  

//查看文件的 ASCII可显示字符                                                  
 * 6> $ xxd + 文件名      

//生成一个密钥(私钥),名称为 private.pem                                                    
 * 7> $ openssl genrsa -out private.pem 512     

//生成一个密钥(公钥),名称为 public.pem     
 * 8> $ openssl rsa -in private.pem -out public.pem -pubout     

//查看密钥
 * 9> $ cat private.pem                                 
 * 10> $ cat public.pem
 * 11> $ openssl rsa -in private.pem -text -out private.txt     //输出私钥到 txt 文本
 * 
 * 密钥 应用场景:数字签名
 * 数据报文发送:数据报文1、数据报文2、数据报文3...
 * 客服端:1.数据报文--> HASH算法(使用md5) --> 32位字符  --> RSA加密(对md5值进行RSA公钥加密:即 数字签名)
 *        2.数据报文 + 数字签名 --> 服务器
 * 服务器:1.数据报文--> HASH算法 --> 32位字符 str1
 *        2.数字签名 --> RSA解密 --> 32位字符 str2  (利用私钥解密)
 *        3. str1 = str2 (数据没有被修改过)
 * 
 * 
 */  (md5对RSA公钥加密密文进行加密:即 数字签名)
ASCII可显示字符

网站:ASCII码对照表

终端测试
$ md5 -s "iOS"
结果:MD5 ("iOS") = 1bdf605991920db11cbdf8508204c4eb
$ md5 -s "zm"   
结果:MD5 ("zm") = d9c2967765305ff512a5ab979ed1f7a0

ASCII可显示字符.txt 内容:abcdef hk (一个txt文件的内)

$ xxd ASCII可显示字符.txt
00000000: 6162 6364 6566 2020 686b                 abcdef  hk
$ cat private.pem   //查看密钥(私钥)//base64编码的结果 512位
-----BEGIN RSA PRIVATE KEY-----
MIIBPAIBAAJBALxACyEl08USUUCdZZ0yU5SxX7frfn0OeL0RJdSV6qdvTtVrCbE0
X5AiXM/VEPEjzu+U+TOVrdN4tJNlLKTrBJUCAwEAAQJATGx7mDNxK7pp/h9oF09N
Gzp/L32NVlu/rJH/l7RdFSep4JVEo8GQ1pu5yX1TWn4q1dZSbZZXVsTblhUbxEcI
AQIhAPMHPNgiKP+4UBSqG/DEPCb/qtydvCrcqOzVn/0HorsBAiEAxkxP+VGO/wG1
rogk9a/YHQ4FFsFfJpVSHWy/TIFVLZUCIQC6JqYVS30p+uzkFzSVpEoK+TTQDcYu
8pw15J/KecnNAQIhALKm5hZU6GPOgoSvm7zNpALpMqSBqtv0A3sHEoI2syrRAiEAk5copPkLcZ3gIXAvmHGQ4euDUYpQqMCSuw5w5ZPHG5A=                
-----END RSA PRIVATE KEY----- 

$ cat public.pem    //查看密钥(公钥)//base64编码的结
-----BEGIN PUBLIC KEY----MFwwDQYJKoZIhvcNAQEBBQADSwAwSAJBALxACyEl08USUUCdZZ0yU5SxX7frfn0O
eL0RJdSV6qdvTtVrCbE0X5AiXM/VEPEjzu+U+TOVrdN4tJNlLKTrBJUCAwEAAQ==    果
-----END PUBLIC KEY----- <br>

苹果的p12证书,也是利用RSA创建的

abc.txt 内容1
00000000
11111111
22222222
00000000
11111111
22222222
00000000
11111111
22222222
00000000
11111111
32222222

abc.txt 内容2
00000000
11111111
22222222
00000000
11111111
22222222
00000000
11111111
22222222
00000000
11111111
32222222
$ ls
abc.txt  
// DES-ECB 加密:abc.txt 内容1
$ openssl enc -des-ecb -K 616261 -nosalt -in abc.txt -out msg1.bin
$ ls
abc.txt  msg1.bin
$ xxd msg1.bin
00000000: 380e 2176 3c39 a20f 92f3 529a 21b6 00a8  8.!v<9....R.!...
00000010: 9bbd 88d9 7b7c b950 0d3d af76 4906 1401  ....{|.P.=.vI...
00000020: 144b 6c44 776c a64c 9123 dcde 7746 be29  .KlDwl.L.#..wF.)
00000030: e000 dfb8 b989 cbf0 3452 1498 122b b918  ........4R...+..
00000040: b694 cafa 8d16 29f7 10f7 eca3 e892 8ea2  ......).........
00000050: d224 68ba d07e 6f9c fcd5 388b 2725 d408  .$h..~o...8.'%..
00000060: 682a 385e cf89 1929 2043 36f5 c7b4 2bf5  h*8^...) C6...+.
// DES-ECB 加密:abc.txt 内容2
$ openssl enc -des-ecb -K 616261 -nosalt -in abc.txt -out msg2.bin
$ xxd msg2.bin
00000000: 380e 2176 3c39 a20f 92f3 529a 21b6 00a8  8.!v<9....R.!...
00000010: 9bbd 88d9 7b7c b950 0d3d af76 4906 1401  ....{|.P.=.vI...
00000020: 144b 6c44 776c a64c 9123 dcde 7746 be29  .KlDwl.L.#..wF.)
00000030: e000 dfb8 b989 cbf0 3452 1498 122b b918  ........4R...+..
00000040: b694 cafa 8d16 29f7 10f7 eca3 e892 8ea2  ......).........
00000050: d224 68ba d07e 6f9c fcd5 388b 2725 d408  .$h..~o...8.'%..
00000060: 501b 6d91 b1dd 7a8c 2043 36f5 c7b4 2bf5  P.m...z. C6...+.
// 总结: DES-ECB 加密结果,只是一个块数据加密加过不同


// MD5 加密:abc.txt 内容1
$ md5 abc.txt
MD5 (abc.txt) = 900e09f7dcf7f72a2fdc971633c75448
// MD5 加密:abc.txt 内容2
$ md5 abc.txt
MD5 (abc.txt) = 2fe03ad66c092df04a217e6653b102ee
// MD5 加密结果:完全不一样


// DES-CBC 加密:abc.txt 内容1
$ openssl enc -des-cbc -iv 0102030405060708 -K 616261 -nosalt -in abc.txt -out msg3.bin
// DES-CBC 加密:abc.txt 内容2
$ openssl enc -des-cbc -iv 0102030405060708 -K 616261 -nosalt -in abc.txt -out msg4.bin
// DES-CBC 加密:abc.txt 内容1 结果
$ xxd msg3.bin
00000000: 4d09 2bbf f72a f997 e530 a568 3169 e7b8  M.+..*...0.h1i..
00000010: b757 b13c ea2d 33dc 4b4e 1f93 d311 735e  .W.<.-3.KN....s^
00000020: f695 6749 5189 07b9 418b 8978 4fb1 bbdd  ..gIQ...A..xO...
00000030: af8e 7f2c ab72 cc9c 87e7 cc37 f854 7dfd  ...,.r.....7.T}.
00000040: 67b7 5406 3e71 b47a aaba 119a 3d5f 374e  g.T.>q.z....=_7N
00000050: 7165 d5b8 93ea 4777 25bc 0685 1a20 2384  qe....Gw%.... #.
00000060: 5661 6e4f 1c6d 27ac 5e7f 8242 856f f472  VanO.m'.^..B.o.r
// DES-CBC 加密:abc.txt 内容2 结果
$ xxd msg4.bin
00000000: 4d09 2bbf f72a f997 e530 a568 3169 e7b8  M.+..*...0.h1i..
00000010: b757 b13c ea2d 33dc 4b4e 1f93 d311 735e  .W.<.-3.KN....s^
00000020: f695 6749 5189 07b9 418b 8978 4fb1 bbdd  ..gIQ...A..xO...
00000030: af8e 7f2c ab72 cc9c 87e7 cc37 f854 7dfd  ...,.r.....7.T}.
00000040: 67b7 5406 3e71 b47a aaba 119a 3d5f 374e  g.T.>q.z....=_7N
00000050: 7165 d5b8 93ea 4777 25bc 0685 1a20 2384  qe....Gw%.... #.
00000060: 893c afe6 01d9 a87c 5645 4959 400a 4dad  .<.....|VEIY@.M.
$
// 总结: DES-CBC 加密结果,一个数据块改变,这个数据块后面的数据块 加密结果都不同
上一篇 下一篇

猜你喜欢

热点阅读