파일 복호화 알고리즘
8530 단어 Java
본 고 는 주로 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;
}
}
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
JPA + QueryDSL 계층형 댓글, 대댓글 구현(2)이번엔 전편에 이어서 계층형 댓글, 대댓글을 다시 리팩토링해볼 예정이다. 이전 게시글에서는 계층형 댓글, 대댓글을 구현은 되었지만 N+1 문제가 있었다. 이번에는 그 N+1 문제를 해결해 볼 것이다. 위의 로직은 이...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.