<!-- [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 加密需要使用 Java 加密架构(Java Cryptography Architecture,JCA)提供的加密 API。Android 平台提供了 javax.crypto 包,包含了 AES 加密算法的实现。 生成 AES 密钥 在使用 ...
Android提供了一个名为`<android/openssl/AES.h>`的库,里面包含了AES加密的函数,如`EVP_EncryptInit_ex()`, `EVP_EncryptUpdate()`, `EVP_EncryptFinal_ex()`等,用于初始化加密上下文、进行加密操作以及结束加密...
在Android应用中,AES加密通常用于保护数据的安全,例如存储敏感信息、网络通信中的数据传输等。C语言实现的AES加密算法能够提高执行效率,尤其是在处理大量数据时。 首先,我们需要了解AES加密的基本流程。AES包含...
在Android上实现AES加密通常涉及以下步骤: 1. **密钥生成**:首先,你需要生成一个AES密钥。在Android中,可以使用`KeyGenerator`类,指定`AlgorithmSpec`(例如`KeySpec`)来生成特定长度的密钥,通常AES支持128、...
总之,使用AES加密在Android上为文件提供了一种强大而安全的保护方式。然而,正确实现加密和解密流程,以及妥善处理密钥和异常,都是确保数据安全的重要环节。不断学习和理解加密原理,以及关注最新的安全最佳实践,...
无论哪种语言,确保在所有平台上使用相同的密钥和IV是实现通用加密的关键。 在跨平台的通用加密中,我们需要确保所有的实现都遵循相同的加密规范,包括密钥长度、工作模式和填充方式。例如,AES-128-CBC模式通常是...
在Android平台上,我们可以使用Java的`javax.crypto`包来实现AES加密解密。首先,创建一个`SecretKeySpec`对象来存储密钥,然后创建一个`Cipher`对象,指定加密算法和工作模式。接下来,使用`Cipher`对象的`init`...
在Android中,我们可以使用Java Cryptography Extension (JCE) 来实现AES加密解密。以下是一个简单的步骤概述: 1. **生成密钥**:使用`KeyGenerator`类生成AES密钥。例如: ```java KeyGenerator keyGen = ...
android 可以使用的 AES加密工具类
在Android RSA AES加密库中,可能使用JNI来实现以下功能: - 使用C/C++编写高效的加密库,因为这些语言在处理加密算法时通常比Java更快。 - 在本地代码中执行加密和解密操作,减少Java层的性能开销。 - 利用JNI...
在这个开源项目中,我们将探讨如何在Android和iOS平台上实现AES加密。以下是对这个项目的详细讲解。 1. **AES加密原理**: AES是基于块密码,每个加密块大小为128位。它使用128、192或256位的密钥来加密128位的...
本篇将详细介绍如何在Android应用中通过JNI(Java Native Interface)调用C++动态库进行AES256位加密。 首先,我们要理解JNI的概念。JNI是Java平台的标准接口,允许Java代码和其他语言写的代码进行交互。在Android...
在Android平台上,对大文件进行安全传输或存储时,通常会采用加密技术来保护数据的安全。本示例中,我们关注的是使用AES(Advanced Encryption Standard)加密算法对文件进行分段加密,特别是针对2M长度的文件片段...
在本文中,我们将介绍如何使用 AES 算法在 Android 平台上实现视频的加密和解密。 Android 中的视频加密和解密 在 Android 中,视频加密和解密是通过使用加密算法来保护视频文件的内容的。常见的加密算法有 AES、...
android和JAVA的AES加密算法,从自己的项目中取出来的,分享给有需要的机油
在实际项目中,开发者需要确保在两个平台上使用相同的密钥和初始化向量(IV)来加密和解密数据,这样才能保证数据的互操作性。 在实现AES加密时,需要注意以下几点: 1. 密钥管理:密钥应该安全存储,避免明文暴露...
在Android中,可以使用Java的javax.crypto包来实现AES加密。首先,需要生成一个随机密钥,然后使用这个密钥对数据进行加密。解密时,用相同的密钥将加密后的数据还原。AES的优点在于它的高效性和安全性,但缺点是...
在Android开发中,我们通常使用Java的`javax.crypto`包来实现AES加密解密。下面我们将详细介绍AES加密的原理、步骤以及可能出现的问题及其解决方案。 **AES加密原理** AES基于块密码,它将数据分成128位的块进行...
在Android中实现AES加密,你需要遵循以下步骤: 1. **生成密钥**:使用KeyGenerator类生成AES密钥。例如: ```java KeyGenerator keyGen = KeyGenerator.getInstance("AES"); keyGen.init(128); // 128位密钥 ...
通过Keystore生成的密钥只能在特定的设备上使用,并且可以设置额外的安全限制,如用户PIN码保护。 ```java KeyPairGeneratorSpec spec = new KeyPairGeneratorSpec.Builder(context) .setAlgorithm("RSA") ....