AES加解密算法在Android中的应用及Android4.2以上版本调用问题
来源:互联网 发布:android编程200例 pdf 编辑:程序博客网 时间:2024/06/11 22:29
密码学中的高级加密标准(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. */@Overridepublic 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);}@Overridepublic void onClick(View v) {// TODO Auto-generated method stubif (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 blocke.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 blocke.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>
源码:http://download.csdn.net/detail/xinzheng_wang/5639611
- AES加解密算法在Android中的应用及Android4.2以上版本调用问题
- AES加解密算法在Android中的应用及Android4.2以上版本调用问题
- AES加解密在STM32中的应用
- AES加解密在php接口请求过程中的应用
- JAVA aes加解密在mac中的问题
- android平台上AES,DES加解密及问题
- AES加解密算法
- AES加解密算法
- AES加解密算法
- AES加解密算法
- java调用AES算法产生密钥并加解密文件
- AES加解密算法详解
- AES加解密算法二
- android4.4以上 webview加在图片的缩放问题
- 小白成长记-----关于Android AES 加解密中的那些问题
- AES加解密在Android 4.2上的Encryption error
- AES加解密在Android 4.2上的Encryption error
- AES加解密源码(直接可调用)
- 禁用JSF2.x(mojarra)的xhtml缓存,让文件改动立即生效
- c# .net 中<% = %>,<% # %>,<% $ %>意义
- 建立支持OpenGL的OpenCV工程“Master OpenCV”chp.3
- CSS3属性text-overflow
- virtualbox虚拟机安装Mac OS 10.6.x全过程
- AES加解密算法在Android中的应用及Android4.2以上版本调用问题
- 挂载硬盘报错无法挂载---磁盘挂载反馈结果8192
- sikuli core: Finding GUI Patterns on the Screen
- 学习业务流程图绘制方法(下)
- Linux修改文件及文件夹权限 文件属性
- Hadoop 常用命令
- phpcms调用栏目
- java的System.getProperty()方法可以获取的值
- 【三方面了解U盘芯片类型】