Android 대칭 암호 화 와 비대 칭 암호 화

카 이 저 비밀번호
1.소개
카 이 저 비밀 번 호 는 가장 오래된 대칭 암호 화 체제 로 서 고대 로마 에서 유행 했다.그의 기본 사상 은 알파벳 을 일정한 자릿수 로 이동 시 켜 암호 화 와 복호화 를 실현 하 는 것 이다.명문 중의 모든 자 모 는 자모표 에서 뒤로(또는 앞으로)고정 수량 에 따라 오프셋 한 후에 비밀문 으로 교체 된다.예 를 들 어 오프셋 이 3 일 때 모든 알파벳 A 는 D 로 바 뀌 고 B 는 E 로 바 뀌 며 이 를 통 해 알 수 있 듯 이 자릿수 는 카 이 저 암호 화 와 복호화 키 입 니 다.
예 를 들 어 문자열'ABC'의 모든 문 자 는 오른쪽으로 3 자리 이동 하면'DEF'가 되 고 복호화 할 때'DEF'의 모든 문 자 는 왼쪽으로 3 자리 이동 하면 복원 할 수 있 습 니 다.아래 그림 과 같 습 니 다.
这里写图片描述
2.지식 을 준비한다

 //     ASCII    
 char charA = 'a';
 int intA = charA; //char    int       ASCII   ,'a'   97

//ASCII     char
int intA = 97;//97    ASCII  'a'
char charA = (char) intA; //int     char       ASCII   , 'a'


3.카 이 저 암호 의 간단 한 코드 구현

 /**
   *   
   * @param input    (       )
   * @param key   ,    
   * @return         
   */
  public static String encrypt(String input, int key) {
    //            
    char[] array = input.toCharArray();

    for (int i = 0; i < array.length; ++i) {
      //     ASCII   
      int ascii = array[i];
      //    ,  a->b
      ascii = ascii + key;
      //ASCII      char
      char newChar = (char) ascii;
      //      
      array[i] = newChar;

      //  4           
      //array[i] = (char) (array[i] + key);
    }

    //       String
    return new String(array);
  }

  /**
   *   
   * @param input    (       )
   * @param key   ,    
   * @return         
   */
  public static String decrypt(String input, int key) {
    //            
    char[] array = input.toCharArray();
    for (int i = 0; i < array.length; ++i) {
      //     ASCII   
      int ascii = array[i];
      //      ,  b->a
      ascii = ascii - key;
      //ASCII      char
      char newChar = (char) ascii;
      //      
      array[i] = newChar;

      //  4           
      //array[i] = (char) (array[i] - key);
    }

    //       String
    return new String(array);
  }

코드 출력 결과:
这里写图片描述
4.카 이 저 암호 해독:주파수 분석 법
카 이 저 암호 화 강도 가 너무 낮 아 주파수 분석 법 으로 만 풀 수 있다.
어떤 서면 언어 에서 든 서로 다른 자모 나 자모 조합 이 나타 나 는 빈 도 는 각각 다르다.그리고 이런 언어 로 쓴 임의의 텍스트 에 대해 대체적으로 같은 특징 을 가 진 자모 분 포 를 가지 고 있다.예 를 들 어 영어 에 서 는 알파벳 E 가 나타 나 는 빈도 가 높 은 반면 X 는 적 게 나타난다.
영어 텍스트 의 전형 적 인 자모 분포 상황 은 다음 과 같다.
这里写图片描述
5.해독 절차
통계 비밀문서 에 가장 많이 등장 하 는 문자,예 를 들 어 가장 많이 등장 하 는 문 자 는'h'이다.
문자'h'에서'e'까지 의 오프셋 을 계산 하면 값 이 3 이면 원문 이 3 개의 위 치 를 옮 겼 음 을 나타 낸다.
비밀문서 의 모든 문 자 를 세 개의 위치 로 복원 합 니 다.
주의 점:비밀문서 에 가장 많이 나타 난 문 자 를 통계 할 때 몇 개의 예비 선택 을 더 통계 해 야 합 니 다.가장 많은 문 자 는 빈 칸 이나 다른 문자 일 수 있 기 때 문 입 니 다.예 를 들 어 다음 그림 에서 가장 많이 나타 난 문자'\#'은 빈 칸 암호 화 된 문자 이 고'h'가'e'오프셋 후의 값 입 니 다.
这里写图片描述
복호화 할 때 몇 번 더 시도 해 야 합 니 다.횟수 가 가장 많은 문 자 는 우리 가 원 하 는 목표 문자 가 아니 기 때 문 입 니 다.다음 그림 과 같이 두 번 째 복호화 결과 가 정확 합 니 다.

