对称加密&非对称加密

对称加密 - DES

  1. 真正的加密算法,带密钥,加密和解密使用相同的密钥
  2. 对称加密优点是算法公开、计算量小、加密速度快、加密效率高
  3. 双方都保存秘钥,其次如果一方的秘钥被泄露,那么加密信息也就不安全了。另外,每对用户每次使用对称加密算法时,都需要使用其他人不知道的唯一秘钥,这会使得收、发双方所拥有的钥匙数量巨大,密钥管理成为双方的负担
  4. DES使用56位密钥,以现代计算能力,24小时内即可被破解。虽然如此,在某些简单应用中,我们还是可以使用DES加密算法
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
public class DES {  
/**
* 加密
*
* @param datasource byte[]
* @param password String
* @return byte[]
*/
public static byte[] encrypt(byte[] datasource, String password) {
try {
SecureRandom random = new SecureRandom();
DESKeySpec desKey = new DESKeySpec(password.getBytes());
//创建一个密匙工厂,然后用它把DESKeySpec转换成
SecretKeyFactory keyFactory = SecretKeyFactory.getInstance("DES");
SecretKey securekey = keyFactory.generateSecret(desKey);
//Cipher对象实际完成加密操作
Cipher cipher = Cipher.getInstance("DES");
//用密匙初始化Cipher对象,Cipher.ENCRYPT_MODE代表编码模式
cipher.init(Cipher.ENCRYPT_MODE, securekey, random);
//现在,获取数据并加密
//正式执行加密操作
return cipher.doFinal(datasource);
} catch (Throwable e) {
e.printStackTrace();
}
return null;
}

/**
* 解密
*
* @param src byte[]
* @param password String
* @return byte[]
* @throws Exception
*/
public static byte[] decrypt(byte[] src, String password) throws Exception {
// DES算法要求有一个可信任的随机数源
SecureRandom random = new SecureRandom();
// 创建一个DESKeySpec对象
DESKeySpec desKey = new DESKeySpec(password.getBytes());
// 创建一个密匙工厂
SecretKeyFactory keyFactory = SecretKeyFactory.getInstance("DES");
// 将DESKeySpec对象转换成SecretKey对象
SecretKey securekey = keyFactory.generateSecret(desKey);
// Cipher对象实际完成解密操作
Cipher cipher = Cipher.getInstance("DES");
// 用密匙初始化Cipher对象
cipher.init(Cipher.DECRYPT_MODE, securekey, random);
// 真正开始解密操作
return cipher.doFinal(src);
}
}

非对称加密 - RSA

1、用RSA算法生成一对密钥,公钥发放给外部客户,私钥自己保管;有以下应用场景:
【公钥加密、私钥解密】或者【私钥签名、公钥验证】
2、非对称加解密的理解:

  • 小明想秘密给小英发送消息
  • 小英手里有一个盒子(public key),这个盒子只有小英手里的钥匙(private key)才打得开
  • 小英把盒子送给小明(分发公钥)
  • 小明写好消息放进盒子里,锁上盒子(公钥加密)
  • 小明把盒子寄给小英(密文传输)
  • 小英用手里的钥匙打开盒子,得到小明的消息(私钥解密)
  • 假设小刚劫持了盒子,因为没有小英的钥匙,他也打不开

与DES不同,RSA算法中,每个通信主体都有两个钥匙,一个公钥一个私钥。
就是有2把钥匙

  1. 使用publicKey可以对数据进行加密
  2. 使用Key才能对数据进行解密

单方向传输
用公钥加密的数据,只有私钥能解开(可用于加密);
同时,使用私钥加密的数据,只有公钥能解开(签名)。但是速度很慢(比私钥加密慢100到1000倍),
公钥的主要算法有RSA,还包括Blowfish,Diffie-Helman等。

公钥与私钥

  1. 权威数字认证机构(CA)给所有通信主体(个人或组织)颁发公钥和私钥,彼此配对,分别唯一。
  2. 私钥好比数字指纹,同时具有解密和加密功能。个人保管,不公开。
  3. 公钥好比安全性极高的挂号信箱地址,公开。

公私钥加解密举例

设若甲有一份需保密的数字商业合同发给乙签署。经过如下步骤:

  1. 甲用乙的公钥对合同加密。
  2. 密文从甲发送到乙。
  3. 乙收到密文,并用自己的私钥对其解密。
  4. 解密正确,经阅读,乙用自己的私钥对合同进行签署。
  5. 乙用甲的公钥对已经签署的合同进行加密。
  6. 乙将密文发给甲。
  7. 甲用自己的私钥将已签署合同解密。
  8. 解密正确,确认签署。

公私钥加解密说明
从以上步骤,我们知道:

  1. 用公钥加密的密文能且只能用与其唯一配对的私钥才能解开。
  2. 如果某份密文被解开,那么肯定是密文的目标信息主体解开的。
  3. 私钥因其唯一标识所有者的属性,被用于数字签名,具有法律效力。

一。 公私钥生成

  1. 随机选定两个大素数p, q.
  2. 计算公钥和私钥的公共模数 n = pq .
  3. 计算模数n的欧拉函数 φ(n) .
  4. 选定一个正整数e, 使1 < e < φ(n) , 且e与φ(n)互质.
  5. 计算d, 满足 de ≡ 1 (mod φ(n) ), (k为某个正整数).
    6.n与e决定公钥, n与d决定私钥.

二。加解密
该过程为小张给小李发消息,公钥为小李的公钥(n & e), 私钥为小李的私钥(n & d).

  1. 小张欲给小李发一个消息M, 他先把M转换为一个大数m < n, 然后用小李的公钥(n & e)把m加密为另一个大数:
    c = me mod n
  2. 小李收到小张发来的大数c, 着手解密. 通过自己的私钥(n & d), 得到原来的大数m:
    m = cd mod n
    3.再把m转换为M, 小李即得到小张的原始消息.

这个过程之所以能通过, 是因为有如下等式:
cd ≡(me)d ≡med (mod n)

参考

文章目录
  1. 1. 对称加密 - DES
  2. 2. 非对称加密 - RSA
  3. 3. 参考
,
Fork me on GitHub