转载请注明出处:http://blog.csdn.net/zhaokaiqiang1992

在前面的两篇文章中。我们介绍了DES算法,3DES算法以及他们的Android程序实现,并研究了怎样才干实现不同平台下加密算法的一致性。

只是话说起来,DES算法是在1976年被美国的国家标准局定为联邦资料的加密标准的,到如今已经接近40年了。我们都知道。在计算机的世界里有一个摩尔定律。就是每过18个月。计算机的晶体管的数量就会翻一番,相应的计算速度也会翻倍,尽管如今的发展速度有所放缓,可是每过三年左右,计算机的运算速度还是在翻倍的增长。DES採用的是56的加密密钥,在计算机计算能力飞速发展的今天,已经不再安全,经过算法优化的暴力破解方式能在一天之内就将DES密钥破解,因此,DES加密仅仅推荐使用在加密等级不高的场景中。既然DES加密算法不再安全,那么有没有更加强大的加密算法呢?当然有!今天给大家介绍的,就是如今被金融机构等对安全性要求等级非常高的机构所广泛应用的加密算法——AES加密。

高级加密标准(英语:Advanced Encryption Standard。缩写:AES)。在password学中又称Rijndael加密法,是美国联邦政府採用的一种区块加密标准。这个标准用来替代原先的DES。已经被多方分析且广为全世界所使用。经过五年的甄选流程,高级加密标准由美国国家标准与技术研究院(NIST)于2001年11月26日公布于FIPS PUB 197。并在2002年5月26日成为有效的标准。

2006年。高级加密标准已然成为对称密钥加密中最流行的算法之中的一个。

严格地说,AES和Rijndael加密法并不全然一样(尽管在实际应用中二者能够互换)。由于Rijndael加密法能够支持更大范围的区块和密钥长度:AES的区块长度固定为128 比特,密钥长度则能够是128,192或256比特;而Rijndael使用的密钥和区块长度能够是32位的整数倍,以128位为下限。256比特为上限。加密过程中使用的密钥是由Rijndael密钥生成方案产生。

截至2006年,针对AES唯一的成功攻击是旁道攻击。

美国国家安全局审核了全部的參与竞选AES的终于入围者(包含Rijndael)。觉得他们均能够满足美国政府传递非机密文件的安全须要。2003年6月。美国政府宣布AES能够用于加密机密文件。

这标志着。由美国国家安全局NSA批准在最高机密信息上使用的加密系统首次能够被公开使用。很多大众化产品仅仅使用128位密钥当作默认值;由于最高机密文件的加密系统必须保证数十年以上的安全性,故猜測NSA可能觉得128位太短。才以更长的密钥长度为最高机密的加密保留了安全空间。

通常破解一个区块加密系统最常见的方式。是先对其较弱版本号(加密循环次数较少)尝试各种攻击。AES中128位密钥版本号有10个加密循环。192比特密钥版本号有12个加密循环,256比特密钥版本号则有14个加密循环。至2006年为止,最著名的攻击是针对AES 7次加密循环的128位密钥版本号,8次加密循环的192比特密钥版本号,和9次加密循环的256比特密钥版本号所作的攻击。

因此,在当前阶段来说,AES加密是非常安全的,因此能够用来对我们的敏感数据进行加密。以下给出android平台下AES加密的代码实现。

须要注意的是。在4.2以上的版本号中,SecureRandom实例的获取方式发生了变化,因此为了兼容高版本号。加入了版本号推断。

package com.example.androiddemo;

import java.security.SecureRandom;