/**
 *            
 */
public class FrequencyAnalysis {
  //            
  private static final char MAGIC_CHAR = 'e';
  //          
  private static final int DE_MAX_FILE = 4;

  public static void main(String[] args) throws Exception {
    //  1,      
    //printCharCount("article1_en.txt");

    //    
    //int key = 3;
    //encryptFile("article1.txt", "article1_en.txt", key);

    //        
    String artile = file2String("article1_en.txt");
    //  (         )
    decryptCaesarCode(artile, "article1_de.txt");
  }

  public static void printCharCount(String path) throws IOException{
    String data = file2String(path);
    List<Entry<Character, Integer>> mapList = getMaxCountChar(data);
    for (Entry<Character, Integer> entry : mapList) {
      //          
      System.out.println("  '" + entry.getKey() + "'  " + entry.getValue() + " ");
    }
  }

  public static void encryptFile(String srcFile, String destFile, int key) throws IOException {
    String artile = file2String(srcFile);
    //    
    String encryptData = MyEncrypt.encrypt(artile, key);
    //        
    string2File(encryptData, destFile);
  }

  /**
   *       
   * @param input    
   * @return         
   */
  public static void decryptCaesarCode(String input, String destPath) {
    int deCount = 0;//            
    //             (         )
    List<Entry<Character, Integer>> mapList = getMaxCountChar(input);
    for (Entry<Character, Integer> entry : mapList) {
      //         
      if (deCount >= DE_MAX_FILE) {
        break;
      }

      //          
      System.out.println("  '" + entry.getKey() + "'  " + entry.getValue() + " ");

      ++deCount;
      //          MAGIC_CHAR        
      int key = entry.getKey() - MAGIC_CHAR;
      System.out.println("  key = " + key + ",      " + deCount + "     " + "
"); String decrypt = MyEncrypt.decrypt(input, key); String fileName = "de_" + deCount + destPath; string2File(decrypt, fileName); } } // String public static List<Entry<Character, Integer>> getMaxCountChar(String data) { Map<Character, Integer> map = new HashMap<Character, Integer>(); char[] array = data.toCharArray(); for (char c : array) { if(!map.containsKey(c)) { map.put(c, 1); }else{ Integer count = map.get(c); map.put(c, count + 1); } } // /*for (Entry<Character, Integer> entry : map.entrySet()) { System.out.println(entry.getKey() + " " + entry.getValue() + " "); }*/ // int maxCount = 0; for (Entry<Character, Integer> entry : map.entrySet()) { // if (/*entry.getKey() != ' ' && */entry.getValue() > maxCount) { maxCount = entry.getValue(); } } //map list List<Entry<Character, Integer>> mapList = new ArrayList<Map.Entry<Character,Integer>>(map.entrySet()); // Collections.sort(mapList, new Comparator<Entry<Character, Integer>>(){ @Override public int compare(Entry<Character, Integer> o1, Entry<Character, Integer> o2) { return o2.getValue().compareTo(o1.getValue()); } }); return mapList; } public static String file2String(String path) throws IOException { FileReader reader = new FileReader(new File(path)); char[] buffer = new char[1024]; int len = -1; StringBuffer sb = new StringBuffer(); while ((len = reader.read(buffer)) != -1) { sb.append(buffer, 0, len); } return sb.toString(); } public static void string2File(String data, String path){ FileWriter writer = null; try { writer = new FileWriter(new File(path)); writer.write(data); } catch (Exception e) { e.printStackTrace(); }finally { if (writer != null) { try { writer.close(); } catch (IOException e) { e.printStackTrace(); } } } } }
这里写图片描述
대칭 암호 화
소개 하 다.
암호 화 와 복호화 모두 같은 비밀 키 를 사용 합 니 다.이런 암호 화 방법 은 대칭 암호 화 라 고도 부 르 고 단일 키 암호 화 라 고도 부 릅 니 다.
암호 화 복호화 는 모두 같은 열쇠 로 간단하게 이해 할 수 있다.
카 이 저 비밀 번 호 는 대칭 암호 화 에 속 합 니 다.그의 문자 오프셋 은 비밀 키 입 니 다.
대칭 암호 화 상용 알고리즘
AES,DES,3DES,TDEA,Blowfish,RC2,RC4,RC5,IDEA,SKIPJACK 등.
DES:모두 Data Encryption Standard,즉 데이터 암호 화 표준 이 라 고 하 는데 키 암호 화 를 사용 하 는 블록 알고리즘 입 니 다.1976 년 에 미국 연방정부 의 국가 표준 국 에 의 해 연방 자료 처리 표준(FIPS)으로 확 정 된 후에 국제 적 으로 널리 알려 졌 습 니 다.
3DES:Triple DES 라 고도 하 는데 삼중 데이터 암호 화 알고리즘(TDEA,Triple Data Encryption Algorithm)블록 암호 의 통칭 입 니 다.
그것 은 모든 데이터 블록 에 세 번 의 DES 암호 화 알고리즘 을 적용 하 는 것 과 같다.컴퓨터 연산 능력 이 향상 되 어 원본 DES 암호 의 키 길이 가 폭력 적 으로 풀 리 기 쉬 워 집 니 다.3DES 는 새로운 블록 암호 알고리즘 을 설계 하 는 것 이 아니 라 DES 키 길 이 를 늘 려 유사 한 공격 을 피 하 는 상대 적 으로 간단 한 방법 을 제공 하 는 디자인 입 니 다.
AES:고급 암호 화 기준(영어:Advanced Encryption Standard,줄 임 말:AES)은 암호학 에서 Rijndael 암호 화 법 이 라 고도 부 르 는데 미국 연방정부 가 사용 하 는 블록 암호 화 기준 이다.이 기준 은 기 존의 DES 를 대체 하 는 데 사용 되 었 으 며,이미 다방면으로 분석 되 어 전 세계 적 으로 널리 사용 되 고 있다.5 년 간 의 선별 절 차 를 거 쳐 고급 암호 화 기준 은 미국 국가 표준 기술 연구원(NIST)이 2001 년 11 월 26 일 FIPS PUB 197 에 발 표 했 고 2002 년 5 월 26 일 에 유효한 기준 이 되 었 다.2006 년 에 고급 암호 화 기준 은 대칭 키 암호 화 에서 가장 유행 하 는 알고리즘 중 하나 가 되 었 다.
DES 알고리즘 안내
DES 암호 화 원리(특 위 를 대비 하여 조작,교환 위치,이상 또는 등등,상세 하 게 알 필요 가 없 음)
지식 을 준비 하 다
Bit 는 컴퓨터 의 가장 작은 전송 단위 다.비트 비트 비트 의 값 을 0 또는 1 로 표시 합 니 다.
예 를 들 어 숫자 3 에 대응 하 는 바 이 너 리 데 이 터 는 0000011 이다.
코드 예제

 int i = 97;
 String bit = Integer.toBinaryString(i);
 //  :97          : 1100001
 System.out.println(i + "         : " + bit);

바이트 와 비트 차이
데이터 저장 소 는'바이트'(Byte)단위 이 고 데이터 전송 은 대부분'비트'(bit,일명'비트')단위 이 며 한 자 리 는 0 또는 1(즉 바 이 너 리)을 대표 하 며 8 자리(bit,약자 b)마다 하나의 바이트(Byte,약자 B)를 구성 하 며 가장 작은 정보 단위 이다.
Byte 의 수치 범위:

//byte      :-128  127
System.out.println(Byte.MIN_VALUE + " " + Byte.MAX_VALUE);

즉 10000000 에서 011111111 사이 에 한 바이트 가 8 비트 를 차지한다.
2 진 10 진 그림:
这里写图片描述
모든 문자열 을 바이트 배열 로 변환 할 수 있 습 니 다.

String data = "1234abcd";
byte[] bytes = data.getBytes();//   :49 50 51 52 97 98 99 100
위의 데이터 49 50 51 52 97 99 100 에 대응 하 는 바 이 너 리 데이터
00110001
00110010
00110011
00110100
01100001
01100010
01100011
01100100
그들의 간격 을 좀 넓 히 면 행렬 로 볼 수 있다.
0 0 1 1 0 0 0 1
0 0 1 1 0 0 1 0
0 0 1 1 0 0 1 1
0 0 1 1 0 1 0 0
0 1 1 0 0 0 0 1
0 1 1 0 0 0 1 0
0 1 1 0 0 0 1 1
0 1 1 0 0 1 0 0
그 후에 그들 에 게 각종 조작 을 할 수 있다.예 를 들 어 교환 위치,분할,이 또는 연산 등 이다.흔히 볼 수 있 는 암호 화 방식 은 바로 이렇게 비트 위 치 를 조작 하 는 것 이다.
이상 이 바로 본 고의 모든 내용 입 니 다.여러분 의 학습 에 도움 이 되 고 저 희 를 많이 응원 해 주 셨 으 면 좋 겠 습 니 다.

좋은 웹페이지 즐겨찾기