AES加解密算法在Android中的应用及Android4.2以上版本调用问题
AES加解密算法在Android中的应用及Android4.2以上版本调用问题
密码学中的高级加密标准(Advanced Encryption Standard,AES),又称高级加密标准Rijndael加密法,是美国联邦政府采用的一种区块加密标准。这个标准用来替代原先的DES,已经被多方分析且广为全世界所使用。该算法为比利时密码学家Joan Daemen和Vincent Rijmen所设计,结合两位作者的名字,以Rijndael之命名之。
要区别4.2以上版本的调用方法,否则将会出现意想不到的问题。
AESCipher.java
- package com.test;
- import java.security.SecureRandom;
- import javax.crypto.Cipher;
- import javax.crypto.KeyGenerator;
- import javax.crypto.SecretKey;
- import javax.crypto.spec.SecretKeySpec;
- public class AESCipher {
- 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));
- }
- }
TestAES.java
- package com.test;
- import android.app.Activity;
- import android.os.Bundle;
- import android.view.View;
- import android.view.View.OnClickListener;
- import android.widget.Button;
- import android.widget.EditText;
- import android.widget.TextView;
- public class TestAES extends Activity implements OnClickListener {
- private TextView tvTip = null;
- private EditText etKey = null;
- private EditText etStr = null;
- private Button btnEncrypt = null;
- private Button btnDecrypt = null;
- //
- String src = null;
- String key = null;
- String dest = null;
- /** Called when the activity is first created. */
- @Override
- public void onCreate(Bundle savedInstanceState) {
- super.onCreate(savedInstanceState);
- setContentView(R.layout.main);
- tvTip = (TextView) findViewById(R.id.tvTip);
- etKey = (EditText) findViewById(R.id.etKey);
- etStr = (EditText) findViewById(R.id.etStr);
- btnEncrypt = (Button) findViewById(R.id.btnEncrypt);
- btnEncrypt.setOnClickListener(this);
- btnDecrypt = (Button) findViewById(R.id.btnDecrypt);
- btnDecrypt.setOnClickListener(this);
- btnEncrypt.setEnabled(true);
- btnDecrypt.setEnabled(false);
- }
- @Override
- public void onClick(View v) {
- // TODO Auto-generated method stub
- if (v == btnEncrypt) {
- src = etStr.getText().toString().trim();
- key = etKey.getText().toString().trim();
- if (!src.equals("") && !key.equals("")) {
- try {
- dest = AESCipher.encrypt(key, src);
- tvTip.setText("Encrypted:");
- etStr.setText(dest);
- btnEncrypt.setEnabled(false);
- btnDecrypt.setEnabled(true);
- } catch (Exception e) {
- // TODO Auto-generated catch block
- e.printStackTrace();
- }
- }
- } else if (v == btnDecrypt) {
- src = etStr.getText().toString().trim();
- key = etKey.getText().toString().trim();
- if (!src.equals("") && !key.equals("")) {
- try {
- dest = AESCipher.decrypt(key, src);
- tvTip.setText("Decrypted:");
- etStr.setText(dest);
- btnDecrypt.setEnabled(false);
- btnEncrypt.setEnabled(true);
- } catch (Exception e) {
- // TODO Auto-generated catch block
- e.printStackTrace();
- }
- }else{
- tvTip.setText("Source:");
- btnDecrypt.setEnabled(false);
- btnEncrypt.setEnabled(true);
- }
- }
- }
- }
main.xml
- <?xml version="1.0" encoding="utf-8"?>
- <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
- android:layout_width="fill_parent"
- android:layout_height="fill_parent"
- android:orientation="vertical" >
- <LinearLayout
- android:layout_width="fill_parent"
- android:layout_height="wrap_content"
- android:orientation="vertical" >
- <TextView
- android:layout_width="100dp"
- android:layout_height="wrap_content"
- android:text="Key:" />
- <EditText
- android:id="@+id/etKey"
- android:layout_width="200dp"
- android:layout_height="40dp"
- android:maxLength="32"
- android:hint="Input the key" />
- </LinearLayout>
- <LinearLayout
- android:layout_width="fill_parent"
- android:layout_height="wrap_content"
- android:orientation="vertical" >
- <TextView
- android:id="@+id/tvTip"
- android:layout_width="100dp"
- android:layout_height="wrap_content"
- android:text="Source:" />
- <EditText
- android:id="@+id/etStr"
- android:layout_width="400dp"
- android:layout_height="200dp"
- android:hint="Input the source"
- android:inputType="textMultiLine"
- android:maxLength="4096"
- android:maxLines="100"
- android:scrollHorizontally="false" />
- </LinearLayout>
- <LinearLayout
- android:layout_width="fill_parent"
- android:layout_height="wrap_content"
- android:orientation="horizontal" >
- <Button
- android:id="@+id/btnEncrypt"
- android:layout_width="120dp"
- android:layout_height="50dp"
- android:text="加密字符串" />
- <Button
- android:id="@+id/btnDecrypt"
- android:layout_width="120dp"
- android:layout_height="50dp"
- android:text="解密字符串" />
- </LinearLayout>
- </LinearLayout>
AES加解密算法在Android中的应用及Android4.2以上版本调用问题的更多相关文章
- AES加解密算法Qt实现
[声明] (1) 本文源码 在一位未署名网友源码基础上,利用Qt编程,实现了AES加解密算法,并添加了文件加解密功能.在此表示感谢!该源码仅供学习交流,请勿用于商业目的. (2) 图片及描述 除图1外 ...
- AES加解密算法
直接粘代码,该类是基于微信公众号消息加密解密所提供的PHP DEMO改造而来,目前使用于彬彬大学APP接口token校验中. php的mcrypt 扩展已经过时了大约10年,并且用起来很复杂.因此它被 ...
- 最强加密算法?AES加解密算法Matlab和Verilog实现
目录 背景 AES加密的几种模式 基本运算 AES加密原理 Matlab实现 Verilog实现 Testbench 此本文首发于公众号[两猿社],重点讲述了AES加密算法的加密模式和原理,用MATL ...
- 【加解密专辑】对接触到的PGP、RSA、AES加解密算法整理
先贴代码,有空再整理思路 PGP加密 using System; using System.IO; using Org.BouncyCastle.Bcpg; using Org.BouncyCastl ...
- Aes 加解密算法
public class AesHelper { /// <summary> /// 生成128位的随机AES秘钥 /// </sum ...
- PHP完整的AES加解密算法使用及例子(256位)
依赖PHP自身的mcrypt扩展 <?php class aes { // CRYPTO_CIPHER_BLOCK_SIZE 32 private $_secret_key = 'default ...
- C#与java中的AES加解密互解算法
一.C#版AES加解密算法 public class AESCode { public string Key { get; set; } public string Encrypt(string va ...
- RSA,AES加解密算法的实现
目录 Python实现RSA公钥加密算法 RSA公钥加密算法原理 RSA算法的Python实现 AES加解密算法实现 AES加解密算法原理 AES加解密算法Python实现 参考文献 Python实现 ...
- Java中的AES加解密工具类:AESUtils
本人手写已测试,大家可以参考使用 package com.mirana.frame.utils.encrypt; import com.mirana.frame.constants.SysConsta ...
随机推荐
- SpringMvc定时器任务
在最近的工作中,涉及到一个定时任务,由于以前对springMVC使用较少,所以,上网找了一点资料.这个demo感觉挺好,推荐给大家. 使用到的JAR文件: aopalliance-1.0.jarcom ...
- python基础-装饰器,生成器和迭代器
学习内容 1.装饰器 2.生成器 3.迭代器 4.软件目录结构规范 一:装饰器(decorator) 1.装饰器定义:本质就是函数,用来装饰其他函数,即为其他函数添加附加功能. 2.装饰器原则:1)不 ...
- SOA 设计的 9 大原则
面向服务的架构 (SOA) 设计要尽可能地简单.在设计一个 SOA 服务的时候要谨记这 9 大设计原则: 1. 标准服务契约 服务要遵循一个服务描述. 2. 松耦合 服务之间的依赖最小化. 3. 服务 ...
- 关于vim复制剪贴粘贴命令的总结
最近在使用vim,感觉很好很强大,但是在使用复制剪切粘贴命令是,碰到了一些小困惑,网上找了一些资料感觉很不全,讲的也不好,遂自己进行实践并总结了. 首先是剪切(删除): 剪切其实也就顺带删除了所选择的 ...
- Sqlserver中PIVOT行转列透视操作
创建表: IF OBJECT_ID('T040_PRODUCT_SALES') IS NOT NULL DROP TABLE T040_PRODUCT_SALES create table T040_ ...
- Java编程的逻辑 (13) - 类
本系列文章经补充和完善,已修订整理成书<Java编程的逻辑>,由机械工业出版社华章分社出版,于2018年1月上市热销,读者好评如潮!各大网店和书店有售,欢迎购买,京东自营链接:http:/ ...
- 【LOJ】#2526. 「HAOI2018」苹果树
题解 这计数题多水啊我怎么调了那么久啊 我不想老年化啊QAQ (注意这里的二叉树带标号) 考虑\(g[i]\)表示\(i\)个点二叉树所有节点的深度和,\(f[i]\)表示\(i\)个点的二叉树两两节 ...
- PowerShell 中使用 mvn 编译报错 Unknown lifecycle phase ".test.skip=true". 解决办法
nknown lifecycle phase “–Dmaven.test.skip=true”. You must specify a valid lifecycle phase or a goal ...
- VIM中使用S查找并替换
vi/vim 中可以使用 :s 命令来替换字符串.以前只会使用一种格式来全文替换,今天发现该命令有很多种写法(vi 真是强大啊,还有很多需要学习),记录几种在此,方便以后查询.:s/vivian/sk ...
- rabbitmq学习(一) —— 安装篇
安装篇之windows: 略(楼主在windows上安装基本就是按部就班的没遇到什么坑) 安装篇值centos7: 主要记录下centos7下的安装,因为在该系统下安装稍微折腾了下 参考https:/ ...