当前位置:K88软件开发文章中心编程语言JavaJava01 → 文章内容

java对称密码算法的使用DES/3DES/AES算法

减小字体 增大字体 作者:佚名  来源:网上搜集  发布时间:2019-1-4 7:54:41

-->

对称密码概述

DES 算法的编程使用

3DES 算法的编程使用

AES 算法的编程使用

对称密码概述 — 对称密码的概念

1.加密密钥和解密密钥相同,对于大多数对称密码算法,加解密过程互逆

2.加解密通信模型

3.特点:算法公开、计算量小、加密速度快、加密效率高

4.弱点:双方都使用同样密钥,安全性得不到保证

5.分组密码工作模式

(1)ECB:电子密码本? (4)OFB:输出反馈

(2)CBC:密文链接? (5)CTR:计数器

(3)CFB:密文反馈

6.分组密码填充方式

(1)NoPadding

(2)PKCS5Padding

(3)ISO10126Padding

常用对称密码:

(1)DES(Data Encryption Standard)

(2)3DES(Triple DES、DESede)

(3)AES(Advanced Encryption Standard)

DES 算法的编程使用 — DES 算法基本概念

1.DES:数据加密标准,是对称加密算法领域中的典型算法

2.特点:密钥偏短(56位)、生命周期短

3.JDK实现

1.生成密钥

1
2
3
4
5
6
7
8
9
10
11
//KeyGenerator ,密钥生成器

KeyGenerator keyGen = KeyGenerator.getInstance("DES");

//初始化密钥生成器

keyGen.init(56);

//生成密钥

SecretKey secretKey = keyGen.generateKey();

2.加/解密

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
//恢复密钥

SecretKey secretKey = new SecretKeySpec(key, "DES");

//Cipher 完成加密或解密工作

Cipher cipher = Cipher.getInstance("DES");

// 根据密钥,对Cipher 初始化,ENCRYPT_MODE、 DECRYPT_MODE

cipher.init(Cipher.ENCRYPT_MODE, secretKey);

// 加密或解密

byte[] cipherByte = cipher.doFinal(data);
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
import java.security.NoSuchAlgorithmException;

import javax.crypto.Cipher;
import javax.crypto.KeyGenerator;
import javax.crypto.NoSuchPaddingException;
import javax.crypto.SecretKey;
import javax.crypto.spec.SecretKeySpec;

public class AESUtil {

    /*
     * 生成密钥
     */

    public static byte[] initKey() throws NoSuchAlgorithmException{
        KeyGenerator keyGen = KeyGenerator.getInstance("AES");
        keyGen.init(256);  //192 256
        SecretKey secretKey = keyGen.generateKey();
        return secretKey.getEncoded();
    }
   
    /*
     * AES 加密
     */

    public static byte[] encrypt(byte[] data, byte[] key) throws Exception{
        SecretKey secretKey = new SecretKeySpec(key, "AES");
       
        Cipher cipher = Cipher.getInstance("AES");
        cipher.init(Cipher.ENCRYPT_MODE, secretKey);
        byte[] cipherBytes = cipher.doFinal(data);
        return cipherBytes;
    }
   
   
    /*
     * AES 解密
     */

    public static byte[] decrypt(byte[] data, byte[] key) throws Exception{
        SecretKey secretKey = new SecretKeySpec(key, "AES");
       
        Cipher cipher = Cipher.getInstance("AES");
        cipher.init(Cipher.DECRYPT_MODE, secretKey);
        byte[] plainBytes = cipher.doFinal(data);
        return plainBytes;
    }
   
}

3DES 算法的编程使用 — 3DES 算法基本概念

  1. 3DES:将密钥长度增至112位或168位,通过增加迭代次数提高安全性
  2. 缺点:处理速度较慢、密钥计算时间较长、加密效率不高
  3. JDK实现
1
2
3
4
5
6
7
1.生成密钥

KeyGenerator keyGen = KeyGenerator.getInstance("DESede");

keyGen.init(168); ?//可指定密钥长度为112或168,默认为168

SecretKey secretKey = keyGen.generateKey();

2.加/解密

1
2
3
4
5
6
7
SecretKey secretKey = new SecretKeySpec(key, "DESede");

Cipher cipher = Cipher.getInstance("DESede");

cipher.init(Cipher.ENCRYPT_MODE, secretKey);

byte[] cipherByte = cipher.doFinal(data);

AES 算法的编程使用

1.AES:高级数据加密标准,能够有效抵御已知的针对DES算法的所有攻击

2.特点:密钥建立时间短、灵敏性好、内存需求低、安全性高

3.JDK实现

1.生成密钥

1
2
3
4
5
KeyGenerator keyGen = KeyGenerator.getInstance("AES");

keygen.init(128); ?//默认128,获得无政策权限后可为192或256

SecretKey secretKey = keyGen.generateKey();

2.加/解密

1
2
3
4
5
6
7
SecretKey secretKey = new SecretKeySpec(key, "AES");

Cipher cipher = Cipher.getInstance("AES");

cipher.init(Cipher.ENCRYPT_MODE, secretKey);

byte[] cipherByte = cipher.doFinal(data);
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
import java.security.NoSuchAlgorithmException;

import javax.crypto.Cipher;
import javax.crypto.KeyGenerator;
import javax.crypto.NoSuchPaddingException;
import javax.crypto.SecretKey;
import javax.crypto.spec.SecretKeySpec;


public class DESUtil {
   
    /*
     * 生成密钥
     */

    public static byte[] initKey() throws Exception{
        KeyGenerator keyGen = KeyGenerator.getInstance("DES");
        keyGen.init(56);
        SecretKey secretKey = keyGen.generateKey();
        return secretKey.getEncoded();
    }

   
    /*
     * DES 加密
     */

    public static byte[] encrypt(byte[] data, byte[] key) throws Exception{
        SecretKey secretKey = new SecretKeySpec(key, "DES");
       
        Cipher cipher = Cipher.getInstance("DES/ECB/PKCS5Padding");
        cipher.init(Cipher.ENCRYPT_MODE, secretKey);
        byte[] cipherBytes = cipher.doFinal(data);
        return cipherBytes;
    }
   
   
    /*
     * DES 解密
     */

    public static byte[] decrypt(byte[] data, byte[] key) throws Exception{
        SecretKey secretKey = new SecretKeySpec(key, "DES");
       
        Cipher cipher = Cipher.getInstance("DES/ECB/PKCS5Padding");
        cipher.init(Cipher.DECRYPT_MODE, secretKey);
        byte[] plainBytes = cipher.doFinal(data);
        return plainBytes;
    }  
   
}

java对称密码算法的使用DES/3DES/AES算法