加密算法的分类
- base64 编码格式
- 密码学演化 "秘密本"-->RSA
- 常见的加密算法
1)消息摘要(单向散列函数) MD5
2)对称加密 AES DES
3)非对称加密 RSA
4)证书等
base64
1.Base64编码原理
1)将所有字符转化为ASCII码;
2)将ASCII码转化为8位二进制;
3)将二进制3个归成一组(不足3个在后边补0)共24位,再拆分成4组,每组6位;
4)统一在6位二进制前补两个0凑足8位;
5)将补0后的二进制转为十进制;
6)从Base64编码表获取十进制对应的Base64编码;
7)ios7之后苹果提供了base的编码和解码
a.相关代码:
//给定一个字符串,对该字符串进行Base64编码,然后返回编码后的结果
-(NSString *)base64EncodeString:(NSString *)string
{
//1.先把字符串转换为二进制数据
NSData *data = [string dataUsingEncoding:NSUTF8StringEncoding];
//2.对二进制数据进行base64编码,返回编码后的字符串
return [data base64EncodedStringWithOptions:0];
}
//对base64编码后的字符串进行解码
-(NSString *)base64DecodeString:(NSString *)string
{
//1.将base64编码后的字符串『解码』为二进制数据 NSData *data = [[NSData alloc]initWithBase64EncodedString:string options:0];
//2.把 二进制数据转换为字符串返回
return [[NSString alloc]initWithData:data encoding:NSUTF8StringEncoding];
}
c.终端测试命令
$ echo -n A | base64 $ echo -n QQ== |base64 -D
MD5
1.单向散列函数的特点:
①加密后密文的长度是定长的
②如果明文不一样,那么散列后的结果一定不一样
③如果明文一样,那么加密后的密文一定一样(对相同数据加密,加密后的密文一样)
④所有的加密算法是公开的
⑤不可以逆推反算
2.MD5加密算法简单说明
1)对字符串进行MD5加密可以得到一个32个字符的密文
2)加密之后不能根据密文逆推出明文
3)MD5已经被破解(暴力破解|碰撞检测)
4.MD5加密进阶
1)先加盐,然后再进行MD5
2)先乱序,再进行MD5加密
3)乱序|加盐,多次MD5加密等
4)使用消息认证机制,即HMAC-MD5-先对密钥进行加密,加密之后进行两次MD5散列
5)加密命令行
MD5加密-字符串 $ echo -n "520it" |md5
MD5加密-文件1 $ md5 abc.png
SHA1加密: $ echo -n "520it" |openssl sha -sha1
SHA256 $ echo -n "520it" |openssl sha -sha256
SHA512 $ echo -n "520it" |openssl sha -sha512
hmacMD5加密 $ echo -n "520it" |openssl dgst -md5 -hmac "123"
AES DES
1)加密/解密使用相同的密钥
2)加密和解密的过程是可逆的(明文-》明文-》明文)
RSA
1.非对称加密的特点
1)使用公钥加密,使用私钥解密
2)公钥是公开的,私钥保密
3)加密处理安全,但是性能极差
2.RSA 原理
(1)求N,准备两个质数p和q,N = p x q
(2)求L,L是p-1和q-1的最小公倍数。L = lcm(p-1,q-1) (3)求E,E和L的最大公约数为1(E和L互质)
(4)求D,E x D mode L = 1
3.RSA加密小实践
(1) p = 17,q = 19 =>N = 323
(2)lcm(p-1,q-1)=>lcm(16,18)=>L= 144
(3)gcd(E,L)=1 =>E=5
(4)E乘以几可以mode L =1? D=29可以满足
(5)得到公钥为:E=5,N=323
(6)得到私钥为:D=29,N=323
(7)加密 明文的E次方 mod N = 123的5次方 mod 323 = 225(密文)
(8)解密 密文的D次方 mod N = 225的29次方 mod 323 = 123(明文)
3.openssl生成密钥命令
生成强度是 512 的 RSA 私钥:$ openssl genrsa -out private.pem 512
以明文输出私钥内容:$ openssl rsa -in private.pem -text -out private.txt
校验私钥文件:$ openssl rsa -in private.pem -check
从私钥中提取公钥:$ openssl rsa -in private.pem -out public.pem -outform PEM -pubout
以明文输出公钥内容:$ openssl rsa -in public.pem -out public.txt -pubin -pubout -text
使用公钥加密小文件:$ openssl rsautl -encrypt -pubin -inkey public.pem -in msg.txt -out msg.bin
使用私钥解密小文件:$ openssl rsautl -decrypt -inkey private.pem -in msg.bin -out a.txt
将私钥转换成 DER 格式:$ openssl rsa -in private.pem -out private.der -outform der
将公钥转换成 DER 格式:$ openssl rsa -in public.pem -out public.der -pubin -outform der