1. 密码原理基础
1.1. 对称密码
说明:对称密码主要就是依据下面的”异或”运算实现加解密的,这里可以把数A假定为明文,数B假定为KEY,数C假定为密文。通过下面简单的异或运算,即可实现用同样的KEY将明文转换为密文,并将密文转换成明文了。另外也可以理解到实际使用时为什么要将对称密码算法和分组模式结合才能使用,因为多数对称密码(即分组类型的对称密码)能加密的明文长度是固定的,所以需要对明文进行分组迭代。
数A XOR 数B = 数C
数C XOR 数B = 数A
1.2. 公钥密码(RSA)
1.2.1. RSA的加密解密
1.2.2. RSA中密钥对的生成
(1) 求数N
用伪随机数生成器求p和q,p和q都是质数
N = p * q
(2) 求数L
L = lcm(p-1, q-1); lcm为求最小公倍数的函数
(3) 求数E
1 < E < L;
gcd(E, L) = 1; gcd为求最大公约数的函数
(4) 求数D
1 < D < L;
E X D mod L = 1;
1.2.3. 实践
Step1: 生成密钥对
(1) 求N
准备两个质数,如p=17; q=19; 令N = p * q = 17 * 19 = 323;
(2) 求L
L = lcm(p-1, q-1) = lcm(17-1, 19-1) = lcm(16, 18) = 144;
(3) 求E
gcd(E, L) = 1;
满足条件的E有很低,如5,7,11,13,17,19,23,25,29,31,…
选择5作为E
(4) 求D
E X D mod L = 1
D为29可以满足上面的公式,因为E X D mod L = 5 X 29 mod 144 = 145 mod 144 = 1;
到这里我们已经生成了密钥对,即:
公钥: E=5, N=323;
私钥: D=29, N=323;
Step2:
要加密的明文必须是小于N的数,即小于323。假设要加密的明文为123
加密:明文E mod N = 1235 mod 323; 所以密文就是225
解密: 密文D mod N = 22529 mod 323 = 123;
2. 常见算法归类
对称密码 |
公钥密码 |
数字签名 |
aes128,aes192,aes256 |
rsa |
rsa |
des,des-ede, des-ede3,3des,desx, |
ElGamal |
dsa |
rijindael,rijindael128,rijindael192,rijindael256 |
Rabin |
ElGamal |
arcfour,arcfour128,arcfour256(流密码) |
ECC(椭圆曲线密码) |
Rabin |
blowfish |
|
|
cast128 |
|
|
chacha20-poly1305(流密码,既可加密也可认证) |
|
|
chacha20(流密码) |
|
|
单向散列函数 |
消息认证码 |
密钥交换 |
md4,md5 |
hmac-sha-1 |
diffie-hellman |
sha,sha1,sha224,sha256,sha384,sha512 |
hmac-md5 |
rsa |
whirlpool |
hmac-ripemd |
|
ripemd,ripemd-160 |
poly1305 |
|