AES加密

作者: 夜月行者 | 来源:发表于2017-11-27 18:20 被阅读0次

简介

AES 的出现,就是为了来替代原先的 DES 标准。现在来说,AES 的用途还是非常广泛的。
全称为“Advanced Encryption Standard”,中文名“高级加密标准”,在密码学中又称 Rijndael 加密法,是美国联邦政府采用的一种区块加密标准。AES 加密算法作为新一代的数据加密标准汇聚了强安全性、高性能、高效率、易用和灵活等优点。AES 设计有三个密钥长度:128,192,256 位。相对而言,AES 的 128 密钥比 DES 的 56 密钥强了 1021 倍。
相对来说,如果密钥长度变长,那么IV向量的长度对应的也要变长才行。应为对于块加密来说,密钥长度和IV向量的长度应该是一致的。

原理

ES 加密算法主要包括三个方面:轮变化、圈数和密钥扩展。AES 是分组密钥,算法输入 128 位数据,密钥长度也是 128 位。用 Nr 表示对一个数据分组加密的轮数。每一轮都需要一个与输入分组具有相同长度的扩展密钥 Expandedkey(i) 的参与。由于外部输入的加密密钥 K 长度有限,所以在算法中要用一个密钥扩展程序 (Keyexpansion) 把外部密钥 K 扩展成更长的比特串,以生成各轮的加密和解密密钥。

输出

入口参数有三个:key、data、mode。

  • key 为加密解密使用的密钥,长度为24字节
  • data 为加密 解密的数据,
  • mode 为其工作模式。
    密钥是192位,但是是分开使用的,每个加密快的长度应该还是8字节的整数倍
    记住:如果是有padding,如果是明文如果是8字节的整数倍的话,加密的密文长度肯定要增加8个字节,因为要有标识

java demo

注意,如果是使用的cfb,ofb等需要初始化向量的加解密,则需要把iv也传给解密器才行

/**
* 加密
 * 
* @param content 需要加密的内容
 * @param password  加密密码
* @return
 */ 
public static byte[] encrypt(String content, String password) { 
        try {            
                KeyGenerator kgen = KeyGenerator.getInstance("AES"); 
                kgen.init(128, new SecureRandom(password.getBytes())); 
                SecretKey secretKey = kgen.generateKey(); 
                byte[] enCodeFormat = secretKey.getEncoded(); 
                SecretKeySpec key = new SecretKeySpec(enCodeFormat, "AES"); 
                Cipher cipher = Cipher.getInstance("AES");// 创建密码器 
                byte[] byteContent = content.getBytes("utf-8"); 
                cipher.init(Cipher.ENCRYPT_MODE, key);// 初始化 
                byte[] result = cipher.doFinal(byteContent); 
                return result; // 加密 
        } catch (NoSuchAlgorithmException e) { 
                e.printStackTrace(); 
        } catch (NoSuchPaddingException e) { 
                e.printStackTrace(); 
        } catch (InvalidKeyException e) { 
                e.printStackTrace(); 
        } catch (UnsupportedEncodingException e) { 
                e.printStackTrace(); 
        } catch (IllegalBlockSizeException e) { 
                e.printStackTrace(); 
        } catch (BadPaddingException e) { 
                e.printStackTrace(); 
        } 
        return null; 
} 
 
2.2 解密
代码有详细注释,不多废话
注意:解密的时候要传入byte数组
[java] view plain copy
/**解密
 * @param content  待解密内容
* @param password 解密密钥
* @return
 */ 
public static byte[] decrypt(byte[] content, String password) { 
        try { 
                 KeyGenerator kgen = KeyGenerator.getInstance("AES"); 
                 kgen.init(128, new SecureRandom(password.getBytes())); 
                 SecretKey secretKey = kgen.generateKey(); 
                 byte[] enCodeFormat = secretKey.getEncoded(); 
                 SecretKeySpec key = new SecretKeySpec(enCodeFormat, "AES");             
                 Cipher cipher = Cipher.getInstance("AES");// 创建密码器 
                cipher.init(Cipher.DECRYPT_MODE, key);// 初始化 
                byte[] result = cipher.doFinal(content); 
                return result; // 加密 
        } 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; 
}  

/**解密
 * @param content  待解密内容
* @param password 解密密钥
* @return
 */ 
public static byte[] decrypt(byte[] content, String password) { 
        try { 
                 KeyGenerator kgen = KeyGenerator.getInstance("AES"); 
                 kgen.init(128, new SecureRandom(password.getBytes())); 
                 SecretKey secretKey = kgen.generateKey(); 
                 byte[] enCodeFormat = secretKey.getEncoded(); 
                 SecretKeySpec key = new SecretKeySpec(enCodeFormat, "AES");             
                 Cipher cipher = Cipher.getInstance("AES");// 创建密码器 
//            Cipher cipher = Cipher.getInstance("AES/CFB/NoPadding");// 这里使用的是这种方式的话,在下面的init处就会报错,因为没有传入iv向量
                cipher.init(Cipher.DECRYPT_MODE, key);// 初始化 
                byte[] result = cipher.doFinal(content); 
                return result; // 加密 
        } 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; 
}  

 

相关文章

网友评论

      本文标题:AES加密

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