안 드 로 이 드 에서 파일 암호 화 복호화 실현

현재 프로젝트 에 필요 한 것 이 있 습 니 다.본 프로젝트 에서 다운로드 한 영상 과 문 서 는 다른 재생 기 를 통 해 재생 할 수 없습니다.교육 기관 에서 이러한 수요 가 많 습 니 다.누군가가 돈 을 내 는 것 을 방지 하고 모든 교과 서 를 다른 사람 에 게 복사 했다.이런 일 은 교육 기관 이 원 하지 않 을 것 이다.지금 내 프로젝트 에 도 이런 수요 가 생 겼 다.다음은 나의 실현 을 소개 한다.
파일 복호화 의 절차 및 원리
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); 
  } 
} 
효과 그림:

코드 가 이렇게 많아 요.주석 이 있어 요.앞으로 이런 수요 가 있 으 면 직접 사용 할 수 있다.이상 이 바로 본 고의 모든 내용 입 니 다.여러분 의 학습 에 도움 이 되 고 저 희 를 많이 응원 해 주 셨 으 면 좋 겠 습 니 다.

좋은 웹페이지 즐겨찾기