美文网首页
java对称加密算法实现

java对称加密算法实现

作者: Geroge1226 | 来源:发表于2021-07-02 16:53 被阅读0次

    1、介绍

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

    image.png
    • 常见的对称算法
      DES 、3DES、 AES、PBE、 IDEA

    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、算法中的问题

    • Exception in thread "main" java.security.InvalidKeyException: Wrong key size
      DES加密,密钥必须是8个字节的。
      AES加密,密钥必须是16个字节的.
      即: key=“12345678”可以,key="123456"就会报错。

    相关文章

      网友评论

          本文标题:java对称加密算法实现

          本文链接:https://www.haomeiwen.com/subject/bfbsfltx.html