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
그 후에 그들 에 게 각종 조작 을 할 수 있다.예 를 들 어 교환 위치,분할,이 또는 연산 등 이다.흔히 볼 수 있 는 암호 화 방식 은 바로 이렇게 비트 위 치 를 조작 하 는 것 이다.
이상 이 바로 본 고의 모든 내용 입 니 다.여러분 의 학습 에 도움 이 되 고 저 희 를 많이 응원 해 주 셨 으 면 좋 겠 습 니 다.
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
Bitrise에서 배포 어플리케이션 설정 테스트하기이 글은 Bitrise 광고 달력의 23일째 글입니다. 자체 또는 당사 등에서 Bitrise 구축 서비스를 사용합니다. 그나저나 며칠 전 Bitrise User Group Meetup #3에서 아래 슬라이드를 발표했...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.