20190802 AES加解密

常用的加密解密算法

高级加密标准(英语:Advanced Encryption Standard,缩写:AES)

对称加密算法也就是加密和解密用相同的密钥。

AES加密函数,AES解密函数。

20190802 AES加解密_第1张图片

密钥K:用来加密明文的密码,在对称加密算法中,加密与解密的密钥是相同的。密钥为接收方与发送方协商产生,但不可以直接在网络上传输,否则会导致密钥泄漏,通常是通过非对称加密算法加密密钥,然后再通过网络传输给对方,或者直接面对面商量密钥。密钥是绝对不可以泄漏的,否则会被攻击者还原密文,窃取机密数据。

1)密钥k不可以直接在网络上传输,否则会导致密钥泄漏。

2)通过非对称加密算法加密密钥,再通过网络传输给对方,或者直接面对面商量密钥。

 

设AES加密函数为E,则 C = E(K, P),其中P为明文,K为密钥,C为密文。也就是说,把明文P和密钥K作为加密函数的参数输入,则加密函数E会输出密文C。

(明文,密钥,密文,加密函数)

 

对称加密算法

加密和解密用到的密钥是相同的,这种加密方式加密速度非常快,适合经常发送数据的场合。缺点是密钥的传输比较麻烦。

非对称加密算法

加密和解密用的密钥是不同的,这种加密方式是用数学上的难解问题构造的,通常加密解密的速度比较慢,适合偶尔发送数据的场合。优点是密钥传输方便。常见的非对称加密算法为RSA。

 

实际中,一般是通过RSA加密AES的密钥,传输到接收方,接收方解密得到AES密钥,然后发送方和接收方用AES密钥来通信。

AES的密钥------->用RSA加密------->传输到接收方------->解密得到AES密钥

 

怎么理解密钥K?

密钥其实就是一个字符串,可以自己定义。

 

package com.yunque.www.springbootdemo.utils;

import org.apache.tomcat.util.codec.binary.Base64;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import javax.crypto.Cipher;
import javax.crypto.spec.SecretKeySpec;

/**
 * 加解密工具类
 */
public class EncryptUtils {

    private Logger logger = LoggerFactory.getLogger(this.getClass());

    public String encryptType;
    public static String aesKey;

    static {
        EncryptUtils encryptUtils = new EncryptUtils();
        //设置密钥
        encryptUtils.setAesKey("zJJ$c5md3uuhW00W");
        //设置加解密算法
        encryptUtils.setEncryptType("AES");

    }

    public EncryptUtils() {

    }

    public String getEncryptType() {
        return encryptType;
    }

    public void setEncryptType(String encryptType) {
        this.encryptType = encryptType;
    }

    public static String getAesKey() {
        return aesKey;
    }

    public static void setAesKey(String aesKey) {
        EncryptUtils.aesKey = aesKey;
    }

    /**
     * 加密处理
     *
     * @param input
     * @return
     */
    public static String encrypt(String input) {
        if (null == input) {
            return null;
        } else {
            try {
                Object var1 = null;
                SecretKeySpec aes = new SecretKeySpec(aesKey.getBytes(), "AES");
                Cipher cipher = Cipher.getInstance("AES/ECB/PKCS5Padding");
                cipher.init(Cipher.ENCRYPT_MODE, aes);
                byte[] bytes = cipher.doFinal(input.getBytes());
                return new String(Base64.encodeBase64(bytes));
            } catch (Exception e) {
                e.printStackTrace();
                return null;
            }
        }
    }

    /**
     * 解密处理
     *
     * @param input 输入参数
     * @return
     */
    public static String dencrypt(String input) {
        if (null == input) {
            return null;
        } else {
            try {
                byte[] bytes = input.getBytes();
                byte[] aesArray = Base64.decodeBase64(bytes);
                SecretKeySpec aes = new SecretKeySpec(aesKey.getBytes(), "AES");
                Cipher cipher = Cipher.getInstance("AES/ECB/PKCS5Padding");
                cipher.init(Cipher.DECRYPT_MODE, aes);
                byte[] crypt = cipher.doFinal(aesArray);
                return new String(crypt);
            } catch (Exception e) {
                e.printStackTrace();
                return null;
            }
        }
    }


    public static void main(String[] args) {
        //todo:对称加密  手机号
        //1)两次密码的md5值是一样的,密码不可以是明文
        //2)手机号加密解密处理
        String phone = "13024112580";
        String result = encrypt(phone);
        System.out.println(result);

        String secrt = "RM2u9gTX+tBS5+Cv6/xnBg==";
        String dencrypt = dencrypt(secrt);
        System.out.println(dencrypt);
    }


}

Base64是一种基于64个字符的编码算法

为什么要进行base64编码

base64 最早就是用来邮件传输协议中的,原因是邮件传输协议只支持 ascii 字符传递,因此如果要传输二进制文件,如:图片、视频是无法实现的。因此 base64 就可以用来将二进制文件内容编码为只包含 ascii 字符的内容

我们知道在计算机中任何数据都是按ascii码存储的,而ascii码的128~255之间的值是不可见字符。而在网络上交换数据时,比如说从A地传到B地,往往要经过多个路由设备,由于不同的设备对字符的处理方式有一些不同,这样那些不可见字符就有可能被处理错误,这是不利于传输的。所以就先把数据先做一个Base64编码,统统变成可见字符,这样出错的可能性就大降低了。

System.out.println(new String(Base64.encodeBase64("123".getBytes())));
System.out.println(new String(Base64.decodeBase64("MTIz".getBytes())));

 

对证书来说,特别是根证书,一般都是作Base64编码的,因为它要在网上被许多人下载。电子邮件的附件一般也作Base64编码的,因为一个附件数据往往是有不可见字符的。视频,文件都需要经过Base64才能在网络中进行传输。

你可能感兴趣的:(服务器端)