⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 encrypt.java

📁 自己写的java版的加密解密网络算法应用。有对称
💻 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 + -