AES加密

简介

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; 
}  

 
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 高级加密标准(英语:Advanced EncryptionStandard,缩写:AES),在密码学中又称Rijn...
    黄晓果阅读 11,127评论 0 2
  • 引用 AES加密算法原理AES加密算法的C++实现密码算法详解——AES(高级加密算法) 1. 前言 本文针对加密...
    码梦的一生阅读 15,691评论 2 3
  • AES(Advanced Encryption Standard) 高级加密标准,是 DES(Data Encry...
    TIME_for阅读 4,019评论 2 2
  • 变性是不可逆的!硬化了的蛋也孵不出小鸡!留着只会腐烂发臭!
    研究说明书阅读 309评论 0 0
  • 我是一个二流大学的学生,有时候想着自己该过怎样的生活,嘿嘿,只能想想。我也曾想冲动一点不需要考虑后果,不需要害怕受...
    爱做梦地孩子阅读 549评论 1 0