파일 복호화 알고리즘

8530 단어 Java
1.알고리즘 소개
 본 고 는 주로 MD5 알고리즘,BASE 64 알고리즘,DES 알고리즘 과 PBE 알고리즘 의 자바 실현 에 대해 소개 한다.
 MD5 즉 Message-Digest Algorithm 5(정보-요약 알고리즘 5)는 정보(Message)에 대한 정보 요약(Message-Digest)을 생 성하 여 변경 되 지 않도록 합 니 다.현재 MD5 알고리즘 은 믹스 충돌 방법 을 통 해 풀 수 있다.
 Base 64 는 네트워크 에서 가장 흔히 볼 수 있 는 8Bit 바이트 코드 를 전송 하 는 인 코딩 방식 중 하나 이다.엄 밀 히 말 하면 Base 64 는 인 코딩 방식 일 뿐 암호 화 방법 이 라 고 할 수 없다.Base 64 인 코딩 은 바 이 너 리 에서 문자 로 가 는 과정 으로 HTTP 환경 에서 비교적 긴 표지 정 보 를 전달 할 수 있 습 니 다.
 DES 는 모두 Data Encryption Standard,즉 데이터 암호 화 표준 이 라 고 부 르 며 키 암호 화 를 사용 하 는 블록 알고리즘 이자 대칭 암호 화 알고리즘 입 니 다.그것 은 3 개의 입구 매개 변수 가 있 습 니 다:Key,Data,Mode.그 중에서 Key 는 7 개의 바이트 가 모두 56 비트 이 고 DES 알고리즘 의 작업 키 입 니 다.Data 는 8 개의 바이트 64 비트 로 암호 화 되 거나 복호화 될 데이터 입 니 다.Mode 는 DES 의 작업 방식 으로 두 가지 가 있 습 니 다.암호 화 또는 복호화 입 니 다.
 PBE 알고리즘(Password Based Encryption,암호 화 기반)은 암호 화 를 기반 으로 하 는 암호 화 알고리즘 으로 키 대신 암 호 를 사용 하 는 것 이 특징 이 며,암 호 는 사용자 가 직접 관리 하 며,무 작위 숫자 로 다 중 암호 화 등 방법 으로 데이터 의 안전성 을 확보 하 는 것 이 특징 이다.사용자 가 입력 한 암 호 를 먼저'소금'(salt)의 교란 을 통 해 준 키 를 만 든 다음 에 준 키 를 해시 함 수 를 여러 번 교체 한 후에 최종 암호 화 키 를 생 성 합 니 다.키 가 생 성 된 후에 PBE 알고리즘 은 대칭 암호 화 알고리즘 을 사용 하여 데 이 터 를 암호 화 합 니 다.DES,3DES,RC5 등 대칭 암호 화 알고리즘 을 선택 할 수 있 습 니 다.
2.알고리즘 구현
 MD5 는 자바 자체 함수 라 이브 러 리 로 구현 할 수 있 으 며,Base 64,DES,PBE 는 패키지 comons-codec-1.11.jar 를 가 져 와 야 합 니 다.
import java.io.*;
import java.security.InvalidAlgorithmParameterException;
import java.security.InvalidKeyException;
import java.security.Key;
import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;
import java.security.spec.InvalidKeySpecException;
import java.util.Random;

import javax.crypto.BadPaddingException;
import javax.crypto.Cipher;
import javax.crypto.IllegalBlockSizeException;
import javax.crypto.NoSuchPaddingException;
import javax.crypto.SecretKey;
import javax.crypto.SecretKeyFactory;
import javax.crypto.spec.DESKeySpec;
import javax.crypto.spec.IvParameterSpec;
import javax.crypto.spec.PBEKeySpec;
import javax.crypto.spec.PBEParameterSpec;

import org.apache.commons.codec.binary.Base64;

public class FileEncAndDec {
	private static String ALGORITHM = "DES";//DES
	private static byte[] keyBytes="01234567".getBytes();
	
	private static String ALGORITHM_PBE = "PBEWITHMD5andDES";//PBE
	private static String password="sacdfsbgdbg";
	static Key key;
	static byte[] salt;
	
	public static void main(String[] args) throws Exception {

//		File srcFile = new File("src/doc/            20180106.doc"); //     (    )
//		File encFile = new File("src/doc/tmp"); //     
//		File decFile = new File("src/doc/            .doc"); //     

		File srcFile = new File("src/doc/CCSC.zip"); //     (    )
		File encFile = new File("src/doc/tmp"); //     
		File decFile = new File("src/doc/CCSC1.zip"); //     
		
		key=toKey();
		salt=initSalt();		
		
		try {
			EncFile(srcFile, encFile); //     
		} catch (Exception e) {
			e.printStackTrace();
		}
		
		try {
			DecFile(encFile, decFile); //     
		} catch (Exception e) {
			e.printStackTrace();
		}
	}

	//    
	private static void EncFile(File srcFile, File encFile) throws Exception {
		Long filelength = srcFile.length();  //    
        byte[] filecontent = new byte[filelength.intValue()]; //    
		
		if (!srcFile.exists()) {
			System.out.println("source file not exixt");
			return;
		}
		if (!encFile.exists()) {
			System.out.println("encrypt file created");
			encFile.createNewFile();
		}
		InputStream fis = new FileInputStream(srcFile);
		OutputStream fos = new FileOutputStream(encFile);
		
		fis.read(filecontent);
		
//		fos.write(EncoderByBase64(filecontent));//Base64
		
//		fos.write(EncoderByDES(filecontent));//DES		
		
		fos.write(EncoderByPBE(filecontent,key, salt));
		
		fis.close();
		fos.flush();
		fos.close();
	}

