贴一段常用的加解密代码
用途:
App和后端通信时,可对参数加密,防止请求伪造或被劫持后拿到一些敏感数据。
App提交加密后的参数值,同时带上kid;服务端通过kid,拿到对应的秘钥,通过AES算法解密参数值。
当然了,不同的kid可以对应不同的秘钥和加密算法。
注意:秘钥字符串为16进制数字的字符串标识,字符范围0-9 a-f
package xx.demo.decrypt;
import org.apache.commons.codec.binary.Base64;
import javax.crypto.Cipher;
import javax.crypto.SecretKey;
import javax.crypto.spec.SecretKeySpec;
public class Main {
//这里测试发现,加密时必须使用PKCS5Padding填充模式, 解密时,则PKCS5Padding和NoPadding 都可以
//至于原理,待研究
static String[] conf = new String[] {"1.0.0", "ab3d2e93fc3ff8bd2d48e3fa39750be7", "AES", "AES/ECB/PKCS5Padding", "AES/ECB/PKCS5Padding"};
static String _source ="{this is json}";
static String _kid = "1.0.0";
public static void main(String[] args) throws Exception {
//加密过程: 与解密过程相反
String encrypt = encrypt(_source, _kid);
System.out.println(encrypt);
//解密过程: 加密字符串->Base64解码字节数组->Crypt解密取得字节数组->utf8编码取得字符串
String src = decrypt(encrypt, _kid);
System.out.println(src);
}
/**
* 加密
* @param source 原文
* @param kid 秘钥对应的key
* @return
* @throws Exception
*/
public static String encrypt(String source,String kid) throws Exception {
byte[] bytes = source.getBytes("UTF-8");
SecretKey keytmp = new SecretKeySpec(hexString2Byte(conf[1]), conf[2]);
Cipher cp_en = Cipher.getInstance(conf[3]); //加密
cp_en.init(Cipher.ENCRYPT_MODE, keytmp);
byte[] encrypt = cp_en.doFinal(bytes);
byte[] base64Encrypt = Base64.encodeBase64(encrypt);
String edata = new String(base64Encrypt, "UTF-8");
return edata;
}
/**
* 解密
* @param data 密文
* @param kid 秘钥对应的key
* @return
* @throws Exception
*/
public static String decrypt(String data, String kid) throws Exception {
byte[] original_bytes = Base64.decodeBase64(data);
SecretKey keytmp = new SecretKeySpec(hexString2Byte(conf[1]), conf[2]);
Cipher cp_de = Cipher.getInstance(conf[4]); //解密
cp_de.init(Cipher.DECRYPT_MODE, keytmp);
byte[] zipped = cp_de.doFinal(original_bytes);
String content = new String(zipped, "UTF-8");
return content;
}
/**
* 16进制字符串转为byte[]
* 举例 0xf23a -> byte[]{0xf2,0x3a} 0xf2 = -14, 0x3a = 58
* @param str (字符范围:0-9 a-f)
* @return
*/
public static byte[] hexString2Byte(String hexStr) {
String str = hexStr.toLowerCase();
for (int i = 0; i < result.length; i++) {
byte b = (byte) ((((getStrIndex(str.charAt(2 * i))) & 0x0f) << 4) | ((getStrIndex(str.charAt(2 * i + 1))) & 0x0f));
result[i] = b;
}
return result;
}
public static int getStrIndex(char c) {
return "0123456789abcdef".indexOf(c);
}
}
分享到:
相关推荐
C#.NET密码加密解密Demo,代码完整,简单易懂,功能实用
android用MD5加密解密简单demo
MD5编码、MD5加密解密demo代码,详看博客 对字符串进行MD5编码及MD5加密和解密
c++ rc4代码,可以编译可以用。很小的DEMO 学习用
RSA 和 AES 加解密工具 1. http消息头可以传输rsa加密过后的AES密钥 2.实体数据经AES密钥进行加密3.为了保持数据的完整性,加密后的byte数据都经Base64加密转换成String类型进行传输
Delphi7与C#实现Des加解密互通Demo,全网找遍只次一份
加签加密解密验签demo,参考博客说明。这个demo是加签加密发送给服务器,然后服务器解密验签得到请求。然后服务器加密加签,发给请求方,请求方验签解密
Android RSA加密解密demo,详情请参看博客:http://blog.csdn.net/bbld_/article/details/38777491
一个较快的RSA加解密Demo,采用了网上的一个大数类,根据公式做大数运算获得,代码实现较为简单,与java互动成功。本例采用vs2005 mfc编写,其实现为标准c移植神马的很方便。
这是一个用于微信小游戏的DES加解密的DEMO,基于著名的crypto-js实现,打开即可运行,代码简单
这个RSA加解密的Demo是我从别的地方花了好多金币下载的,希望对大家有帮助,资源共享嘛。
采用MD5算法对字符串进行加密和解密,加密生成的一串数字是生成32位md5码
常见加解密及数字签名Demo
简单的AES加密解密java文件。直接放入项目中,导入正确的包就可以用。
java语言编写DES加解密demo,仅供入门参考。
v6加解密资源demo
提供获取随机对称密钥接口以及对称加解密接口源码,其中对称加解密支持RC4加解密,DES加解密,3DES加解密以及AES加解密,所有接口都是正式封装的接口,测试输出数据均符合官方数据。
Delphi 加密解密Demo (MD5,AES,XOR) 源代码下载可参考使用
本项目是windows下VS开发项目,提供源码,支持RSA,MD5,DES等加解密,解压后直接导入到VS中运行即可。
关于Rsa加解密 iOSdemo,使用原生方式进行加解密,通过keychain保存相关秘钥对。