如下代码中在生成密钥的时候,基于password , 这里的SequreRandom ,以password设置了种子后,便会产生同等序列的随机值, 因此解密方知道password 便可以解密 , 当然也得基于同等的SequereRandom. 但是android 把此类的SequreRandom 4.2 后做了修改,因为有可预测破解的风险, 所以此类实现方式,太依赖于系统实现,已经不可取了。 况且此类方式,产生固定不变的密文 ,容易破解。
详细情况参考文档,解释了问题 ,以及提出了相关的方案。
http://www.tuicool.com/articles/Zn6ZFny
http://netsecurity.51cto.com/art/201304/389999.htm
package widget; import java.security.SecureRandom; import javax.crypto.Cipher; import javax.crypto.KeyGenerator; import javax.crypto.SecretKey; import javax.crypto.spec.SecretKeySpec; /** * @author carlos carlosk@163.com * @version 创建时间:2012-5-17 上午9:48:35 类说明 */ public class AESUtils { public static final String TAG = "AESUtils"; public static String encrypt(String key, String src) throws Exception { byte[] rawKey = getRawKey(key.getBytes()); byte[] result = encrypt(rawKey, src.getBytes()); return toHex(result); } 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); } private static byte[] getRawKey(byte[] seed) throws Exception { KeyGenerator kgen = KeyGenerator.getInstance("AES"); // SHA1PRNG 强随机种子算法, 要区别4.2以上版本的调用方法 SecureRandom sr = null; if (android.os.Build.VERSION.SDK_INT >= 17) { sr = SecureRandom.getInstance("SHA1PRNG", "Crypto"); } else { sr = SecureRandom.getInstance("SHA1PRNG"); } sr.setSeed(seed); kgen.init(256, sr); //256 bits or 128 bits,192bits SecretKey skey = kgen.generateKey(); byte[] raw = skey.getEncoded(); return raw; } 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; } 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 final static String HEX = "0123456789ABCDEF"; private static void appendHex(StringBuffer sb, byte b) { sb.append(HEX.charAt((b>>4)&0x0f)).append(HEX.charAt(b&0x0f)); } }
相关推荐
android 可以使用的 AES加密工具类
在本文中,我们将深入探讨Android环境下如何实现AES加密解密,以及如何修改加密过程中的关键参数——密钥(key)和偏移量(initialization vector,简称IV)。 首先,了解AES加密的基本原理:AES是一种块密码,将...
android和JAVA的AES加密算法,从自己的项目中取出来的,分享给有需要的机油
Android 使用 AES 加密和解密文件实例代码 在 Android 应用程序中,使用 AES(Advanced Encryption Standard)加密和解密文件是一种常见的安全措施。本文将详细介绍 Android 使用 AES 加密和解密文件的实例代码,并...
在本文中,我们将深入探讨如何在Android应用程序中实现AES加密与解密,同时涉及PKCS7Padding填充方式和位移量的概念,以及Base64编码。 **AES加密算法** AES是一种块密码,其基本工作模式是将明文数据分成128位的块...
本篇文章将深入探讨Android环境下如何实现AES加密,并提供一个名为`AndroidAesDemo`的示例项目来帮助理解。 AES加密的核心原理是通过一系列的替换、置换和混淆操作,将明文数据转换为不可读的密文。这个过程是可逆...
在iOS和Android平台上实现AES加密解密是开发者经常遇到的任务,尤其对于需要跨平台传输和存储敏感信息的场景。本篇文章将详细探讨AES加密解密算法在iOS和Android平台上的实现原理以及具体步骤。 首先,AES算法基于...
【Android AES加密工具类分享】 在Android开发中,安全传输和存储数据是至关重要的,为此,开发者常常采用加密技术来保护敏感信息。本文将详细介绍一个基于AES(Advanced Encryption Standard)加密的Android工具类...
"iOS与Android通用AES加密"是一个针对这两个主流操作系统实现的数据加密方案,确保信息在传输和存储过程中的安全性。 AES(Advanced Encryption Standard),即高级加密标准,是一种广泛使用的对称加密算法,因其...
"本地图片AES加密解密"是一个针对这个问题提出的技术方案,旨在保护存储在本地设备上的图片不被未经授权的第三方访问。AES(Advanced Encryption Standard)加密是一种广泛应用的对称加密算法,因其高效和安全性而...
总的来说,这个资源提供了一个完整的Android JNI AES加密实现,包括了必要的SO库文件和Java调用示例,对于想要在Android应用中实现高效加密功能的开发者来说,是一个非常实用的参考。在实际开发中,可以根据具体需求...
综上所述,"Android中JNI实现AES加密源代码"涉及的知识点包括Android JNI的使用、AES加密算法的实现、NDK开发环境的配置、C/C++与Java的交互,以及数据安全和性能优化。通过这样的实现,开发者可以在Android应用中...
android上支持大文件的AES加解密实现,demo可以配合使用我之前上传的js版本AES大文件加解密,先用js加密,然后用android解密,我把文件所在位置硬编码的assets下了,使用者可以随意设置文件所在
Android RSA AES加密库是一种结合了非对称加密RSA和对称加密AES的安全解决方案。这篇文章将详细讲解这两种加密算法以及它们在Android JNI(Java Native Interface)环境下的实现。 **1. RSA加密算法** RSA是一种非...
本文将深入探讨AES加密的基本原理、在Android中的应用以及如何使用源码进行加密和解密操作。 AES加密算法起源于1998年,由NIST(美国国家标准与技术研究院)发布,旨在取代DES(Data Encryption Standard)。AES...
在Android中实现AES加密通常需要以下步骤: 1. 导入相关库:首先,你需要导入Java Cryptography Extension (JCE) 库,因为AES属于其中的一部分。在Android Studio项目中,JCE是默认包含的,但如果你使用的是旧版本...
综上所述,Android AES加密的实现涉及到密钥生成、加密解密流程、兼容性处理、密钥存储以及错误管理等多个方面。通过合理的编程实践,可以确保在各种Android设备上实现可靠且安全的数据加密。对于开发者来说,理解并...
本篇文章将深入探讨AES加密在Java、Android、iOS以及C#中的应用,以及如何实现这些平台之间的通用加密方式。 AES,即高级加密标准,是一种块密码,采用128位的块大小进行操作,并支持128、192和256位的密钥长度。其...
本篇文章将探讨如何在Android应用中实现AES加密和解密文件,以确保数据的安全性。 首先,我们需要了解AES的工作原理。AES是一种分组密码,它使用相同的密钥进行加密和解密,具有128位的块大小,并支持128、192和256...