<!-- [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 android ios c# 通用 AES加密方式
Android中实现JNI的AES加解密源代码,绝对可以运行!
Android之AES加密。博客地址:http://blog.csdn.net/bingdianlanxin,有问题欢迎留言!
将AES加密算法用C语言实现并封装成JNI接口供Android调用,包含编译生成的SO库文件,以及Java声明和调用方法的简单例子。希望帮到有需要的朋友,如果觉得不错麻烦给个好评~~!
android和JAVA的AES加密算法,从自己的项目中取出来的,分享给有需要的机油
Android AES加密解密,可以修改key值和偏移量值
Android AES加密,解密正常,针对android4.2以上的版本进行修改,适配所有的手机,加密解密正常。
具有实现AES256位加密的C++代码,Application.mk Android.mk文件,JNI头文件和cpp文件。以及使用示例
AES加密有多种算法模式,下面提供两套模式的可用源码: 一、CBC(Cipher Block Chaining,加密块链)模式 二、ECB(Electronic Code Book,电子密码本)模式 其中CBC模式下,有.NET的源码。而ECB模式的,大家在网上找...
android 可以使用的 AES加密工具类
如何在android和ios中实现aes加密的演示
android AES DES MD5加密
java、Android、javaScript(可以改成vue)、ios AES加密通用,可在服务端加密,客户端解密,也可在客户端加密,服务端解密;由于csdn会自动把积分改到50,可以发邮件到1622007541@qq.com 免费送
android jni实现的AES RSA 移植,有C代码,编译通过,方便更改调用
(原创)android使用AES加密和解密文件,博客链接地址:http://blog.csdn.net/lnn368/article/details/52712407#comments
AES android加密demo
iOS与Android通用AES加密 ,测试后可以用如果有问题请留言 在这个博客上http://blog.csdn.net/qqmcy/article/details/39483075
android jni 实现 RSA 3DES AES MD5 BASE64 加密,基于openssl