您的位置:首页 > 理论基础 > 计算机网络

android网络安全

2016-05-26 14:40 459 查看
1.ssl(网络安全)

2.sqliste(数据库安全)

3.代码安全—使用jni技术,对敏感代码才有c/c++实现

4.接入权限

5.数字证书

其中—网络安全:通过加密算法等实现{

(对称加密DES,AES,非对称加RSA,单向加密MD5)}

md5
public class MD5 {

/***
* MD5加密 生成32位md5码
* @return 返回32位md5码
*/
public static String md5Encode(String inStr) throws Exception {
MessageDigest md5 = null;
try {
md5 = MessageDigest.getInstance("MD5");

} catch (Exception e) {
System.out.println(e.toString());
e.printStackTrace();
return "";
}

byte[] byteArray = inStr.getBytes("UTF-8");
byte[] md5Bytes = md5.digest(byteArray);
StringBuffer hexValue = new StringBuffer();
for (int i = 0; i < md5Bytes.length; i++) {
int val = ((int) md5Bytes[i]) & 0xff;
if (val < 16) {
hexValue.append("0");
}
hexValue.append(Integer.toHexString(val));
}
return hexValue.toString();
}

}


我发现解密有问题 ,你们看看我哪里错了

public class DES {

//初始化向量,随意
private static  byte[] iv ={1,2,3,4,5,6,7,8};
//des加密
//encryptString为原文
//encrytKey为密钥
//返回加密后的密文
public static String encryptDES(String encryptString,String encrytKey)throws  Exception{
//实例化IvParameterSpec对象,使用指定的初始化向量
IvParameterSpec zeroIv = new IvParameterSpec(iv);
//实例化类SecretKeySpec ,根据字节数组来构造encrytKey
SecretKeySpec keySpec = new SecretKeySpec(encrytKey.getBytes(),"DES");
//创建密码器
Cipher cipher = Cipher.getInstance("DES/CBC/PKCS5Padding");
//用密尺初始化Cipher对象
cipher.init(Cipher.ENCRYPT_MODE,keySpec,zeroIv);
//执行加密操作
byte[] encryptedData =cipher.doFinal(encryptString.getBytes());
//返回加密后的数据
return Base64.encodeToString(encryptedData,Base64.DEFAULT);

}

//DES解密
//encryptString为原文
//encrytKey为密钥
//返回解密后的密文
public static String decryptDES(String decryptString,String decryptKey)throws  Exception{
//先使用Base64解密

byte[] byteMI = Base64.decode(decryptString,Base64.DEFAULT);
//实例化IvParameterSpec对象,使用指定的初始化向量
IvParameterSpec zeroIv = new IvParameterSpec(iv);
//实例化类SecretKeySpec ,根据字节数组来构造decryptKey
SecretKeySpec key = new SecretKeySpec(decryptKey.getBytes(),"DES");
//创建密码器
Cipher cipher = Cipher.getInstance("DES/CBC/PKCS5Padding");
//用密尺初始化Cipher对象
cipher.init(Cipher.ENCRYPT_MODE,key,zeroIv);
//获取解密的数据
byte[] decryptedData=cipher.doFinal(byteMI);
//解密数据转换为字符串输出

return  new String(decryptedData,"UTF-8");

}

/**
* 下面是调用代码
* //指定密钥
* String key = "123456"
* //需要加密的明文
*String text ="abcdef"
*
* String encryptResult=DES.encryptDES(text,key);
* String decryptResult=DES.decryptDES(encryptResult,key);
*
* Log打印
*
*
*/

}


我发现解密有问题 ,你们看看我哪里错了
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);

}

//对密钥进行编码
private 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[] rawKey, byte[] clear) throws Exception{
//生成一组扩展密钥,并放入数组中
SecretKeySpec skeySpec= new SecretKeySpec(rawKey,"AES");
Cipher cipher=Cipher.getInstance("AES");
//用ENCRYPT_MODE模式,用skeySpec密码组,生成AES加密方法
cipher.init(Cipher.ENCRYPT_MODE,skeySpec);
//得到加密数据
byte[] encryted= cipher.doFinal(clear);
return encryted;
}

//将十进制数转换为十六进制数
private static String toHex(byte[] buf) {
if(buf==null)
return "";
StringBuffer result = new StringBuffer(2*buf.length);
for (int i=0;i<buf.length;i++){
addendHex(result,buf[i]);
}
return result.toString();

}

private final static String HEX="0123456789ABCDEF";
private static void addendHex(StringBuffer result, byte b) {
result.append(HEX.charAt((b>>4)&0x0f)).append(HEX.charAt(b&0x0f));
}

//AES解密
//encrypted为需要解密的内容
//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);

}

//将十六进制字符串转换为十进制字节s数组
private static byte[] toByte(String hexStirng) {
int len=hexStirng.length()/2;
byte[] result=new byte[len];
for(int i=0;i<len;i++)
result[i]=Integer.valueOf(hexStirng.substring(2*i,2*i+2),16).byteValue();
return result;

}
//解密
private static byte[] decrypt(byte[] rawKey, byte[] enc)throws  Exception {
//生成一组扩展密钥,并放入一个数组之中
SecretKeySpec skeySpec= new SecretKeySpec(rawKey,"AES");
Cipher cipher=Cipher.getInstance("AES");
//用ENCRYPT_MODE模式,用skeySpec密码组,生成AES解密方法
cipher.init(Cipher.ENCRYPT_MODE,skeySpec);
//得到解密数据
byte[] encrypted=cipher.doFinal(enc);
return encrypted;

}

//将十进制数转换为十六进制
public static String toHex(String txt){
return toHex(txt.getBytes());

}

//将十六进制字符串转换为十进制字符串
public static String fromHex(String hex){
return  new String(toByte(hex));

}

/*
调用
//密钥
String mesterPassword="Android";
//设置原文
String originalText="abc";
//加密
String en=AES.encrypt(mesterPassword,originalText);
//解密
String decryptingCode= AES.decrypt(mesterPassword,en);

*/

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: