이 기간이 끝날 무렵, 우리는 정보 보안 숙제 소개를 살펴볼 것입니다. 나는 클래식 암호화 알고리즘에서 Playfair 알고리즘과 힐 알고리즘을 만나게되었습니다. JavaScript 언어로 구현하는 것은 흥미 롭습니다. 인코딩하는 동안 Baidu를 확인한 다음 JavaScript의 기본 사항에 대한 좋은 자습서를 제공합니다.
Playfair
Playfair Password (English : Playfair Cipher 또는 Playfair Square)는 대체 암호입니다. 5*5 정사각형 암호 테이블을 기반으로 작성되었으며 테이블에 25 개의 글자가 배열되었습니다. 영어로 된 26 글자의 경우 가장 일반적으로 사용되는 Z를 제거하여 비밀번호 테이블을 형성하십시오.
구현 아이디어 :
1. 비밀번호 목록을 준비하십시오
키는 단어 나 문구이며, 비밀번호 테이블은 사용자가 제공 한 키에 따라 정렬됩니다. 중복 문자가 있으면 나중에 중복 문자를 제거 할 수 있습니다.
예를 들어, 키 미친 개는
| 기음 | 영형 | 시간 | 중 | 티 |
| 아르 자형 | G | 나 | N | 유 |
| 에이 | 비 | J. | 피 | 다섯 |
| 와이 | 이자형 | 케이 | 큐 | w |
| 디 | 에프 | 엘 | 에스 | 엑스 |
코드 사본은 다음과 같습니다.
/*
* 기능 : 비밀번호 목록을 컴파일합니다
*
* 매개 변수 : 키 (우주 제거 및 대문자 처리)
*
* 반환 : 비밀번호 테이블
*/
함수 createkey (keychars) {
// 알파벳 배열
var allchars = [ 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v', 'x', 'x';
// 가변 keychars는 알파벳 테이블에서 문자의 위치를 가져 와서 문자를 삭제합니다.
for (var i = 0; i <keychars.length; i ++) {
var index = allchars.indexof (keychars [i]);
if (index> -1) {
allchars.splice (색인, 1);
}
}
// 키 숯의 글자를 알파벳에 삽입하십시오
for (var i = keychars.length-1; i> = 0; i-) {
allchars.unshift (keychars [i]);
}
// 첫 번째 열에서 암호 테이블에 keychars를 삽입
for (var i = 0; i <5; i ++) {
for (var j = 0; j <5; j ++) {
키 [j] [i] = allchars [i*5+j];
}
}
}
비밀번호 테이블에 Keychars를 삽입 할 때 중복 문자와 Z를 제거해야한다는 점을 고려하면 설계 알고리즘은 다음과 같습니다.
코드 사본은 다음과 같습니다.
/*
* 기능 : 문자열에서 중복 문자를 제거하십시오
*
* 매개 변수 : 처리 해야하는 문자열
*
* 반환 : 처리 된 문자열
*/
함수 removedUplication (str) {
var result = [], tempst = "";
var arr = str.split ( ''); // 문자열을 배열로 분할하십시오
//arr.sort() ;//sorting
for (var i = 0; i <arr.length; i ++) {
var repeatback = true; // 디자인 변수는 문자열의 이전 부분이 동일한 문자에 존재하지 않도록하는 것입니다. 다음 알고리즘은 동일한 문자가 함께 연결되도록 할 수 있기 때문입니다.
for (var j = 0; j <result.length; j ++) {
if (arr [i] == result [j])
반복 회색 = 거짓;
}
if (arr [i]! == tempst && repeatback) {
result.push (arr [i]);
tempStr = arr [i];
}또 다른{
계속하다;
}
}
return result.join ( ""); // 배열을 문자열로 변환합니다
}
2. 명확한 텍스트를 구성하십시오
일반 텍스트의 두 글자를 만드십시오. 쌍으로 서로 옆에 두 개의 동일한 문자가 있거나 마지막 문자가 단일 인 경우, 문자 X를 삽입하십시오. 코딩 초기 단계에서는 문자 수를 단수로 입력하는 것을 거부하여 사용자의 경험이 나쁘게 만들었습니다.
var k = document.getElementById ( "keychars"). value.toupperCase (). 교체 (// s/ig, '');
공백을 제거하고 일반 텍스트를 위해 대문자로 변환하십시오.
3. 암호 텍스트를 작성하십시오
일반 텍스트 암호화 규칙 (Baidu) :
1) P1 P2가 같은 라인에 있으면 해당 암호 텍스트 C1 C2는 P1 P2의 오른쪽 끝에 가까운 문자입니다. 첫 번째 열은 마지막 열의 오른쪽으로 간주됩니다. 예를 들어, 이전 테이블에 따르면 CT는 OC에 해당합니다.
2) P1 P2가 동일한 열에있는 경우 해당 암호 텍스트 C1 C2는 P1 P2 바로 아래의 문자입니다. 첫 번째 줄은 마지막 줄 아래로 간주됩니다.
3) P1과 P2가 동일한 행에 있지 않고 같은 열에 있지 않으면 C1과 C2는 P1과 P2에 의해 결정된 사각형의 다른 두 모서리에있는 문자입니다 (수평 교체 또는 수직 교체의 경우 사전에 약속을 잡거나 직접 시도해야합니다). 이전 표에 따라 WH는 TK 또는 KT에 해당합니다.
예를 들어, 위의 표에 따르면, 생명이있는 일반 텍스트는 희망이 있습니다.
당신은 먼저 그것을 정리 할 수 있습니다.
그런 다음 암호 텍스트는 다음과 같습니다.
암호 텍스트를 자본으로 돌린 다음 여러 글자 그룹으로 배열하십시오.
예를 들어, 5 그룹에서 ktygw ookgy nlhjo fcmyg kglmm bwf
4. 암호 해독
5*5 행렬을 채우고 (반복 문자와 문자 Z를 반복) 매트릭스의 나머지 위치에서 순서대로 행렬의 나머지 위치를 채우고 교체 매트릭스에 따라 암호 텍스트에서 일반 텍스트를 얻습니다. 반대를하십시오.
효과는 그림과 같이 다음과 같습니다.
언덕
Hill Password는 기본 매트릭스 이론 원리를 사용하는 대체 암호입니다. 5*5 정사각형 암호 테이블을 기반으로 작성되었으며 테이블에 25 개의 글자가 배열되었습니다. 영어로 된 26 글자의 경우 가장 일반적으로 사용되는 Z를 제거하여 비밀번호 테이블을 형성하십시오.
구현 아이디어 :
1. 알파벳을 쓰십시오
var chars = [ 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'y', 'z'];
2. 키를 무작위로 생성합니다
코드 사본은 다음과 같습니다.
/*
* 기능 : 키를 무작위로 생성합니다
*
* 반환 : 키 매트릭스
*/
함수 randomcreatekey () {
// 숫자는 0에서 26까지 무작위로 생성됩니다
for (var i = 0; i <3; i ++) {
for (var j = 0; j <3; j ++) {
키 [i] [J] = Math.Round (Math.Random ()*100%26)
}
}
}
3. 키 코드, 자동 생성 된 키를 기반으로 일반 텍스트를 처리합니다.
코드 사본은 다음과 같습니다.
/*
* 기능 : 언덕 알고리즘
*
* 매개 변수 : 길이 3의 배열이있는 대문자 배열 3
*
* 반환 : 암호화 된 문자열
*/
기능 언덕 (P) {
// 대문자 문자 암호 텍스트
var res = "";
// 문자열이 횡단되어야하는 총 횟수를 개발합니다.
var round = math.round (p.length/3);
// 처리
for (var b = 0; b <round; b ++) {
// 일반 텍스트 3
var temp3 = "";
var temparr3 = [];
var sumarr3 = [];
for (var i = 0; i <3; i ++) {
temp3 += p.shift ();
for (var j = 0; j <chars.length; j ++) {
if (temp3 [i] == chars [j])
temparr3 [i] = j;
}
}
//믿다
for (var i = 0; i <3; i ++) {
for (var j = 0; j <3; j ++) {
sumarr3 [i] = (temparr3 [j]*키 [i] [J])%26;
}
}
// 알파벳에서 해당 문자 색인을 가져옵니다
for (var i = 0; i <3; i ++) {
res += chars [sumarr3 [i]];
}
}
리턴 레스;
};
효과는 그림과 같이 다음과 같습니다.
위의 알고리즘에는 단점이 있습니다.
1. 프로세스 지향 설계, 높은 커플 링 정도
2. 너무 많은 중첩 루프, 알고리즘 효율성을 최적화해야합니다.
3. 사용자가 비 alphabetical 문자를 입력 할 때 처리하지 않는 것과 같은 가능한 상황에 대한 부적절한 고려.
요약 :
일정 기간 동안 정보 보안에 대한 과정 소개를 연구 한 후에는 정보 보안의 기본 만 이해할 수 있습니다. 정보 보안은 매우 흥미로운 주제입니다. 몇 가지 문제가 발생하면 가능한 한 많이 생각하고 더 많은 일을하고 더 많이 사용하십시오. 동시에, 우리는 또한 수학적 기초의 축적을 강화하고, JS 재단을 통합하며, 지식을 넓 힙니다. 이 길은 갈 길이 멀다.