import javax.crypto.Cipher;
import javax.crypto.KeyGenerator;
import javax.crypto.SecretKey;
import javax.crypto.spec.SecretKeySpec; import android.annotation.SuppressLint; /**
*
* @ClassName: com.example.androiddemo.AESUtil
* @Description: AES加密解密工具类
* @author zhaokaiqiang
* @date 2014-11-15 上午10:08:44
*
*/
@SuppressLint("TrulyRandom")
public class AESUtil { private final static String HEX = "0123456789ABCDEF";
private final static int JELLY_BEAN_4_2 = 17; /**
* 加密
*
* @param key
* 密钥
* @param src
* 加密文本
* @return
* @throws Exception
*/
public static String encrypt(String key, String src) throws Exception {
byte[] rawKey = getRawKey(key.getBytes());
byte[] result = encrypt(rawKey, src.getBytes());
return toHex(result);
} /**
* 解密
*
* @param key
* 密钥
* @param encrypted
* 待揭秘文本
* @return
* @throws Exception
*/
public static String decrypt(String key, String encrypted) throws Exception {
byte[] rawKey = getRawKey(key.getBytes());
byte[] enc = toByte(encrypted);
byte[] result = decrypt(rawKey, enc);
return new String(result);
} /**
* 获取256位的加密密钥
*
* @param seed
* @return
* @throws Exception
*/
@SuppressLint("TrulyRandom")
private static byte[] getRawKey(byte[] seed) throws Exception {
KeyGenerator kgen = KeyGenerator.getInstance("AES");
SecureRandom sr = null;
// 在4.2以上版本号中,SecureRandom获取方式发生了改变
if (android.os.Build.VERSION.SDK_INT >= JELLY_BEAN_4_2) {
sr = SecureRandom.getInstance("SHA1PRNG", "Crypto");
} else {
sr = SecureRandom.getInstance("SHA1PRNG");
}
sr.setSeed(seed);
// 256 bits or 128 bits,192bits
kgen.init(256, sr);
SecretKey skey = kgen.generateKey();
byte[] raw = skey.getEncoded();
return raw;
} /**
* 真正的加密过程
*
* @param key
* @param src
* @return
* @throws Exception
*/
private static byte[] encrypt(byte[] key, byte[] src) throws Exception {
SecretKeySpec skeySpec = new SecretKeySpec(key, "AES");
Cipher cipher = Cipher.getInstance("AES");
cipher.init(Cipher.ENCRYPT_MODE, skeySpec);
byte[] encrypted = cipher.doFinal(src);
return encrypted;
} /**
* 真正的解密过程
*
* @param key
* @param encrypted
* @return
* @throws Exception
*/
private static byte[] decrypt(byte[] key, byte[] encrypted)
throws Exception {
SecretKeySpec skeySpec = new SecretKeySpec(key, "AES");
Cipher cipher = Cipher.getInstance("AES");
cipher.init(Cipher.DECRYPT_MODE, skeySpec);
byte[] decrypted = cipher.doFinal(encrypted);
return decrypted;
} public static String toHex(String txt) {
return toHex(txt.getBytes());
} public static String fromHex(String hex) {
return new String(toByte(hex));
} public static byte[] toByte(String hexString) {
int len = hexString.length() / 2;
byte[] result = new byte[len];
for (int i = 0; i < len; i++)
result[i] = Integer.valueOf(hexString.substring(2 * i, 2 * i + 2),
16).byteValue();
return result;
} public static String toHex(byte[] buf) {
if (buf == null)
return "";
StringBuffer result = new StringBuffer(2 * buf.length);
for (int i = 0; i < buf.length; i++) {
appendHex(result, buf[i]);
}
return result.toString();
} private static void appendHex(StringBuffer sb, byte b) {
sb.append(HEX.charAt((b >> 4) & 0x0f)).append(HEX.charAt(b & 0x0f));
}
}

版权声明:本文博主原创文章,博客,未经同意不得转载。