	//    
	private static void DecFile(File encFile, File decFile) throws Exception {
		Long filelength = encFile.length();  //    
        byte[] filecontent = new byte[filelength.intValue()]; //    
		
		if(!encFile.exists()){
			System.out.println("encrypt file not exixt");
			return;
		}
		if(!decFile.exists()){
			System.out.println("decrypt file created");
			decFile.createNewFile();
		}
		
		InputStream fis  = new FileInputStream(encFile);
		OutputStream fos = new FileOutputStream(decFile);
		
		fis.read(filecontent);
		
//		fos.write(DecoderByBase64(filecontent));//Base64
		
//		fos.write(DecoderByDES(filecontent));//DES
		
		fos.write(DecoderByPBE(filecontent,key, salt));
		
		fis.close();
		fos.flush();
		fos.close();
	}
	
	///////////////////////////////////////////////////////////////////
	/*                             Base64                            */
	///////////////////////////////////////////////////////////////////
	
	//Base64    
	public static byte[] EncoderByBase64(byte[] base64Byte) throws NoSuchAlgorithmException, UnsupportedEncodingException{
		byte[] base64=Base64.encodeBase64(base64Byte);//    
        return base64;
	}
	//Base64    
	public static byte[] DecoderByBase64(byte[] base64Byte) throws NoSuchAlgorithmException, UnsupportedEncodingException{
		byte[] base64=Base64.decodeBase64(base64Byte);//    
        return base64;
	}
	
	//DES    
	public static byte[] EncoderByDES(byte[] DESByte) 
			throws InvalidKeyException, NoSuchAlgorithmException, InvalidKeySpecException, 
			NoSuchPaddingException, InvalidAlgorithmParameterException, 
			IllegalBlockSizeException, BadPaddingException{
		DESKeySpec keySpec=new DESKeySpec(keyBytes);  //    
        SecretKeyFactory keyFactory=SecretKeyFactory.getInstance(ALGORITHM);              
        SecretKey key=keyFactory.generateSecret(keySpec);   //          
          
        Cipher cipher=Cipher.getInstance("DES/CBC/PKCS5Padding");  
        cipher.init(Cipher.ENCRYPT_MODE, key, new IvParameterSpec(keySpec.getKey()));             
        byte[] result=cipher.doFinal(DESByte);  
        return result;
	}
	//DES    
	public static byte[] DecoderByDES(byte[] DESByte) 
			throws NoSuchAlgorithmException, UnsupportedEncodingException, 
			InvalidKeyException, InvalidKeySpecException, NoSuchPaddingException, 
			InvalidAlgorithmParameterException, IllegalBlockSizeException, BadPaddingException{
		DESKeySpec keySpec=new DESKeySpec(keyBytes);  
        SecretKeyFactory keyFactory=SecretKeyFactory.getInstance(ALGORITHM);  
        SecretKey key=keyFactory.generateSecret(keySpec);  //    
          
        Cipher cipher=Cipher.getInstance("DES/CBC/PKCS5Padding");  
        cipher.init(Cipher.DECRYPT_MODE, key, new IvParameterSpec(keyBytes));  
        byte[] result=cipher.doFinal(DESByte);  
        return result;
	}	
	
	///////////////////////////////////////////////////////////////////
	/*                             PBE                               */
	///////////////////////////////////////////////////////////////////
	
	//PBE salt   
	public static byte[] initSalt() throws Exception {
		byte[] salt = new byte[8];
		Random random = new Random();
		random.nextBytes(salt);
		return salt;
	}
 
	//    
	private static Key toKey() throws Exception {
		PBEKeySpec keySpec = new PBEKeySpec(password.toCharArray());
		SecretKeyFactory keyFactory = SecretKeyFactory.getInstance(ALGORITHM_PBE);
		SecretKey secretKey = keyFactory.generateSecret(keySpec);
		return secretKey;
	}
	
	//PBE    
	public static byte[] EncoderByPBE(byte[] PBEByte,Key key, byte[] salt) throws Exception{		 
		PBEParameterSpec paramSpec = new PBEParameterSpec(salt, 100);
		Cipher cipher = Cipher.getInstance(ALGORITHM_PBE);
		cipher.init(Cipher.ENCRYPT_MODE, key, paramSpec);
		return cipher.doFinal(PBEByte);
	}
	//PBE    
	public static byte[] DecoderByPBE(byte[] PBEByte,Key key,byte[] salt) throws Exception{
		PBEParameterSpec paramSpec = new PBEParameterSpec(salt, 100);
		Cipher cipher = Cipher.getInstance(ALGORITHM_PBE);
		cipher.init(Cipher.DECRYPT_MODE, key, paramSpec);
		return cipher.doFinal(PBEByte);
	}	
	
	///////////////////////////////////////////////////////////////////
	/*                             MD5                               */
	///////////////////////////////////////////////////////////////////
	
	//MD5    
	public static byte[] EncoderByMd5(byte[] md5Byte) throws NoSuchAlgorithmException, UnsupportedEncodingException{
        //      
        MessageDigest md5=MessageDigest.getInstance("MD5");//    
        md5.update(md5Byte);
        byte[] newByte = md5.digest(); 
        return newByte;
    }
}

좋은 웹페이지 즐겨찾기