AES算法细节及应用

AES加密算法

特点:

AES加密算法是一种极具代表性的对称加密算法,由于其对称性,使得算法的加密和解密的结构对称,密钥也相同,算法结构比较简单。AES还有加密解密速度迅速和编码紧凑等特点,具有很大的开发潜力和较高的使用价值,被应用至信息保护,电子安全等方面及领域。AES加密和解密使用的密钥是同一个密钥,客户端和服务器端双方都需要知道加密算法和密钥,所以对于密钥的保存至关重要。AES有一些十分明显的优点,速度快,安全级别高,面向字节加密,高效,适合大量数据加密。但是存在密钥泄露而引起信息泄露的问题。

算法介绍:

AES中的操作均是以字节作为基础进行操作的,每次都是以4*4的字节矩阵进行处理的,加密过程由轮密钥开始,进行Nr轮迭代运算。前Nr-1轮每轮循环需要进行字节替换、行移位、列混合和轮密钥加运算,最后一轮则需要进行字节替换、行移位和轮密钥加运算,不需要进行列混合运算。该算法用Nr表示对数据分组加密的轮数。其中,该算法的密钥长度有三种:16byte、24byte和32byte,不同密钥长度对应着不同加密轮数和分组长度。

AES中Nk、Nb和Nr的关系
加密标准 密钥长度Nk 分组长度Nb 加密轮数Nr
128 4 4 10
192 6 4 12
256 8 4 14

AES加密流程图如下:

AES算法细节及应用_第1张图片

字节替换:AES加密算法定义了一个S盒,通过S盒可以将State矩阵每个字节映射成相应的字节,映射规则为该字节的高4位为行值,低4位为列值,找到S盒中元素进行替换。例如,十六进制数 {24}。对应 S 盒的行是2,列是4,相应的S盒中该位置对应的值是 {2c}。其实,构造S盒进行字节替换只是AES第一步进行的一系列数学运算的简化与规律总结,其中包括了取逆运算和仿射变换运算。只是因为这两种运算都是输入和输出相互一一对应的,不同的输入分别对应不同的输出,相同的输入对应相同的输出。而且8位最多表示256种代换,S盒囊括全部,所以通过存储S盒来简化字节替换。

行移位变换:行移位变换就是每一行根据相应规则进行循环左移,第一行不变,第二行移动一个字节,第三行移动两个字节,第四行移动三个字节。

AES算法细节及应用_第2张图片

列混合运算:将State矩阵每一列看作一个向量进行运算,对x4 +1取模,和多项式a(x)做乘法运算。

AES算法细节及应用_第3张图片

轮密钥加:将上一步列混合得到状态矩阵与这一轮相应的扩展密钥矩阵进行逐位异或,输出密文矩阵即为最后加密结果。

AES算法细节及应用_第4张图片

调用AES加密包:

//AES加密
//输入:content是需要加密的字符串,password是根据用户密码产生的密钥;输出:加密后的十六进制字符串
public String encrypt(String content, String password) { 
//content是需要加密的字符串,password是根据用户密码产生的密钥
    try {
        KeyGenerator kgen = KeyGenerator.getInstance("AES");// 创建AES的Key生产者
	kgen.init(128, new SecureRandom(password.getBytes()));// 利用用户密码作为随机数初始化出128位的key生产者,加密没关系,SecureRandom是生成安全随机数序列,password.getBytes()是种子,只要种子相同,序列就一样,所以解密只要password一样就行
	SecretKey secretKey = kgen.generateKey();// 根据用户密码,生成一个密钥
	byte[] enCodeFormat = secretKey.getEncoded();// 返回基本编码格式的密钥,如果此密钥不支持编码,则返回null
	SecretKeySpec key = new SecretKeySpec(enCodeFormat, "AES");// 转换为AES专用密钥
	Cipher cipher = Cipher.getInstance("AES");// 创建密码器
	byte[] byteContent = content.getBytes("utf-8");
	cipher.init(Cipher.ENCRYPT_MODE, key);// 初始化为加密模式的密码器
	byte[] result = cipher.doFinal(byteContent);// 加密
	        
	//将字节矩阵转换成string类型(将二进制转换成十六进制)
	StringBuffer sb = new StringBuffer();
	for (int i = 0; i < result.length; i++) {
	    String hex = Integer.toHexString(result[i] & 0xFF);
	    if (hex.length() == 1) {
	        hex = '0' + hex;
	    }
	    sb.append(hex.toUpperCase());
        }
	return sb.toString();
	        
	} catch (NoSuchPaddingException e) {
	    e.printStackTrace();
	} catch (NoSuchAlgorithmException e) {
	    e.printStackTrace();
	} catch (UnsupportedEncodingException e) {
	    e.printStackTrace();
	} catch (InvalidKeyException e) {
	    e.printStackTrace();
	} catch (IllegalBlockSizeException e) {
	    e.printStackTrace();
	} catch (BadPaddingException e) {
	    e.printStackTrace();
	}
    return null;
}

AES解密算法:

由于AES算法是是极具代表性的对称加密算法,因此,AES解密过程和加密过程相关,两者互为逆过程,且加密时密钥和解密时密钥相同。不过,解密开始时需要将密文先与最后一轮密钥进行异或操作。

AES解密流程如下:

AES算法细节及应用_第5张图片

调用AES解密包:

//AES解密
//输入:code是需要解密的十六进制字符串,password是根据用户密码产生的密钥;输出:明文
public String decrypt(String code, String password) throws UnsupportedEncodingException {
    try {
        //将string类型转换成字节矩阵(将十六进制转换成二进制)
        if (code.length() < 1)
	    return null;
	byte[] content = new byte[code.length() / 2];
	for (int i = 0; i < code.length() / 2; i++) {
	    int high = Integer.parseInt(code.substring(i * 2, i * 2 + 1), 16);
	    int low = Integer.parseInt(code.substring(i * 2 + 1, i * 2 + 2), 16);
	    content[i] = (byte) (high * 16 + low);
	}
	        
        KeyGenerator kgen = KeyGenerator.getInstance("AES");// 创建AES的Key生产者
        kgen.init(128, new SecureRandom(password.getBytes()));
        SecretKey secretKey = kgen.generateKey();// 根据用户密码,生成一个密钥
        byte[] enCodeFormat = secretKey.getEncoded();// 返回基本编码格式的密钥
        SecretKeySpec key = new SecretKeySpec(enCodeFormat, "AES");// 转换为AES专用密钥
        Cipher cipher = Cipher.getInstance("AES");// 创建密码器
        cipher.init(Cipher.DECRYPT_MODE, key);// 初始化为解密模式的密码器
        byte[] result = cipher.doFinal(content);
        String de_code = new String(result,"UTF-8");
        return  de_code;// 明文   
            
    } catch (NoSuchAlgorithmException e) {
        e.printStackTrace();
    } catch (NoSuchPaddingException e) {
        e.printStackTrace();
    } catch (InvalidKeyException e) {
        e.printStackTrace();
    } catch (IllegalBlockSizeException e) {
        e.printStackTrace();
    } catch (BadPaddingException e) {
        e.printStackTrace();
    }
    return null;
}

 

你可能感兴趣的:(加密算法)