【Android工具】DES终结者加密时报——AES加密演算法的更多相关文章

  1. 信息安全-加密:AES 加密

    ylbtech-信息安全-加密:AES 加密 高级加密标准(英语:Advanced Encryption Standard,缩写:AES),在密码学中又称Rijndael加密法,是美国联邦政府采用的一 ...

  2. 对称加密之---AES加密

    工作中常会需要让数据传输前进行加密处理.这次用到的是AES加密.AES加密中,需要注意到坑还是挺多的.对AES也进行了一番了解,发现里面的东西真的是注意的太多了.今天只是整理了一种简单的加密格式,工作 ...

  3. DES、3DES、AES加密方式

    详见:http://blog.yemou.net/article/query/info/tytfjhfascvhzxcyt165 DES 支持8位加密解密,3Des支持24位,Aes支持32位.3De ...

  4. android开发 java与c# 兼容AES加密

    由于android客户端采用的是AES加密,服务器用的是asp.net(c#),所以就造成了不一致的加密与解密问题,下面就贴出代码,已经试验过. using System; using System. ...

  5. C#实现DES加密解密,AES加密解密

    DES算法描述简介: DES是Data Encryption Standard(数据加密标准)的缩写.它是由IBM公司研制的一种加密算法,美国国家标准局于1977年公布把它作为非机要部门使用的数据加密 ...

  6. 关于CryptoJS中md5加密以及aes加密的随笔

    最近项目中用到了各种加密,其中就包括从没有接触过得aes加密,因此从网上各种查,官方的一种说法: 高级加密标准(英语:Advanced Encryption Standard,缩写:AES),在密码学 ...

  7. 对称加密之AES加密详解

    最近有人问我AES对称加密是啥,我回答了个大概,发现自己不能清晰的讲出来,特此记录,以供学习 一.对称加密 对称加密是最快速.最简单的一种加密方式,加密(encryption)与解密(decrypti ...

  8. c#RSA的SHA1加密与AES加密、解密

    前言:公司项目对接了一个对数据保密性要求较高的java公司.api接口逻辑是这样的:他们提供 SHA1私钥 与 AES的秘钥.我们需要将 传递查询参数 通过SHA1 私钥加密再转换成 十六进制 字符串 ...

  9. C#对称加密(AES加密)每次生成的密文结果不同思路代码分享

    思路:使用随机向量,把随机向量放入密文中,每次解密时从密文中截取前16位,其实就是我们之前加密的随机向量. 代码 public static string Encrypt(string plainTe ...

随机推荐

  1. 乐在其中设计模式(C#) - 工厂方法模式(Factory Method Pattern)

    原文:乐在其中设计模式(C#) - 工厂方法模式(Factory Method Pattern) [索引页][源码下载] 乐在其中设计模式(C#) - 工厂方法模式(Factory Method Pa ...

  2. SQL中IN,NOT IN,EXISTS,NOT EXISTS的用法和差别

    SQL中IN,NOT IN,EXISTS,NOT EXISTS的用法和差别: IN:确定给定的值是否与子查询或列表中的值相匹配. IN 关键字使您得以选择与列表中的任意一个值匹配的行. 当要获得居住在 ...

  3. 解决mysqldb查询大量数据导致内存使用过高的问题

    1.源码 connection=MySQLdb.connect( host="thehost",user="theuser", passwd="the ...

  4. 2014百度之星预赛(第二场)——Best Financing

    2014百度之星预赛(第二场)--Best Financing Problem Description 小A想通过合理投资银行理財产品达到收益最大化.已知小A在未来一段时间中的收入情况,描写叙述为两个 ...

  5. Swift学习笔记7:关闭

    闭包 捕 引用和将其存储在任意常量和变量的上下文. Swift 你会管理 捕获 过程中涉及到的内存操作. 在 函数 章节中介绍的全局和嵌套函数实际上也是特殊的闭包,闭包採取例如以下三种形式之中的一个: ...

  6. 纯洁CSS实现下拉菜单和下拉容器(纯洁CSS导航栏和导航下拉容器)

    虽然网上课程似即使案件大同小异,但我还是写,记笔记,也为您提供参考 我希望你能指导批评~~ 首先,我们必须列出ul li 开始我们的导航栏菜单也能说生产: 在下面的页面,我们先建XHTML结构体: & ...

  7. 类似的微博推断客户关系sql声明

    类别似新浪微博的关注和共同关心 不知道别人是怎么设计的. 反正我是例如以下设计的 ID   USER   FRIEND 1     A         B 2      B         A 3   ...

  8. etl工具,kettle实现了周期

    Kettle这是国外的来源ETL工具,纯java写.能Window.Linux.Unix在执行.绿色无需安装,稳定高效的数据提取. 业务模型: 在关系型数据库中有张非常大的数据存储表,被设计成奇偶库存 ...

  9. MKNetWorkKit打印URL

    -(void)initNewUrl:(NSString *)urlString param:(NSMutableDictionary *)_paramDic{ //拼接參数至URL NSMutable ...

  10. HTM5 之 Canvas save 、restore 恢复画布状态的理解

    save是用来保存canvas状态,这句话很关键,意思是指后续对canvas的操作:平移.放缩.旋转.错切.裁剪等可以恢复. 我之前一直没能理解,认为对画布的画线等操作也可以恢复,其实不是这样子的,只 ...