JAVA常用加密技术

JAVA常用加密技术加密
最近看到公司一个以前项目的MD5加密方式,让我对JAVA加密感觉到一些兴趣,但是公司的MD5加密是自己写的一个MD5工具类算法类进行加密。但窝了解到一些其他的加密方式。
一、DES加密
DDES(Data Encryption Standar 数据加密标准算法)是一种常见的对称密钥加密算法,加密者使用密钥对原文加密,解密者必须使用相同的密钥才能对密文进行解密。
重点在KeyGenerator、Cipher、和Key类的使用

import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.security.Key;

import javax.crypto.Cipher;
import javax.crypto.KeyGenerator;

public class Test2 {

/**
* 生成密钥
*/
private void secretKey(){

String fileName = "d:/encry/密钥.dat";

try {
KeyGenerator keyGen = KeyGenerator.getInstance("DES");

keyGen.init(56);

Key key = keyGen.generateKey();

ObjectOutputStream out = new ObjectOutputStream(new FileOutputStream(fileName));

out.writeObject(key);

out.close();
} catch (Exception e) {
e.printStackTrace();
}
}


/**
* 加密
*/
private void encrypt(){

String fileName = "d:/encry/密钥.dat";

try {

//读取密钥
ObjectInputStream in = new ObjectInputStream(new FileInputStream(fileName));
Key key = (Key) in.readObject();

Cipher cipher = Cipher.getInstance("DES");
cipher.init(Cipher.ENCRYPT_MODE, key);
//加密
byte[] cipherText = cipher.doFinal("aaaaasda".getBytes("UTF-8"));


//保存加密文件
FileOutputStream fileOutputStream = new FileOutputStream("d:/encry/encrypt.txt",false);
fileOutputStream.write(cipherText);

fileOutputStream.close();
}catch (Exception e) {
e.printStackTrace();
}

}

/**
* 解密
*/
private void decrypt(){

try {

//读取加密文件
FileInputStream fi = new FileInputStream("d:/encryS/encrypt.txt");

byte[] cipherText = new byte[fi.available()];
fi.read(cipherText);
fi.close();


//读取密钥
ObjectInputStream in = new ObjectInputStream(new FileInputStream("d:/encry/密钥.dat"));
Key key = (Key) in.readObject();

Cipher cipher = Cipher.getInstance("DES");
cipher.init(Cipher.DECRYPT_MODE, key);


byte[] text = cipher.doFinal(cipherText);

System.out.println(new String(cipherText,"UTF-8"));

} catch (Exception e) {
e.printStackTrace();
}

}

}

二、RSA加密(不对称密钥加密,加密和解密的密钥是不一样的,常见的方法是用户生成一对密钥,将公钥发送给别人,别人使用公钥加密,此时密文只能被用户的另一个私钥解密,有效解决了密钥传递可能产生的密钥泄露问题)
注意:KeyPairGenerator、Cipher、KeyPair类的使用

import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.security.KeyPair;
import java.security.KeyPairGenerator;
import java.security.PrivateKey;
import java.security.PublicKey;

import javax.crypto.Cipher;


public class Rsa {


/**
* 生成密文
*/
private void secretKey(){

KeyPairGenerator keyPairGenerator;
try {
keyPairGenerator = KeyPairGenerator.getInstance("RSA");
//采用1024位
keyPairGenerator.initialize(1024);


KeyPair key = keyPairGenerator.generateKeyPair();
PublicKey publicKey = key.getPublic();
PrivateKey privateKey = key.getPrivate();

ObjectOutputStream ot = new ObjectOutputStream(new FileOutputStream("d:test/私钥.dat"));
ot.writeObject(privateKey);
ot.close();


ot = new ObjectOutputStream(new FileOutputStream("d:test/公钥.dat"));
ot.writeObject(privateKey);
ot.close();


} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}

}


/**
* 加密
*/
private void crypt(){


try {
ObjectInputStream os = new ObjectInputStream(new FileInputStream("d:/test/公钥.dat"));
PublicKey publicKey = (PublicKey) os.readObject();

Cipher cipher = Cipher.getInstance("RSA");
cipher.init(Cipher.ENCRYPT_MODE, publicKey);

byte[] cipherTxt = cipher.doFinal("test".getBytes("UTF-8"));

FileOutputStream fileOutputStream = new FileOutputStream("d:/test/密文.txt",false);
fileOutputStream.write(cipherTxt);
fileOutputStream.close();

} catch (FileNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}

/**
* 解密
*/
private void deCrypt(){
try {


FileInputStream fileInputStream = new FileInputStream("d:/test/密文.txt");
byte[]cipherText = new byte[fileInputStream.available()];
fileInputStream.read(cipherText);
fileInputStream.close();


ObjectInputStream fi = new ObjectInputStream(new FileInputStream("d:test/私钥.dat"));
PrivateKey privateKey = (PrivateKey) fi.readObject();

Cipher cipher = Cipher.getInstance("RSA");
cipher.init(Cipher.DECRYPT_MODE, privateKey);

byte[] plainText = cipher.doFinal(cipherText);
System.out.println(new String(plainText,"UTF-8"));

} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}


三、信息验证(MD5),MD5算法是一种常见的消息摘要算法,它能够将原始信息文本生成一个消息摘要值,这个消息摘要值也称为哈希值,只要文本不同,就会得到一个不同的消息摘要,而且几乎不能从消息摘要反向推出原始信息文本。
主要注意:MessageDigest类的使用
四、文件签名(主要是密钥不对称加密算法的另一种应用,主要用于验证文件类容是否被篡改,原理是对原始文件使用私钥加密得到签名文件,验证者使用公钥对签名文件解密,对比原文件)
主要注意:generateKeys、sign和validateSign方法及signature方法
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值