美文网首页
[ 加密 ] AES 加密 目前应用最广泛的加密算法 推荐使用

[ 加密 ] AES 加密 目前应用最广泛的加密算法 推荐使用

作者: 一个好汉 | 来源:发表于2021-09-04 09:57 被阅读0次
    特殊说明

    Java标准库提供的算法实现并不包括所有的工作模式和所有填充模式,但是通常我们只需要挑选常用的使用就可以了

    AES算法是目前应用最广泛的加密算法 推荐使用

    AES 实现它
    ECB模式
    import lombok.extern.slf4j.Slf4j;
    
    import javax.crypto.Cipher;
    import javax.crypto.SecretKey;
    import javax.crypto.spec.SecretKeySpec;
    import java.nio.charset.StandardCharsets;
    import java.security.GeneralSecurityException;
    import java.util.Base64;
    
    /**
     * aes 加密解密demo
     */
    @Slf4j
    public class AesEncrypt {
    
        public static void ecb() throws Exception {
            // 原文:
            String message = "Hello, world!";
            System.out.println("Message: " + message);
            // 128位密钥 = 16 bytes Key:
            byte[] key = "1234567890abcdef".getBytes(StandardCharsets.UTF_8);
            // 加密:
            byte[] data = message.getBytes(StandardCharsets.UTF_8);
            byte[] encrypted = encrypt(key, data);
            log.info("Encrypted: {}", Base64.getEncoder().encodeToString(encrypted));
            // 解密:
            byte[] decrypted = decrypt(key, encrypted);
            log.info("Decrypted: {}", new String(decrypted, StandardCharsets.UTF_8));
        }
    
        // ecb 加密
        public static byte[] encrypt(byte[] key, byte[] input) throws GeneralSecurityException {
            Cipher cipher = Cipher.getInstance("AES/ECB/PKCS5Padding");
            SecretKey keySpec = new SecretKeySpec(key, "AES");
            cipher.init(Cipher.ENCRYPT_MODE, keySpec);
            return cipher.doFinal(input);
        }
    
        // ecb 解密
        public static byte[] decrypt(byte[] key, byte[] input) throws GeneralSecurityException {
            Cipher cipher = Cipher.getInstance("AES/ECB/PKCS5Padding");
            SecretKey keySpec = new SecretKeySpec(key, "AES");
            cipher.init(Cipher.DECRYPT_MODE, keySpec);
            return cipher.doFinal(input);
        }
    }
    
    
    CBC模式
    
    package cn.gd.cz.hong.encrypt.encryption;
    
    import lombok.extern.slf4j.Slf4j;
    
    import javax.crypto.Cipher;
    import javax.crypto.SecretKey;
    import javax.crypto.spec.IvParameterSpec;
    import javax.crypto.spec.SecretKeySpec;
    import java.nio.charset.StandardCharsets;
    import java.security.GeneralSecurityException;
    import java.security.SecureRandom;
    import java.util.Base64;
    
    /**
     * aes 加密解密demo
     */
    @Slf4j
    public class AesEncrypt {
    
    
        public static void cbc() throws Exception {
            // 原文:
            String message = "Hello, world!";
            System.out.println("Message: " + message);
            // 256位密钥 = 32 bytes Key:
            byte[] key = "1234567890abcdef1234567890abcdef".getBytes("UTF-8");
            // 加密:
            byte[] data = message.getBytes("UTF-8");
            byte[] encrypted = cbcEncrypt(key, data);
            System.out.println("Encrypted: " + Base64.getEncoder().encodeToString(encrypted));
            // 解密:
            byte[] decrypted = cbcDecrypt(key, encrypted);
            System.out.println("Decrypted: " + new String(decrypted, "UTF-8"));
        }
    
        // 加密:
        public static byte[] cbcEncrypt(byte[] key, byte[] input) throws GeneralSecurityException {
            Cipher cipher = Cipher.getInstance("AES/CBC/PKCS5Padding");
            SecretKeySpec keySpec = new SecretKeySpec(key, "AES");
            // CBC模式需要生成一个16 bytes的initialization vector:
            SecureRandom sr = SecureRandom.getInstanceStrong();
            byte[] iv = sr.generateSeed(16);
            IvParameterSpec ivps = new IvParameterSpec(iv);
            cipher.init(Cipher.ENCRYPT_MODE, keySpec, ivps);
            byte[] data = cipher.doFinal(input);
            // IV不需要保密,把IV和密文一起返回:
            return join(iv, data);
        }
    
        // 解密:
        public static byte[] cbcDecrypt(byte[] key, byte[] input) throws GeneralSecurityException {
            // 把input分割成IV和密文:
            byte[] iv = new byte[16];
            byte[] data = new byte[input.length - 16];
            System.arraycopy(input, 0, iv, 0, 16);
            System.arraycopy(input, 16, data, 0, data.length);
            // 解密:
            Cipher cipher = Cipher.getInstance("AES/CBC/PKCS5Padding");
            SecretKeySpec keySpec = new SecretKeySpec(key, "AES");
            IvParameterSpec ivps = new IvParameterSpec(iv);
            cipher.init(Cipher.DECRYPT_MODE, keySpec, ivps);
            return cipher.doFinal(data);
        }
    
        public static byte[] join(byte[] bs1, byte[] bs2) {
            byte[] r = new byte[bs1.length + bs2.length];
            System.arraycopy(bs1, 0, r, 0, bs1.length);
            System.arraycopy(bs2, 0, r, bs1.length, bs2.length);
            return r;
        }
    
    }
    
    

    相关文章

      网友评论

          本文标题:[ 加密 ] AES 加密 目前应用最广泛的加密算法 推荐使用

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