常⽤的加密算法
⼀、摘要算法
1》MD5算法(Message Digest Algorithm 5) 可以保证数据传输完整性和⼀致性 摘要后长度为16字节 摘要信息中不包含原⽂信息
所有加密结果不可逆(⽆法解密) ⼀般在传送⽂件时 对源⽂件进⾏md5 hash 传送到对⽅后 检测hash值是否相等 如果相等⽂件传输正确
如果不相等 说明⽂件被篡改(加⼊⽊马)或者未传送完成
其他MD算法 MD2(16字节)
public static void main(String[] args) throws NoSuchAlgorithmException {
MessageDigest Instance("MD5") ;
String code="hello";
byte[] bt=md.Bytes());
System.out.println(bt.length);
}
2》SHA算法Secure Hash Algorithm(安全hash算法) 安全散列算法(hash函数 将原始信息压缩 返回散列值)可以是SHA-
1,SHA1是⽬前最安全
的摘要算法 摘要的长度为 20字节
其他的SHA 包括 SHA-256(32字节)
public static void main(String[] args) throws NoSuchAlgorithmException {
MessageDigest Instance("SHA") ;//或者SHA-1 SHA1
String code="hello";
byte[] bt=md.Bytes());
System.out.println(bt.length);
}
⼆、编码和解码
1》16进制 编码 计算机系统使⽤ 2进制 为了编写存储⽅便⼀般将2进制 转换为16进制字符串 其中base64也是其中类似转换⼀种 16进制编码和base64都是
可逆的 ⼀般⽤于存储
public static byte[] toByte(String src){
ByteArrayOutputStream baos=new ByteArrayOutputStream();
for(int i=0;i<src.length();i=i+2){
char fchar=src.charAt(i);
char nchar=src.charAt(i+1);
byte srcb=0;
if(fchar=='0'){
srcb=Byte.parseByte(nchar+"", 16);
}else{
srcb=(byte)(Integer.parseInt(fchar+""+nchar, 16));
}
baos.write(srcb);
}
ByteArray();
}
public static String toHex(byte[] src){
StringBuffer sb=new StringBuffer();
for(byte s:src){
/
/0XFF表⽰ 8位的 11111111 和它&后 只剩下 8位 其他位都为0
String HexString(s&0xFF);
if(result.length()==1){
result='0'+result;
}
sb.append(result);
}
String();
}
2》Base64编码 ⽤于将字节数组和字符串互相转换
public static void main(String[] args) throws NoSuchAlgorithmException, IOException {
byte[] src="hello".getBytes();
//摘要出来的结果为字节数组 存储到数据库不⽅便
MessageDigest Instance("SHA") ;
byte[] bt=md.digest(src);
//使⽤base64转换为字符串⽅便存储
BASE64Encoder base=new BASE64Encoder();
String de(bt);
System.out.println(str);
//还原成字节数组
BASE64Decoder de=new BASE64Decoder();
byte[] bts=de.decodeBuffer(str);
System.out.println(bt.length==bts.length);
}
三、对称加密
1》DES算法 (Data Encryptin Standard) 是对称加密算法的⼀种 使⽤秘钥加解密 秘钥必须是56字节 概念解释:
秘钥 :⽤于加密和解密的钥匙 秘钥可以使⽤ getEncoded⽅法 获取byte[] 存储在⽂件系统中
公钥和私钥:⽤于⾮对称加密的钥匙 公钥加密 私钥解密 私钥⼀般⽤于解密所以私钥⼀般存储在密钥库中
⼝令:⼀般是⾃定义的字符串 可以通过⼝令和盐⽣成秘钥
/**
* ⽣成56字节的秘钥
*/
public static SecretKey genKey(int len) throws NoSuchAlgorithmException{
KeyGenerator Instance("DES");
kg.init(len);
ateKey();
}
public static void main(String[] args) throws Exception {
//SecretKey sk=new Bytes(), "DES");
SecretKey sk=genKey(57);
//---------加密
String password="tiger";
Cipher Instance("DES");
cipher.init(Cipher.ENCRYPT_MODE, sk);
//被加密之后获取的字节数组
byte[] mcontent=cipher.Bytes());
//---------解密
Cipher Instance("DES");
cipher1.init(Cipher.DECRYPT_MODE, sk);
System.out.println(new String(cipher1.doFinal(mcontent)));
}
2》AES算法 (Advanced Encryptin Standard ⾼级加密标准) 是对称加密算法⼀种升级 因为 56位秘钥 在计算机系统性能越来越⾼的前提下 56位很容易被
破解 所以 AES将秘钥的长度提⾼到128, 192 or 256 必须是这三个数 128默认可以使⽤ 192和256由于美国限制 需要相关授权 否则抛出异常
public static final String AL="AES";
/**
* ⽣成56字节的秘钥
*/
public static SecretKey genKey(int len) throws NoSuchAlgorithmException{
KeyGenerator Instance(AL);
kg.init(len);
ateKey();
}
public static void main(String[] args) throws Exception {
//SecretKey sk=new Bytes(), "DES");
SecretKey sk=genKey(128);
//---------加密
String password="tiger";
Cipher Instance(AL);
cipher.init(Cipher.ENCRYPT_MODE, sk);
//被加密之后获取的字节数组
byte[] mcontent=cipher.Bytes());
//---------解密
Cipher Instance(AL);
cipher1.init(Cipher.DECRYPT_MODE, sk);
System.out.println(new String(cipher1.doFinal(mcontent)));
}
3》PBE算法(Password Base Encryption) 基于⾃定义⼝令的加解密算法 定义⼝令 同时还必须定义 盐和 使⽤盐混淆的次数 加解密过程中 该三个参数都必须⼀致
//盐 ⽤于将明⽂进⾏多次混淆
static byte[] salt = new byte[8];
static Random r = new Random();
static int saltCount=100;
static{
}
public static final String AL="PBEWithMD5AndDES";
/**
* ⽣成⾃定义⼝令的秘钥
*/
public static SecretKey genKey(String kl) throws Exception{
char[] CharArray();
PBEKeySpec pbe=new PBEKeySpec(klChar);
SecretKeyFactory Instance(AL);
ateSecret(pbe);
}
/**
* 使⽤⼝令和盐进⾏加密
*/java源代码加密
public static byte[] encrypt(SecretKey key,byte[] src) throws Exception{
Cipher Instance(AL);
//使⽤⼝令 盐(100次混淆)
PBEParameterSpec parameter=new PBEParameterSpec(salt, saltCount); cipher.init(Cipher.ENCRYPT_MODE, key,parameter);
//被加密之后获取的字节数组
byte[] mcontent=cipher.doFinal(src);
return mcontent;
}
/**
* 使⽤⼝令和盐进⾏解密 盐和⼝令和混淆的次数都必须和加密之前⼀致
*/
public static byte[] decrypt(SecretKey key,byte[] src) throws Exception{
Cipher Instance(AL);
//使⽤⼝令 盐(100次混淆)
PBEParameterSpec parameter=new PBEParameterSpec(salt, saltCount); cipher.init(Cipher.DECRYPT_MODE, key,parameter);
//被加密之后获取的字节数组
byte[] mcontent=cipher.doFinal(src);
return mcontent;
}
public static void main(String[] args) throws Exception {
//SecretKey sk=new Bytes(), "DES");
SecretKey sk=genKey("123456");
//---------加密
String password="tiger";
byte[] mw=encrypt(sk, Bytes());
//---------解密
System.out.println(new String(decrypt(sk, mw)));
}
四、⾮对称加密
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论