小白成长记-----关于Android AES 加解密中的那些问题
来源:互联网 发布:新农村频道网络直播 编辑:程序博客网 时间:2024/06/11 17:22
在网上看了很多关于AES解密的案例、代码,都没有解决加密后无法解密的问题,最后在一个很小很小的角落中找到了答案,学习之余也给大家分享一下。
废话不多说直接上代码。
import java.security.SecureRandom;import javax.crypto.Cipher;
import javax.crypto.KeyGenerator;
import javax.crypto.SecretKey;
import javax.crypto.spec.SecretKeySpec;
import android.app.Activity;
import android.os.Bundle;
import android.widget.Toast;
public class MainActivity extends Activity {
private final static String HEX = "0123456789ABCDEF";
public static String encrypt(String seed, String cleartext) throws Exception {
byte[] rawKey = getRawKey(seed.getBytes());
byte[] result = encrypt(rawKey, cleartext.getBytes());
return toHex(result);
}
public static String decrypt(String seed, String encrypted) throws Exception {
byte[] rawKey = getRawKey(seed.getBytes());
byte[] enc = toByte(encrypted);
byte[] result = decrypt(rawKey, enc);
return new String(result);
}
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;
}
private static byte[] getRawKey(byte[] seed) throws Exception {
KeyGenerator kgen = KeyGenerator.getInstance("AES");
// SHA1PRNG 强随机种子算法, 要区别4.2以上版本的调用方法如果不判断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[] raw, byte[] clear) throws Exception {
SecretKeySpec skeySpec = new SecretKeySpec(raw, "AES");
Cipher cipher = Cipher.getInstance("AES");
cipher.init(Cipher.ENCRYPT_MODE, skeySpec);
byte[] encrypted = cipher.doFinal(clear);
return encrypted;
}
private static byte[] decrypt(byte[] raw, byte[] encrypted) throws Exception {
SecretKeySpec skeySpec = new SecretKeySpec(raw, "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 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 static void appendHex(StringBuffer sb, byte b) {
sb.append(HEX.charAt((b >> 4) & 0x0f)).append(HEX.charAt(b & 0x0f));
}
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
String masterPassword = "a";
String originalText = "0123456789";
try {
System.out.println("加密文本为" + originalText);
String encryptingCode = MainActivity.encrypt(masterPassword, originalText);
System.out.println("加密结果为 " + encryptingCode);
Toast.makeText(this, encryptingCode, 0).show();
String decryptingCode = MainActivity.decrypt(masterPassword, encryptingCode);
System.out.println("解密结果为 " + decryptingCode);
Toast.makeText(this, decryptingCode, 0).show();
} catch (Exception e) {
e.printStackTrace();
}
}
}
可以看到我的代码中多了一个版本判断,这样在4.2以上的版本就可以完美解密了 。
新手勿喷,谢谢
1 0
- 小白成长记-----关于Android AES 加解密中的那些问题
- 关于AES加解密
- AES加解密算法在Android中的应用及Android4.2以上版本调用问题
- AES加解密算法在Android中的应用及Android4.2以上版本调用问题
- JAVA aes加解密在mac中的问题
- android平台上AES,DES加解密及问题
- AES加解密在STM32中的应用
- 基于openssl的AES加解密 android
- android中使用AES加解密
- android常用的AES加解密
- Android AES 16字节加解密
- 关于Android中使用AES加密解密的问题
- 关于PHP与Java AES加解密互通的Padding问题
- 关于Android侧使用AES进行加解密时的key和iv使用的方法
- AES加解密算法
- aes加解密
- iOS-AES加解密
- erlang aes 加解密
- VIMRC
- 欢迎使用CSDN-markdown编辑器
- FTP PLATFORM TARGET SETUP
- 怎么 把double值变为float?
- kvm qeum
- 小白成长记-----关于Android AES 加解密中的那些问题
- Odoo 权限控制解析及 eval 详解
- 组件、控件和插件的区别
- gtest
- 专访魅族资深架构师:关于实时推送系统的那点事
- axis方式调用webservice
- mysql新建用户,授权与撤销权限
- spice之red worker工作流程浅析
- python 可视化包 Bokeh