【Android工具】DES终结者加密时报——AES加密演算法
转载请注明出处: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加密演算法的更多相关文章
- 信息安全-加密:AES 加密
ylbtech-信息安全-加密:AES 加密 高级加密标准(英语:Advanced Encryption Standard,缩写:AES),在密码学中又称Rijndael加密法,是美国联邦政府采用的一 ...
- 对称加密之---AES加密
工作中常会需要让数据传输前进行加密处理.这次用到的是AES加密.AES加密中,需要注意到坑还是挺多的.对AES也进行了一番了解,发现里面的东西真的是注意的太多了.今天只是整理了一种简单的加密格式,工作 ...
- DES、3DES、AES加密方式
详见:http://blog.yemou.net/article/query/info/tytfjhfascvhzxcyt165 DES 支持8位加密解密,3Des支持24位,Aes支持32位.3De ...
- android开发 java与c# 兼容AES加密
由于android客户端采用的是AES加密,服务器用的是asp.net(c#),所以就造成了不一致的加密与解密问题,下面就贴出代码,已经试验过. using System; using System. ...
- C#实现DES加密解密,AES加密解密
DES算法描述简介: DES是Data Encryption Standard(数据加密标准)的缩写.它是由IBM公司研制的一种加密算法,美国国家标准局于1977年公布把它作为非机要部门使用的数据加密 ...
- 关于CryptoJS中md5加密以及aes加密的随笔
最近项目中用到了各种加密,其中就包括从没有接触过得aes加密,因此从网上各种查,官方的一种说法: 高级加密标准(英语:Advanced Encryption Standard,缩写:AES),在密码学 ...
- 对称加密之AES加密详解
最近有人问我AES对称加密是啥,我回答了个大概,发现自己不能清晰的讲出来,特此记录,以供学习 一.对称加密 对称加密是最快速.最简单的一种加密方式,加密(encryption)与解密(decrypti ...
- c#RSA的SHA1加密与AES加密、解密
前言:公司项目对接了一个对数据保密性要求较高的java公司.api接口逻辑是这样的:他们提供 SHA1私钥 与 AES的秘钥.我们需要将 传递查询参数 通过SHA1 私钥加密再转换成 十六进制 字符串 ...
- C#对称加密(AES加密)每次生成的密文结果不同思路代码分享
思路:使用随机向量,把随机向量放入密文中,每次解密时从密文中截取前16位,其实就是我们之前加密的随机向量. 代码 public static string Encrypt(string plainTe ...
随机推荐
- 认识Backbone (三)
Backbone.Collection(集合) collection是model对象的一个有序的组合,我们可以在集合上绑定 "change" 事件,从而当集合中的模型发生变化时f ...
- main thread starting…
例的结果,下面的: main thread starting- Thrad 2 staring- Thrad 2 end- Thrad 4 staring- Thrad 4 end- Thrad 1 ...
- HDU 1711 Number Sequence(算法验证)
该怎么做.每一个人的人生都应该自己掌握.你给不了别人一切.你也不懂别人的忧伤. 微笑不代表快乐.哭泣不一定悲伤 不努力怎么让关心你的人幸福.不努力怎么让看不起你的人绝望. 我用生命在奋斗--lx_Zz ...
- 【SEO 决胜网络索引】 课程大纲及第一部分第一课:网络营销战略中的索引
内容简介 1.课程大纲 2.第一部分第一课: 网络营销战略中的索引 3.第一部分第二课预告: 索引是什么 课程大纲 现在是网络为王的时代,人们越来越离不开互联网: SEO(Search Engine ...
- Android多线程.断点续传下载
多线程,可断点续传的demo!最早写于2010.7! /** * @brief 主界面 * @author lixp */ public class HomeActivity exten ...
- [Unity3D]Unity3D游戏开发《反对》说到游戏(上)——目标跟踪
朋友,大家好.我是秦培,欢迎关注我的博客.我的博客地址blog.csdn.net/qinyuanpei. 首先博主要自我反省,过了这么久才来更新博客,这段时间主要是在忙着写期末的作业,所以博主基本上没 ...
- 利用Ring Buffer在SQL Server 2008中进行连接故障排除
原文:利用Ring Buffer在SQL Server 2008中进行连接故障排除 出自:http://blogs.msdn.com/b/apgcdsd/archive/2011/11/21/ring ...
- MVC简单的认识
学习一个新知识,首先要了解的就是以下几个问题,它是什么?它能干什么?使用它有什么优点?这篇文章就环绕这几个问题来展开讨论. mvc不是一种编程语言,严格来说.它都不算是一门技术.它是开发软件时使用的一 ...
- 找呀志_ContentResolver操作ContentProvider数据
当需要外部的应用ContentProvider该数据被添加.删.修改和查询操作.可以使用ContentResolver 类完成 要得到ContentResolver 物,可以使用Activity提供g ...
- SQL入门学习1-查询基础
2-1 SELECT语句基础 SELECT语句作用 SELECT 语句用于从表中选取数据. 结果被存储在一个结果表中(称为结果集). 重点 使用SELECT语句从表中选取数据. 为列设定显示用的别名 ...