📄 encrypt.java
字号:
/**
* 提供加密解密的各种方法
* @author zyp
*
*/
import javax.crypto.*;
import java.io.*;
import java.security.*;
import javax.crypto.spec.*;
/**
* 用来封装key的类。
* @author zyp
*
*/
class Mykey implements Serializable{
final static long servialVersionUID=112348791;
SecretKey skey;
Key key;
PublicKey pubkey;
public Mykey(SecretKey skey,Key key)
{
this.skey = skey;
this.key = key;
}
public Mykey(SecretKey skey,PublicKey pubkey)
{
this.skey = skey;
this.pubkey = pubkey;
}
}
public class Encrypt {
/**
* 使用对称加密技术
* @param letterFile 明文
* @param encryptFile 密文
* @param keyFile 存放key的文件
* @param macFile 存放mac的文件
* @param enAlg 加密算法
* @param len 加密长度
* @throws Exception 操作产生错误
*/
public void priEncryptFile(String letterFile,String encryptFile,String keyFile,String macFile,String enAlg,int len)throws Exception
{
//1.初始化cipher,key,md
KeyGenerator keyGen = KeyGenerator.getInstance(enAlg);
keyGen.init(len);
Key key = keyGen.generateKey();
Cipher cipher = Cipher.getInstance(enAlg);
cipher.init(Cipher.ENCRYPT_MODE,key);
MessageDigest md = MessageDigest.getInstance("MD5");
//2.获取MAC
FileInputStream flet = new FileInputStream(letterFile);
FileOutputStream fmac = new FileOutputStream(macFile);
DigestInputStream din = new DigestInputStream(flet,md);
byte [] macResult = new byte[20];//= md.digest(); //= md.digest(); // 获取信息摘要
while(din.read()!=-1)
{
macResult = md.digest();
}
SecureRandom sr = new SecureRandom();
byte[] keyBytes = new byte[20];
sr.nextBytes(keyBytes);
SecretKey skey = new SecretKeySpec(keyBytes, "HmacSHA1");
Mac m = Mac.getInstance("HmacSHA1");
m.init(skey);
m.update(macResult);
byte[] mac = m.doFinal();
fmac.write(mac);
//3.加密明文
flet = new FileInputStream(letterFile);
FileOutputStream fencrypt = new FileOutputStream(encryptFile);
CipherInputStream cis = new CipherInputStream (flet,cipher);
byte []buf=new byte[50];
int size =0;
while((size=cis.read(buf))>0)
{
fencrypt.write(buf,0,size);
}
//4.把密钥写入文件
FileOutputStream fkey = new FileOutputStream(keyFile);
ObjectOutputStream okey = new ObjectOutputStream(fkey);
Mykey mykey = new Mykey(skey,key);
okey.writeObject(mykey);
//5.关闭文件流
fencrypt.close();
okey.close();
fkey.close();
fmac.close();
din.close();
cis.close();
}
/**
* 对称解密
* @param encryptFile 密文
* @param decryptFile 明文
* @param keyFile 存放key的文件
* @param macFile 存放mac的文件
* @throws Exception 操作产生错误
*/
public void priDecryptFile(String encryptFile,String decryptFile,String keyFile,String macFile)throws Exception
{
//1.读取key并初始化Cipher。
FileInputStream fkey = new FileInputStream(keyFile);
ObjectInputStream ikey = new ObjectInputStream(fkey);
Mykey mykey = (Mykey)ikey.readObject();
Key key = mykey.key;
SecretKey skey = mykey.skey;
Cipher cipher = Cipher.getInstance(key.getAlgorithm());
cipher.init(Cipher.DECRYPT_MODE,key);
MessageDigest md = MessageDigest.getInstance("MD5");
//2.解密文件
FileInputStream flet = new FileInputStream(encryptFile);
FileOutputStream fdecrypt = new FileOutputStream(decryptFile);
CipherInputStream cis = new CipherInputStream (flet,cipher);
byte []buf=new byte[100];
int size = 0;
while((size = cis.read(buf))>0)
{
fdecrypt.write(buf,0,size);
}
fdecrypt.close();
flet.close();
cis.close();
//3.检查文件是否被修改 MAC
FileInputStream fdec = new FileInputStream(decryptFile);
DigestInputStream din = new DigestInputStream(fdec,md);
byte [] macResult = new byte[16];// md.digest();
while(din.read()!=-1)
{
macResult = md.digest();
}
Mac m = Mac.getInstance("HmacSHA1");
m.init(skey);
m.update(macResult);
byte[] mac = m.doFinal();//再次计算mac值
byte [] mac2 = new byte[mac.length];
FileInputStream fmac = new FileInputStream(macFile);
size = fmac.read(mac2);//获取发送过来的mac值
//System.out.println("mac:"+new String(mac)+"\nmac:"+new String(mac2));
if(MessageDigest.isEqual(mac,mac2))
{
System.out.println("信息检查正常");
}
else
{
System.out.println("信息检查不正常");
}
//4.关闭文件流
din.close();
fmac.close();
fdec.close();
}
/**
* 使用非对称加密技术
* @param letterFile 明文
* @param encryptFile 密文
* @param keyFile 存放key的文件
* @param macFile 存放mac的文件
* @param enAlg 加密算法
* @param len 加密长度
* @throws Exception 操作产生错误
*/
public void pubEncryptFile(String letterFile,String encryptFile,String keyFile,String macFile,String enAlg,int len)throws Exception
{
//1.初始化cipher,key,md
KeyPairGenerator keygen = KeyPairGenerator.getInstance(enAlg);
keygen.initialize(len);
KeyPair keypair = keygen.generateKeyPair();
Cipher cipher = Cipher.getInstance(enAlg);
cipher.init(Cipher.ENCRYPT_MODE,keypair.getPrivate());
MessageDigest md = MessageDigest.getInstance("MD5");
//2.获取MAC
FileInputStream flet = new FileInputStream(letterFile);
FileOutputStream fmac = new FileOutputStream(macFile);
DigestInputStream din = new DigestInputStream(flet,md);
byte [] macResult = md.digest(); // 获取信息摘要
SecureRandom sr = new SecureRandom();
byte[] keyBytes = new byte[20];
sr.nextBytes(keyBytes);
SecretKey skey = new SecretKeySpec(keyBytes, "HmacSHA1");
Mac m = Mac.getInstance("HmacSHA1");
m.init(skey);
m.update(macResult);
byte[] mac = m.doFinal();
fmac.write(mac);
flet.close();
//3.分段加密文件
FileOutputStream fencrypt = new FileOutputStream(encryptFile);
flet = new FileInputStream(letterFile);
byte []buf=new byte[117];
int size =0;
while((size=flet.read(buf))>0)
{
byte[]cipherText = cipher.doFinal(buf,0,size);
fencrypt.write(cipherText);
buf = new byte[117];
}
fencrypt.close();
//4.保存key
FileOutputStream fkey = new FileOutputStream(keyFile);
ObjectOutputStream okey = new ObjectOutputStream(fkey);
Mykey mykey = new Mykey(skey,keypair.getPublic());
okey.writeObject(mykey);
//5.关闭文件流
okey.close();
fkey.close();
fmac.close();
din.close();
flet.close();
}
/**
* 非对称解密
* @param encryptFile 明文
* @param decryptFile 密文
* @param keyFile 存放key的文件
* @param macFile 存放mac的文件
* @throws Exception 操作产生错误
*/
public void pubDecryptFile(String encryptFile,String decryptFile,String keyFile,String macFile)throws Exception
{
//1.获取公钥并初始化cipher
FileInputStream fkey = new FileInputStream(keyFile);
ObjectInputStream ikey = new ObjectInputStream(fkey);
Mykey mykey = (Mykey)ikey.readObject();
PublicKey pubkey = mykey.pubkey;
SecretKey skey = mykey.skey;
Cipher cipher = Cipher.getInstance(pubkey.getAlgorithm());
cipher.init(Cipher.DECRYPT_MODE,pubkey);
MessageDigest md = MessageDigest.getInstance("MD5");
//2.分段解密文件
FileInputStream flet = new FileInputStream(encryptFile);
FileOutputStream fdecrypt = new FileOutputStream(decryptFile);
byte [] cipherText = new byte[128];
int size = 0;
while((size = flet.read(cipherText))>0)//分段
{
byte[]plainText = cipher.doFinal(cipherText);
fdecrypt.write(plainText);
}
fdecrypt.close();
flet.close();
//3.检查MAC
FileInputStream fdec = new FileInputStream(decryptFile);
byte[] temp = new byte[100];
size =fdec.read(temp);
DigestInputStream din = new DigestInputStream(fdec,md);
byte [] macResult = md.digest();
Mac m = Mac.getInstance("HmacSHA1");
m.init(skey);
m.update(macResult);
byte[] mac = m.doFinal();
byte [] mac2 = new byte[mac.length];
FileInputStream fmac = new FileInputStream(macFile);
size = fmac.read(mac2);
if(MessageDigest.isEqual(mac,mac2))
{
System.out.println("信息检查正常");
}
else
{
System.out.println("信息检查不正常");
}
//4.管理流
din.close();
fmac.close();
fdec.close();
}
public static void main(String args[])
{
Encrypt encrypt = new Encrypt();
try
{
//***********************1.对称加密算法测试****************************
/*encrypt.priEncryptFile("letter.txt","letter2.txt","key.txt","mac.txt","AES",128);
encrypt.priDecryptFile("letter2.txt","letter3.txt","key.txt","mac.txt");
encrypt.priEncryptFile("letter.txt","letter2.txt","key.txt","mac.txt","DES",56);
encrypt.priDecryptFile("letter2.txt","letter3.txt","key.txt","mac.txt");*/
//***********************2.非对成加密测试*****************************
/*encrypt.pubEncryptFile("letter.txt","letter2.txt","key.txt","mac.txt","RSA",1024);
encrypt.pubDecryptFile("letter2.txt","letter3.txt","key.txt","mac.txt");*/
}
catch(Exception ex)
{
System.out.print(ex);
}
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -