`

android aes加密

阅读更多

如下代码中在生成密钥的时候,基于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加密工具类

    Android AES加密解密

    在本文中,我们将深入探讨Android环境下如何实现AES加密解密,以及如何修改加密过程中的关键参数——密钥(key)和偏移量(initialization vector,简称IV)。 首先,了解AES加密的基本原理:AES是一种块密码,将...

    android AES 加密算法

    android和JAVA的AES加密算法,从自己的项目中取出来的,分享给有需要的机油

    android使用AES加密和解密文件实例代码

    Android 使用 AES 加密和解密文件实例代码 在 Android 应用程序中,使用 AES(Advanced Encryption Standard)加密和解密文件是一种常见的安全措施。本文将详细介绍 Android 使用 AES 加密和解密文件的实例代码,并...

    android Aes 加密解密

    在本文中,我们将深入探讨如何在Android应用程序中实现AES加密与解密,同时涉及PKCS7Padding填充方式和位移量的概念,以及Base64编码。 **AES加密算法** AES是一种块密码,其基本工作模式是将明文数据分成128位的块...

    Android之AES加密

    本篇文章将深入探讨Android环境下如何实现AES加密,并提供一个名为`AndroidAesDemo`的示例项目来帮助理解。 AES加密的核心原理是通过一系列的替换、置换和混淆操作,将明文数据转换为不可读的密文。这个过程是可逆...

    AES加密解密算法 iOS和Android完美实现

    在iOS和Android平台上实现AES加密解密是开发者经常遇到的任务,尤其对于需要跨平台传输和存储敏感信息的场景。本篇文章将详细探讨AES加密解密算法在iOS和Android平台上的实现原理以及具体步骤。 首先,AES算法基于...

    Android AES加密工具类分享

    【Android AES加密工具类分享】 在Android开发中,安全传输和存储数据是至关重要的,为此,开发者常常采用加密技术来保护敏感信息。本文将详细介绍一个基于AES(Advanced Encryption Standard)加密的Android工具类...

    iOS与Android通用AES加密

    "iOS与Android通用AES加密"是一个针对这两个主流操作系统实现的数据加密方案,确保信息在传输和存储过程中的安全性。 AES(Advanced Encryption Standard),即高级加密标准,是一种广泛使用的对称加密算法,因其...

    本地图片AES加密解密

    "本地图片AES加密解密"是一个针对这个问题提出的技术方案,旨在保护存储在本地设备上的图片不被未经授权的第三方访问。AES(Advanced Encryption Standard)加密是一种广泛应用的对称加密算法,因其高效和安全性而...

    Android下AES加密算法的JNI实现(包含SO文件)

    总的来说,这个资源提供了一个完整的Android JNI AES加密实现,包括了必要的SO库文件和Java调用示例,对于想要在Android应用中实现高效加密功能的开发者来说,是一个非常实用的参考。在实际开发中,可以根据具体需求...

    Android中JNI实现AES加密源代码

    综上所述,"Android中JNI实现AES加密源代码"涉及的知识点包括Android JNI的使用、AES加密算法的实现、NDK开发环境的配置、C/C++与Java的交互,以及数据安全和性能优化。通过这样的实现,开发者可以在Android应用中...

    android aes 大文件分块加解密

    android上支持大文件的AES加解密实现,demo可以配合使用我之前上传的js版本AES大文件加解密,先用js加密,然后用android解密,我把文件所在位置硬编码的assets下了,使用者可以随意设置文件所在

    Android RSA AES 加密库

    Android RSA AES加密库是一种结合了非对称加密RSA和对称加密AES的安全解决方案。这篇文章将详细讲解这两种加密算法以及它们在Android JNI(Java Native Interface)环境下的实现。 **1. RSA加密算法** RSA是一种非...

    android AES加密

    本文将深入探讨AES加密的基本原理、在Android中的应用以及如何使用源码进行加密和解密操作。 AES加密算法起源于1998年,由NIST(美国国家标准与技术研究院)发布,旨在取代DES(Data Encryption Standard)。AES...

    Android AES加密

    在Android中实现AES加密通常需要以下步骤: 1. 导入相关库:首先,你需要导入Java Cryptography Extension (JCE) 库,因为AES属于其中的一部分。在Android Studio项目中,JCE是默认包含的,但如果你使用的是旧版本...

    Android aes密码加密

    综上所述,Android AES加密的实现涉及到密钥生成、加密解密流程、兼容性处理、密钥存储以及错误管理等多个方面。通过合理的编程实践,可以确保在各种Android设备上实现可靠且安全的数据加密。对于开发者来说,理解并...

    android ios 通用 AES加密

    本篇文章将深入探讨AES加密在Java、Android、iOS以及C#中的应用,以及如何实现这些平台之间的通用加密方式。 AES,即高级加密标准,是一种块密码,采用128位的块大小进行操作,并支持128、192和256位的密钥长度。其...

    (原创)android使用AES加密和解密文件

    本篇文章将探讨如何在Android应用中实现AES加密和解密文件,以确保数据的安全性。 首先,我们需要了解AES的工作原理。AES是一种分组密码,它使用相同的密钥进行加密和解密,具有128位的块大小,并支持128、192和256...

Global site tag (gtag.js) - Google Analytics