java对称加密算法实现

2021-07-02  本文已影响0人  Geroge1226

1、介绍

对称加密算法:单密钥同时作用与加密和解密的加密算法称为对称算法。
特点:加密秘钥= 解密秘钥
对称加密示意图如下:

image.png

2、各种对称算法说明

2.1、DES( Data Encryption Standard ) 数据加密标准。

DES密钥长度固定8位,
java实现代码:

import com.service.common.Constants;
import javax.crypto.*;
import javax.crypto.spec.DESKeySpec;
import javax.crypto.spec.IvParameterSpec;
import javax.crypto.spec.SecretKeySpec;
import java.io.*;
import java.math.BigInteger;
import java.security.Key;
import java.security.SecureRandom;

public class DESUtils {
    private final static String DES = "DES";

    public static void main(String args[]) throws Exception {
        String aa ="123";
        String str1 = encrypt("owRHXv-1oOfvuduvCuGReu3WPNz4", Constants.SALT);
        System.out.println(str1);
        String str2 = decrypt(str1, Constants.SALT);
        System.out.println(str2);
    }

    // 加密
    public static byte[] encrypt(byte[] data, byte[] key) throws Exception {
        Cipher cipher = Cipher.getInstance(DES);
        DESKeySpec ds = new DESKeySpec(key);
        SecureRandom sr = new SecureRandom();
        SecretKeyFactory skfactory = SecretKeyFactory.getInstance(DES);
        SecretKey skey = skfactory.generateSecret(ds);
        cipher.init(Cipher.ENCRYPT_MODE, skey, sr);
        byte[] b = cipher.doFinal(data);
        return b;
    }
    // 加密
    public static String encrypt(String data, String key) throws Exception {
        return byte2hex(encrypt(data.getBytes(), key.getBytes()));
    }
    // 解密
    public static byte[] decrypt(byte[] data, byte[] key) throws Exception {
        Cipher cipher = Cipher.getInstance(DES);
        DESKeySpec ds = new DESKeySpec(key);
        SecureRandom sr = new SecureRandom();
        SecretKeyFactory skfactory = SecretKeyFactory.getInstance(DES);
        SecretKey skey = skfactory.generateSecret(ds);
        cipher.init(Cipher.DECRYPT_MODE, skey, sr);
        return cipher.doFinal(data);
    }
    // 解密
    public static String decrypt(String data, String key) throws Exception {
        return new String(decrypt(hex2byte(data.getBytes()), key.getBytes()));
    }
    private static String byte2hex(byte[] b) {
        StringBuilder hs = new StringBuilder();
        String stmp;
        for (int n = 0; b != null && n < b.length; n++) {
            stmp = Integer.toHexString(b[n] & 0XFF);
            if(stmp.length() == 1){
                hs.append('0');
            }
            hs.append(stmp);
        }
        return hs.toString().toUpperCase();
    }

    private static byte[] hex2byte(byte[] b) {
        if((b.length % 2) != 0){
            throw new IllegalArgumentException();
        }
        byte[] b2 = new byte[b.length / 2];
        for (int n = 0; n < b.length; n += 2) {
            String item = new String(b, n, 2);
            b2[n / 2] = (byte) Integer.parseInt(item, 16);
        }
        return b2;
    }

【解析】

java实现加密过程:
a、初始DES密钥器:
DESKeySpec dks = new DESKeySpec(key);
b、实例化密钥工厂:
SecretKeyFactory keyFactory=SecretKeyFactory.getInstance(KEY_ALGORITHM);
c、通过工厂生产密钥
SecretKey secretKey = keyFactory.generateSecret(dks);
d、实例化密码器,并初始化
Cipher cipher = Cipher.getInstance(CIPHER_ALGORITHM);
// 初始化,设置为加密模式
cipher.init(Cipher.ENCRYPT_MODE, k);
e、加密返回加密后的byte[]
byte[] b = cipher.doFinal(data);

解密和加密流程一致,区别在于cipher.init(密码器初始化)选择的加密模式不同:
加密--Cipher.ENCRYPT_MODE;解密-- Cipher.DECRYPT_MODE

2.2 、3DES(三重DES算法)
2.3 、AES (Advanced Encryption Standard)高级加密标准。

微信小程序加密传输就是用这个加密算法

2.4 、IDEA(International Data Algorithm) 国际数据加密标准。
2.5、PBE(Password Based Encryption) 基于口令加密。

3、算法中的问题

上一篇下一篇

猜你喜欢

热点阅读