안 드 로 이 드 에서 파일 암호 화 복호화 실현
파일 복호화 의 절차 및 원리
1.암호 화 방법:파일 을 저장 할 때 입력 흐름 에서 파일 의 바이트 배열 을 캡 처 하고 바이트 배열 을 암호 화 합 니 다.암호 화 방식 과 알고리즘 은 수 요 를 보고 정 한 다음 에 암호 화 된 바이트 배열 을 파일 에 기록 하고 마지막 으로 암호 화 된 문 서 를 생 성 할 수 있 습 니 다.
2.복호화 방법:암호 화 방법 과 같이 바이트 데 이 터 를 복호화 하 는 것 에 불과 하고 마지막 으로 명문 파일 을 생 성 합 니 다.
3.암호 화 알고리즘:Android 시스템 자체 가 javax 패키지 의 Cipher 류 를 도 입 했 는데 이런 종류 에서 AES 대칭 암호 화 등 여러 가지 통용 되 는 암호 화 방식 을 제공 합 니 다.이 프로그램 에는 CipherUtil 도구 류 가 있 는데,그 안에 Cipher 를 사용 하여 AES 를 복호화 하 는 간단 한 방법 이 있 습 니 다.물론 Cipher 류 의 사용 을 잘 배 우 는 것 이 좋 습 니 다.
4.주의사항:
4.567917.하나의 파일 이 암호 화 된 파일 이 라 고 판단 하 는 방법 입 니 다.가장 쉬 운 방법 은 암호 화 된 파일 에 접미사 이름 을 통일 적 으로 추가 한 다음 에 복호화 한 후에 이 접미사 이름 을 제거 하고 원래 의 파일 형식 으로 복원 하 는 것 입 니 다.예 를 들 어 비밀문서 파일 의 통일 접 두 사 는'ipher'이 고 명문 파일 은'테스트.txt'이 며 암호 화 된 비밀문서 파일 은'테스트.txt.cipher'여야 합 니 다4.567917.파일 을 암호 화 할 때 또 하나의 중요 한 주의사항 은 암호 화 된 비밀문서 와 명문 의 길이 가 같 는 지 하 는 것 이다.만약 에 파일 을 읽 을 때 모든 바이트 배열 을 꺼 내 암호 화 하면 이 문 제 를 걱정 하지 않 아 도 된다.그러나 파일 을 암호 화 또는 세그먼트 로 나 누 어 읽 을 때 이 문 제 를 고려 할 수 밖 에 없다.가장 편리 한 방법 은 명문 과 암호 화 된 비밀문서 의 길이 가 같다 는 것 이다.길이 가 다 르 면 세그먼트 암호 화 되 어 있 기 때문에 비밀문 은 한 단락 의 비밀문 으로 연결 되 어 있 고 복호화 할 때 각 단락 의 비밀문 을 찾 을 수 없습니다.각 단락 의 비밀문 의 길이 가 얼마 인지 모 르 기 때 문 입 니 다.
주 코드
/**
* Created by zhangshuo on 2016/6/28.
*/
public class CustomFileCipherUtil {
/**
*
*/
public static final String CIPHER_TEXT_SUFFIX = ".cipher";
/**
* 32K
*/
private static final int CIPHER_BUFFER_LENGHT = 32 * 1024;
/**
* , ,
*
* @param filePath
* @return
*/
public static boolean encrypt(String filePath, CipherListener listener) {
try {
long startTime = System.currentTimeMillis();
File f = new File(filePath);
RandomAccessFile raf = new RandomAccessFile(f, "rw");
long totalLenght = raf.length();
FileChannel channel = raf.getChannel();
long multiples = totalLenght / CIPHER_BUFFER_LENGHT;
long remainder = totalLenght % CIPHER_BUFFER_LENGHT;
MappedByteBuffer buffer = null;
byte tmp;
byte rawByte;
//
for(int i = 0; i < multiples; i++){
buffer = channel.map(
FileChannel.MapMode.READ_WRITE, i * CIPHER_BUFFER_LENGHT, (i + 1) * CIPHER_BUFFER_LENGHT);
// ,
for (int j = 0; j < CIPHER_BUFFER_LENGHT; ++j) {
rawByte = buffer.get(j);
tmp = (byte) (rawByte ^ j);
buffer.put(j, tmp);
if(null != listener){
listener.onProgress(i * CIPHER_BUFFER_LENGHT + j, totalLenght);
}
}
buffer.force();
buffer.clear();
}
//
buffer = channel.map(
FileChannel.MapMode.READ_WRITE, multiples * CIPHER_BUFFER_LENGHT, multiples * CIPHER_BUFFER_LENGHT + remainder);
for (int j = 0; j < remainder; ++j) {
rawByte = buffer.get(j);
tmp = (byte) (rawByte ^ j);
buffer.put(j, tmp);
if(null != listener){
listener.onProgress(multiples * CIPHER_BUFFER_LENGHT + j, totalLenght);
}
}
buffer.force();
buffer.clear();
channel.close();
raf.close();
// , .cipher
// f.renameTo(new File(f.getPath() + CIPHER_TEXT_SUFFIX));
Log.d(" :", (System.currentTimeMillis() - startTime) /1000 + "s");
return true;
} catch (Exception e) {
e.printStackTrace();
return false;
}
}
/**
* , ,
*
* @param filePath , .cipher
* @return
*/
public static boolean decrypt(String filePath, CipherListener listener) {
try {
long startTime = System.currentTimeMillis();
File f = new File(filePath);
// if(!f.getPath().toLowerCase().endsWith(CIPHER_TEXT_SUFFIX)){
// // ,
// return false;
// }
RandomAccessFile raf = new RandomAccessFile(f, "rw");
long totalLenght = raf.length();
FileChannel channel = raf.getChannel();
long multiples = totalLenght / CIPHER_BUFFER_LENGHT;
long remainder = totalLenght % CIPHER_BUFFER_LENGHT;
MappedByteBuffer buffer = null;
byte tmp;
byte rawByte;
//
for(int i = 0; i < multiples; i++){
buffer = channel.map(
FileChannel.MapMode.READ_WRITE, i * CIPHER_BUFFER_LENGHT, (i + 1) * CIPHER_BUFFER_LENGHT);
// ,
for (int j = 0; j < CIPHER_BUFFER_LENGHT; ++j) {
rawByte = buffer.get(j);
tmp = (byte) (rawByte ^ j);
buffer.put(j, tmp);
if(null != listener){
listener.onProgress(i * CIPHER_BUFFER_LENGHT + j, totalLenght);
}
}
buffer.force();
buffer.clear();
}
//
buffer = channel.map(
FileChannel.MapMode.READ_WRITE, multiples * CIPHER_BUFFER_LENGHT, multiples * CIPHER_BUFFER_LENGHT + remainder);
for (int j = 0; j < remainder; ++j) {
rawByte = buffer.get(j);
tmp = (byte) (rawByte ^ j);
buffer.put(j, tmp);
if(null != listener){
listener.onProgress(multiples * CIPHER_BUFFER_LENGHT + j, totalLenght);
}
}
buffer.force();
buffer.clear();
channel.close();
raf.close();
// , .cipher
// f.renameTo(new File(f.getPath().substring(f.getPath().toLowerCase().indexOf(CIPHER_TEXT_SUFFIX))));
Log.d(" :", (System.currentTimeMillis() - startTime) / 1000 + "s");
return true;
} catch (Exception e) {
e.printStackTrace();
return false;
}
}
/**
*
*/
public interface CipherListener{
void onProgress(long current, long total);
}
}
효과 그림:코드 가 이렇게 많아 요.주석 이 있어 요.앞으로 이런 수요 가 있 으 면 직접 사용 할 수 있다.이상 이 바로 본 고의 모든 내용 입 니 다.여러분 의 학습 에 도움 이 되 고 저 희 를 많이 응원 해 주 셨 으 면 좋 겠 습 니 다.
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
Kotlin의 기초 - 2부지난 글에서는 Kotlin이 무엇인지, Kotlin의 특징, Kotlin에서 변수 및 데이터 유형을 선언하는 방법과 같은 Kotlin의 기본 개념에 대해 배웠습니다. 유형 변환은 데이터 변수의 한 유형을 다른 데이터...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.