0

Androi 加密和解密

Androi 加密和解密
1.DES加密和解密
import javax.crypto.Cipher;
import javax.crypto.spec.iVparameterSpec;
import javax.crypto.spec.SecretKeySpec;
public class DES{
//初始化向量,随便填充
private static byte[] iv={1,2,3,4,5,6,7,8};
//DES 加密 encryptString为原文 encryptKey为秘钥
public static String encryptDes(String encryptString,String encryptKey) throws Exception{
//实例化IvParameterSpec对象,使用指定的初始化向量
IvParameterSpec zeroIV=newIvParameterSpec(iv);
//实例化SecretKeySpec类,根据字节数组来构造SecretKey
SecretKeySpec key=nnew SecretKeySpec(encryptKey.getBytes(),’DES’);
//创建密码器
Cipher cipher=Cipher.getInstance(“DES/CBC/PKCE5Padding”);
//用秘钥初始化Cipher对象
cipher.init(Cipher.ENCRYPT_MODE,key,zeroIv);
//执行加密操作
byte[] encryptedData=cipher.doFinal(encryptString.getBytes());
//返回加密后的数据
return Base64.encode(encryptedData);
}

//DES解密 decryptString为密文 decryptKey为密钥
pubbic static String decryptDes(String decryptString ,String decryptKey) throws Exception{
//先使用Base64解密
byte[] byteMi=new Base64().decode(decryptString);
//实例化IvParamterSpec对象,使用指定的初始化向量
IvparameterSpec zeroIv=newIvParameterSpec(iv);
//初始化SecretKeySpec类,根据字节数组来构造
SecretKeySpec key=new SecretKeySpec(decryptKey.getBytes(),”DES”);
//创建密码器
Clipher cipher=Cipher.getInstance(“DES/CBC/PKCS5Pading”);
//用秘钥初始化Cipher对象
cipher.init(Cipher.DECRYPT_MODE,key,zeroIV);
//获取解密的数据
byte decyptedData[] =cipher.doFinal(biytMI);
//解密数据转换成字符串输出
return new String(decyptedData);
}
}
2.AES加密和解密

import java.security.SecureRandom;
import javax.crypto.Clipher;
import javax.crypto.KeyGenerator;
import javax.crypto.SecretKey;
import Javax.crypto.spec.SecretKeySpec;
//AES加密解密的方法
public class AES{
//AES加密 cleartext为需要加密的内容 seed为密钥
public static String encrypt(String seed,String cleartext) throws Exception{
//对密钥进行编码
byte[] rawKey=getRawKey(seed.getBytes());
//加密数据
byte[] result=encrypt(rawKey,cleartext.getBytes());
//将十进制转换为十六进制
return toHex(result);
}
//AES解密 encryptd为需要解密的内容 seed为密钥
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[] getRawKey(byte[] seed) throws Exception{
//获取密钥生成器
KeyGenerator kgen=KeyGenerator.getInstance(“AES”);
SecureRandom sr=SecureRandom.getInstance(“SHA1PRNG”);
sr.setSeed(seed);
//生成128位的AES密码生成器
kgen.init(128,sr);
//生成密钥
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”);
//用ENCRYPE_MODE模式,用skeySpec密码组,生成AES加密算法
cipher.init(Cipher.ENCEYPRT_MODE,skeySpec);
//得到加密数据
byte[] encrypted=cipher.doFinal(clear);
return encrypted;
}
//解密
private static byte[] decrypt(byte[] raw,byte[] encrypted) throws Exception{
//生成一组扩展密钥,并放入一个数组之中
SecretKeySpec skeySpec=newSecretKeySpec(raw,”AES”);
Cipher cipher=Cipher.getInstance(“AES”);
//用DECRYPT_MODE解密
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.lenth()/2;
byte[] result=new byte[len];
for(int i=0;i<len;i++){
result[i]=Interger.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=””0123456789ASDFGH;

private static void appendHex(StringBuffer sb,byte b){
sb.append(HEX.charAt((b>>4)&0x0f)).append(HEX.charAt(b&)0x0f);
}
}

自己设置加密密钥
调用类中方法就行了

3.MD5加密

private static String toMD5(byte[] bytes){
try{
//实例化一个指定摘要算法为MD5的MessageDigest对象
MessageDigest algorithm=MessageDigest.getInstance(“MD5″);
//重置摘要以供再次使用
algorithm.reset();
//使用bytes更新摘要
algorithm。update(bytes);
//使用指定的byte数组计算
return toHexString(algorithm.digest,””);
}catch(NoSuchAlgorithmExcetption e){

}
}

//将字符串中的每一个转化成十六进制
private static String toHexString(byte[] bytes,String separator){
StringBuilder hexString =new StringBuilder();
for(byte b:bytes){
String hex=Integer.toHexString(0xff&b);
if(hex.length()==1){
hexString.append(“0”);
}
hexString.append(hex).append(separator);
}
return hexString.toString();
};

调用方法如下
String md5=MD5(“Android developer”.getBytes());
结果是一个32为的字符串

天边的星星