您的位置:首页 > 编程语言 > Java开发

关于AES算法及JAVA中的实现

2014-09-04 22:19 513 查看

什么是AES

密码学中的高级加密标准(Advanced Encryption Standard,AES),又称Rijndael加密法,是美国联邦政府采用的一种区块加密标准。这个标准用来替代原先的DES,已经被多方分析且广为全世界所使用。

基本原理

AES 是一个迭代的、对称密钥分组的密码,它可以使用128、192 和 256 位密钥,并且用 128 位(16字节)分组加密和解密数据。与公共密钥密码使用密钥对不同,对称密钥密码使用相同的密钥加密和解密数据。通过分组密码返回的加密数据的位数与输入数据相同。迭代加密使用一个循环结构,在该循环中重复置换和替换输入数据。

java中的AES

五种模式

ECB(电子密码本 (Electronic Code Book))

CBC(密码块链接 (Cipher Block Chaining))

CFB(密码反馈方式 (Cipher Feedback Mode))

OFB(输出反馈方式 (Output Feedback Mode))

PCBC(填充密码块链接 (Propagating Cipher Block Chaining))

JCE中AES支持上述五种模式:CBC,CFB,ECB,OFB,PCBC

不支持“NONE”模式

不同模式的优缺点见 这里

深入到原理级的介绍见 这里

三种填充

支持三种填充:NoPadding,PKCS5Padding,ISO10126Padding

不支持SSL3Padding

默认的模式和填充

不带模式和填充来获取AES算法的时候,其默认使用ECB/PKCS5Padding

关于加密前后的长度

算法/模式/填充                   16字节加密后数据长度         不满16字节加密后长度
AES/CBC/NoPadding              16                         不支持
AES/CBC/PKCS5Padding           32                         16
AES/CBC/ISO10126Padding        32                         16
AES/CFB/NoPadding              16                         原始数据长度
AES/CFB/PKCS5Padding           32                         16
AES/CFB/ISO10126Padding        32                         16
AES/ECB/NoPadding              16                         不支持
AES/ECB/PKCS5Padding           32                         16
AES/ECB/ISO10126Padding        32                         16
AES/OFB/NoPadding              16                         原始数据长度
AES/OFB/PKCS5Padding           32                         16
AES/OFB/ISO10126Padding        32                         16
AES/PCBC/NoPadding             16                         不支持
AES/PCBC/PKCS5Padding          32                         16
AES/PCBC/ISO10126Padding       32                         16

可以看到,在原始数据长度为16的整数倍时,假如原始数据长度等于16n,则使用NoPadding时加密后数据长度等于16n,其它情况下加密数据长度等于16(n+1)。在不足16的整数倍的情况下,假如原始数据长度等于16n+m[其中m小于16],除了NoPadding填充之外的任何方式,加密数据长度都等于16*(n+1);NoPadding填充情况下,CBC、ECB和PCBC三种模式是不支持的,CFB、OFB两种模式下则加密数据长度等于原始数据长度。

摘自 这里

示例代码

SecretKeySpec skeySpec = new SecretKeySpec(key, "AES");
Cipher cipher = Cipher.getInstance("AES");
//cipher.init(Cipher.DECRYPT_MODE, skeySpec);    //解密模式
cipher.init(Cipher.ENCRYPT_MODE, skeySpec);    //加密模式
cipher.doFinal(src);

详细请见 这里
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: