`

在android设备上使用AES加密

阅读更多

<!-- [if gte mso 9]><xml><w:WordDocument><w:BrowserLevel>MicrosoftInternetExplorer4</w:BrowserLevel><w:DisplayHorizontalDrawingGridEvery>0</w:DisplayHorizontalDrawingGridEvery><w:DisplayVerticalDrawingGridEvery>2</w:DisplayVerticalDrawingGridEvery><w:DocumentKind>DocumentNotSpecified</w:DocumentKind><w:DrawingGridVerticalSpacing>7.8</w:DrawingGridVerticalSpacing><w:View>Normal</w:View><w:Compatibility></w:Compatibility><w:Zoom>0</w:Zoom></w:WordDocument></xml><![endif]-->

android设备上使用 AES 加密

 

 

 

基本和在PC 上使用无区别

注意标红部分。

PC 上使用时, SecureRandom 可以直接使用  new 关键字创建

不需要指定provider 

系统会自动使用注册的第一个provider 创建 SecureRandom

 

PC 上使用时

系统提供的provider 如下:

SUN (DSA key/parameter generation; DSA signing; SHA-1, MD5 digests; SecureRandom; X.509 certificates; JKS keystore; PKIX CertPathValidator; PKIX CertPathBuilder; LDAP, Collection CertStores, JavaPolicy Policy; JavaLoginConfig Configuration)

Sun RSA signature provider

Sun JSSE provider(PKCS12, SunX509 key/trust factories, SSLv3, TLSv1)

SunJCE Provider (implements RSA, DES, Triple DES, AES, Blowfish, ARCFOUR, RC2, PBE, Diffie-Hellman, HMAC)

Sun (Kerberos v5, SPNEGO)

Sun SASL provider(implements client mechanisms for: DIGEST-MD5, GSSAPI, EXTERNAL, PLAIN, CRAM-MD5; server mechanisms for: DIGEST-MD5, GSSAPI, CRAM-MD5)

XMLDSig (DOM XMLSignatureFactory; DOM KeyInfoFactory)

Sun PC/SC provider

Sun's Microsoft Crypto API provider

 

会默认使用第一个provider

 

注意:android 设备上系统内注册的 provider   与  PC 上完全不同   不同版本的 android 系统之间注册的 provider 也不同。请手动指定需要的 provider

Android 2.2以上默认使用  androidOpenSSL

Android 2.1及以下系统不支持  androidOpenSSL 

 

通过  Security. getProviders ()   方法可以获取系统内注册的所有provider 信息

 

 

 

package dk.tools;

import java.io.UnsupportedEncodingException;

import java.security.InvalidKeyException;

import java.security.NoSuchAlgorithmException;

import java.security.Provider;

import java.security.SecureRandom;

import java.security.Security;

 

import javax.crypto.BadPaddingException;

import javax.crypto.Cipher;

import javax.crypto.IllegalBlockSizeException;

import javax.crypto.KeyGenerator;

import javax.crypto.NoSuchPaddingException;

import javax.crypto.SecretKey;

import javax.crypto.spec.SecretKeySpec;

 

/**

 * 进行 128 AES 加密解密的工具类

 * 指定 provider BC

 * 

 * 此类未进行线程同步

 * @author DK

 *

 */

public class AESTools {

/**

 * 默认加密 / 解密密码

 */

private String password="com.inventec.dreye.dict.SRD00";

//KeyGenerator对象实例

private KeyGenerator kgen;

/**

 * 构造方法

 * 需消耗一定时间

 * @param password

 */

public AESTools(String password)

{

if(password!=null && password.trim().length()>0)

{

this.password=password;

}

}

/**

 * 构造方法

 * 需消耗一定时间

 * @param password

 */

public AESTools()

{

}

/**

 * 加密

 * @param content  需加密字符串

 * @return 加密后的 byte[]

 */

 public byte[] encrypt(String content) {     

        try {   

        kgen = KeyGenerator.getInstance("AES");

         Provider p=Security.getProvider("BC");

        SecureRandom s=SecureRandom.getInstance("AES", p);

        s.setSeed(password.getBytes());

        kgen.init(128, s);// 使用用户提供的随机源初始化此密钥生成器,使其具有确定的密钥大小。

      SecretKey secretKey = kgen.generateKey();

byte[] enCodeFormat = secretKey.getEncoded();

SecretKeySpec key = new SecretKeySpec(enCodeFormat, "AES");// 使用 SecretKeySpec 类来根据一个字节数组构造一个 SecretKey

Cipher cipher = Cipher.getInstance("AES/ECB/PKCS5Padding");// 创建密码器 。

byte[] byteContent = content.getBytes("utf-8");

cipher.init(Cipher.ENCRYPT_MODE, key);// 初始化

byte[] result = cipher.doFinal(byteContent); //执行操作

return result; // 加密

} catch (NoSuchAlgorithmException e) {

e.printStackTrace();

} catch (NoSuchPaddingException e) {

e.printStackTrace();

} catch (UnsupportedEncodingException e) {

e.printStackTrace();

} catch (IllegalBlockSizeException e) {

e.printStackTrace();

} catch (BadPaddingException e) {

e.printStackTrace();

} catch (InvalidKeyException e) {

e.printStackTrace();

}

return null;

}

 

 /**

  * 解密

  * @param content 需解密的 byte[]

  * @return 解密后的 byte[]

  */

 public byte[] decrypt(byte[] content) {     

        try {   

          kgen = KeyGenerator.getInstance("AES");

           Provider p=Security.getProvider("BC");

          SecureRandom s=SecureRandom.getInstance("AES", p);

          s.setSeed(password.getBytes());

          kgen.init(128, s);// 使用用户提供的随机源初始化此密钥生成器,使其具有确定的密钥大小。

          SecretKey secretKey = kgen.generateKey();     

            byte[] enCodeFormat = secretKey.getEncoded();     

            SecretKeySpec key = new SecretKeySpec(enCodeFormat, "AES");                 

            Cipher cipher = Cipher.getInstance("AES/ECB/PKCS5Padding");// 创建密码器     

            cipher.init(Cipher.DECRYPT_MODE, key);// 初始化     

            byte[] result = cipher.doFinal(content);   

            System.out.println(bytesToHexString(result));

            return result;   

        } catch (NoSuchAlgorithmException e) {     

            e.printStackTrace();     

        } catch (NoSuchPaddingException e) {     

            e.printStackTrace();     

        } catch (InvalidKeyException e) {     

            e.printStackTrace();     

        } catch (IllegalBlockSizeException e) {     

                e.printStackTrace();     

        } catch (BadPaddingException e) {     

                e.printStackTrace();     

        }     

        return null;     

    }    

 

 

 /**

  *  byte[] 转换为 16 进制显示

  * 注意:此方法是非线程安全的

  * @param src 

  * @return 

  */

 public String bytesToHexString(byte[] src){   

     StringBuilder stringBuilder = new StringBuilder("");   

     if (src == null || src.length <= 0) {   

         return null;   

     }   

     for (int i = 0; i < src.length; i++) {   

         int v = src[i] & 0xFF;   

         String hv = Integer.toHexString(v);   

         if (hv.length() < 2) {   

             stringBuilder.append(0);   

         }   

         stringBuilder.append(hv);   

     }   

     return stringBuilder.toString().toUpperCase();   

 }  

//  

//  public static void main(String[] args) throws UnsupportedEncodingException

//  {

//  String test="hello";

//  AESTools tools=new AESTools();

//  byte[] ret=tools.encrypt(test);

//  

//  System.out.println(new String(tools.decrypt(ret),"utf-8"));

//  }

}

分享到:
评论

相关推荐

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

    在 Android 应用程序中,使用 AES 加密需要使用 Java 加密架构(Java Cryptography Architecture,JCA)提供的加密 API。Android 平台提供了 javax.crypto 包,包含了 AES 加密算法的实现。 生成 AES 密钥 在使用 ...

    Android中JNI实现AES加密源代码

    Android提供了一个名为`&lt;android/openssl/AES.h&gt;`的库,里面包含了AES加密的函数,如`EVP_EncryptInit_ex()`, `EVP_EncryptUpdate()`, `EVP_EncryptFinal_ex()`等,用于初始化加密上下文、进行加密操作以及结束加密...

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

    在Android应用中,AES加密通常用于保护数据的安全,例如存储敏感信息、网络通信中的数据传输等。C语言实现的AES加密算法能够提高执行效率,尤其是在处理大量数据时。 首先,我们需要了解AES加密的基本流程。AES包含...

    Android之AES加密

    在Android上实现AES加密通常涉及以下步骤: 1. **密钥生成**:首先,你需要生成一个AES密钥。在Android中,可以使用`KeyGenerator`类,指定`AlgorithmSpec`(例如`KeySpec`)来生成特定长度的密钥,通常AES支持128、...

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

    总之,使用AES加密在Android上为文件提供了一种强大而安全的保护方式。然而,正确实现加密和解密流程,以及妥善处理密钥和异常,都是确保数据安全的重要环节。不断学习和理解加密原理,以及关注最新的安全最佳实践,...

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

    在Android平台上,我们可以使用Java的`javax.crypto`包来实现AES加密解密。首先,创建一个`SecretKeySpec`对象来存储密钥,然后创建一个`Cipher`对象,指定加密算法和工作模式。接下来,使用`Cipher`对象的`init`...

    android ios 通用 AES加密

    无论哪种语言,确保在所有平台上使用相同的密钥和IV是实现通用加密的关键。 在跨平台的通用加密中,我们需要确保所有的实现都遵循相同的加密规范,包括密钥长度、工作模式和填充方式。例如,AES-128-CBC模式通常是...

    Android AES加密解密

    在Android中,我们可以使用Java Cryptography Extension (JCE) 来实现AES加密解密。以下是一个简单的步骤概述: 1. **生成密钥**:使用`KeyGenerator`类生成AES密钥。例如: ```java KeyGenerator keyGen = ...

    android AES加密工具类

    android 可以使用的 AES加密工具类

    Android RSA AES 加密库

    在Android RSA AES加密库中,可能使用JNI来实现以下功能: - 使用C/C++编写高效的加密库,因为这些语言在处理加密算法时通常比Java更快。 - 在本地代码中执行加密和解密操作,减少Java层的性能开销。 - 利用JNI...

    AESEncryption,如何在android和ios中实现aes加密的演示.zip

    在这个开源项目中,我们将探讨如何在Android和iOS平台上实现AES加密。以下是对这个项目的详细讲解。 1. **AES加密原理**: AES是基于块密码,每个加密块大小为128位。它使用128、192或256位的密钥来加密128位的...

    Android调用JNI接口使用C++动态库进行AES256位加密

    本篇将详细介绍如何在Android应用中通过JNI(Java Native Interface)调用C++动态库进行AES256位加密。 首先,我们要理解JNI的概念。JNI是Java平台的标准接口,允许Java代码和其他语言写的代码进行交互。在Android...

    android使用AES加密对文件进行前中后三段2M长度加密

    在Android平台上,对大文件进行安全传输或存储时,通常会采用加密技术来保护数据的安全。本示例中,我们关注的是使用AES(Advanced Encryption Standard)加密算法对文件进行分段加密,特别是针对2M长度的文件片段...

    android实现视频的加密和解密(使用AES)

    在本文中,我们将介绍如何使用 AES 算法在 Android 平台上实现视频的加密和解密。 Android 中的视频加密和解密 在 Android 中,视频加密和解密是通过使用加密算法来保护视频文件的内容的。常见的加密算法有 AES、...

    android AES 加密算法

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

    iOS与Android通用AES加密

    在实际项目中,开发者需要确保在两个平台上使用相同的密钥和初始化向量(IV)来加密和解密数据,这样才能保证数据的互操作性。 在实现AES加密时,需要注意以下几点: 1. 密钥管理:密钥应该安全存储,避免明文暴露...

    android AES DES MD5加密

    在Android中,可以使用Java的javax.crypto包来实现AES加密。首先,需要生成一个随机密钥,然后使用这个密钥对数据进行加密。解密时,用相同的密钥将加密后的数据还原。AES的优点在于它的高效性和安全性,但缺点是...

    Android使用AES加密解密准确版下载。每次加密的密文结果不一样?能加密但解密不出原文?看这里就对了

    在Android开发中,我们通常使用Java的`javax.crypto`包来实现AES加密解密。下面我们将详细介绍AES加密的原理、步骤以及可能出现的问题及其解决方案。 **AES加密原理** AES基于块密码,它将数据分成128位的块进行...

    Android 加密/解密音频文件(AES)

    在Android中实现AES加密,你需要遵循以下步骤: 1. **生成密钥**:使用KeyGenerator类生成AES密钥。例如: ```java KeyGenerator keyGen = KeyGenerator.getInstance("AES"); keyGen.init(128); // 128位密钥 ...

    AES android加密demo

    通过Keystore生成的密钥只能在特定的设备上使用,并且可以设置额外的安全限制,如用户PIN码保护。 ```java KeyPairGeneratorSpec spec = new KeyPairGeneratorSpec.Builder(context) .setAlgorithm("RSA") ....

Global site tag (gtag.js) - Google Analytics