이 기사에서는 배타적 OR(XOR) 연산을 사용하는 간단하고 사용하기 쉬운 암호화/복호화 알고리즘을 소개합니다. 이 알고리즘의 원리는 간단하며 독자에게 정보의 암호화/암호 해독에 대한 보다 직관적인 느낌을 주는 것을 목표로 합니다.
XOR 알고리즘의 원리
암호화의 주요 방법으로 볼 때 전치 방법은 너무 단순하며 특히 데이터의 양이 적을 경우 암호문에서 평문을 추측하기 쉽고 치환 방법이 효과적이고 간단합니다. 연산.
다양한 대체 연산의 특성으로 볼 때 XOR 연산은 간단한 암호화 및 복호화 연산에 가장 적합합니다. 이 방법의 원리는 숫자 A와 다른 숫자 B가 XOR되면 다른 숫자 C가 생성된다는 것입니다. C와 B에 대한 XOR 연산이 수행되고 C는 A로 복원됩니다.
다른 단순 암호화 알고리즘과 비교하여 XOR 알고리즘의 장점은 다음과 같습니다.
(1) 알고리즘이 간단하여 고급언어로 쉽게 구현할 수 있다.
(2) 속도가 빠르고 언제 어디서나 사용할 수 있습니다.
(3) 모든 문자에 유효합니다. 서양 문자에만 유효한 일부 단순 암호화 알고리즘과 달리 한자는 암호화 및 복호화 후에 원래 문자로 복원할 수 없습니다.
XOR 알고리즘 구현
이전 부분에서는 암호화/복호화를 위해 XOR 연산을 사용하는 방법에 대한 원리를 소개했습니다. 이 섹션에서는 이를 사용하여 사용자의 로그인 정보를 암호화합니다. 앞 절에서 소개한 XOR 암호화 알고리즘의 원리에 따르면, 다음과 같은 암호화 및 복호화 함수를 작성하는 것은 어렵지 않습니다. 암호화 알고리즘이 먼저 나열됩니다.
1 <!--encrypy_xor: 단순히 XOR 연산을 이용한 암호화 함수---------->
2 <?php
3 //암호화 기능
4 함수 myEncrypt($string, $key)
5 {
6 for($i=0; $i<STRLEN($STRING); p $i++)<>
7 {
8 for($j=0; $j<STRLEN($KEY); p $j++)<>
9 {
10 $string[$i] = $string[$i]^$key[$j];
11 }
12}
13 $string을 반환합니다.
14}
4행에서는 암호화 함수 myEncrypt()를 정의합니다. 입력 매개변수 $string은 일반 텍스트이고 $key는 키입니다. 출력은 $key를 키로 사용하고 XOR 암호화 알고리즘을 사용하여 생성된 암호문입니다.
6~12행의 외부 for 루프는 일반 텍스트 문자열의 각 문자를 반복하고, 내부 for 루프(8~11행)는 일반 텍스트의 각 문자를 반복하고 키의 각 비트에 대해 예외를 수행합니다. 이 원칙은 이전 섹션에서 소개되었으므로 반복하지 않겠습니다.
이번에도 암호화 함수와 유사하게 다음과 같은 복호화 함수를 작성할 수 있습니다.
1 //암호해독 기능
2 함수 myDecrypt($string, $key)
3 {
4 for($i=0; $i<STRLEN($STRING); p $i++)<>
5 {
6 for($j=0; $j<STRLEN($KEY); p $j++)<>
7 {
8 $string[$i] = $key[$j]^$string[$i];
9}
10}
11 $string을 반환합니다.
12}
13?>
4행에서는 암호 해독 함수 myDecrypt()를 정의합니다. 입력 매개 변수 $string은 암호문이고 $key는 키입니다. 출력은 $key를 키로 사용하고 XOR 암호 해독 알고리즘을 사용하여 생성된 일반 텍스트입니다.
아래에서는 암호화 기능의 기능을 좀 더 자세히 설명하기 위해 적용 예를 사용합니다.
1 //예제
2 $my_password="의자";
3 echo "내_비밀번호 = $내_비밀번호";
4 $my_key="1234567890";
5 $my_password_en=myEncrypt($my_password,$my_key);
6 echo "my_password_en = $my_password_en";
7 $my_password_de=myDecrypt($my_password_en,$my_key);
8 echo "my_password_de = $my_password_de";
3행에서는 먼저 $my_password 일반 텍스트를 정의한 다음 4행에서 $my_key 키를 정의합니다.
5행과 6행은 각각 암호화 함수를 호출하여 암호문을 생성하고 이를 출력하며, 암호문은 7행과 8행에서 해독됩니다.
위의 예제를 실행한 결과는 다음과 같습니다.
my_password = 의자
my_password_en = RYPXC
my_password_de = 의자
XOR 알고리즘을 이용한 신원 인증 구현
앞의 두 부분에서는 XOR 연산을 이용한 정보 암호화/복호화의 원리와 구현을 소개했다. 다음으로 이 방법을 사용하여 사용자의 로그인 비밀번호를 암호화한다. 이 예에서 시스템은 사용자의 비밀번호를 보호하기 위해 다음과 같은 목적을 달성하려고 합니다.
·등록시 사용자는 사용자 비밀번호 양식을 작성해야 합니다.
·사용자 본인 외에 시스템 설계자, 데이터베이스 관리자 등 누구도 그의 비밀번호 정보를 알 수 없습니다.
·시스템은 사용자가 입력한 비밀번호를 기반으로 사용자의 정당성을 검증할 수 있습니다.
위 목적을 달성하기 위해 XOR 알고리즘을 사용할 때 사용자 이름을 일반 텍스트로 선택하고 키는 사용자 정의 비밀번호를 선택한 다음 암호화된 사용자 이름을 데이터베이스에 저장할 수 있습니다.
또한, 사용자가 로그인 시 적법한 사용자를 확인하는 방법에는 다음과 같은 두 가지 방법이 있습니다.
(1) 제출된 사용자 이름(일반 텍스트)과 비밀번호(키) 정보를 기반으로 다시 암호화하고, 암호화된 정보를 사용하여 데이터베이스에 저장된 비밀번호 정보와 비교하면 해당 사용자는 적법하고 그렇지 않으면 사용자입니다. , 사용자는 불법입니다.
(2) 데이터베이스에 저장된 비밀번호 정보(일반 텍스트)와 사용자가 입력한 비밀번호(키) 정보를 기반으로 복호화하고, 암호화된 정보를 사용자가 제출한 사용자 이름과 비교하여 동일하면 사용자입니다. 그렇지 않으면 불법 사용자에게 적합합니다.
두 가지 방법 모두 세 번째 목적을 달성할 수 있습니다. 이 예에서는 두 번째 방법이 사용됩니다. 이 예제의 구현 코드는 섹션 18.4.1 "사용자 로그인" 및 섹션 18.4.2 "사용자 로그인"의 구현을 기반으로 구현될 수 있습니다. "사용자 로그인" 페이지는 "의 구현 참조를 변경할 필요가 없습니다. 사용자 확인'은 다음과 같습니다.
1 <?php
2 session_start(); //첫 번째 줄에 배치되어야 하는 세션 라이브러리를 로드합니다.
3 $user_name=$_POST["사용자_이름"];
4 session_register("user_name"); //$user_name 변수를 등록합니다. $ 기호가 없습니다.
5
6 require_once("sys_conf.inc"); //데이터베이스 구성 정보를 포함한 시스템 구성 파일
7 require_once("encrypy_xor.php"); //xor 암호화 함수 파일 포함
8
9 //데이터베이스에 연결
10 $link_id=mysql_connect($DBHOST,$DBUSER,$DBPWD);
11 mysql_select_db($DBNAME); //데이터베이스 선택 my_chat
12
13 //로그인된 사용자 정보가 있는지 쿼리
14 $str="이름 ='$user_name'인 사용자의 이름, 비밀번호 선택";
15 $result=mysql_query($str,$link_id) //쿼리 실행
16 @$rows=mysql_num_rows($result); //쿼리 결과에서 얻은 레코드 수
17 $user_name=$_SESSION["사용자_이름"];
18 $password=$_POST["비밀번호"];
19 $password_en=myEncrypt($user_name,$password); //사용자 정보를 암호화합니다.
20
21 //오래된 사용자의 경우
22 if($행!=0)
스물셋 {
24 list($name,$pwd)=mysql_fetch_row($result);
25 $password_de=myDecrypt($pwd,$password); //사용자 정보를 해독합니다.
26
27 //비밀번호가 올바르게 입력되었다면
28 if($user_name==$password_de)
29 {
30 $str="사용자 세트 업데이트 is_online =1 여기서 이름 ='$user_name' 및 비밀번호='$password_en'";
31 $result=mysql_query($str, $link_id) //쿼리 실행
32 require("main.php"); //채팅 페이지로 이동
33}
34 //비밀번호 입력 오류
그 외 35개
36 {
37 require("relogin.php");
38 }
39 }
40 //신규 사용자의 경우 해당 정보를 데이터베이스에 기록합니다.
그 외 41개
42 {
43 $str="사용자 (name,password,is_online) 값에 삽입('$user_name', '$password_en',1)";
44 $result=mysql_query($str, $link_id) //쿼리 실행
45 require("main.php"); //채팅 페이지로 이동
46 }
47 //데이터베이스 닫기
48 mysql_close($link_id);
49 ?>
7행에서는 이전 섹션에서 소개한 두 가지 기능을 포함하여 암호화 기능 파일 encrypy_xor.php를 소개합니다.
19행에서는 사용자가 제출한 사용자 이름과 비밀번호를 사용하여 암호화된 비밀번호 값을 얻습니다. 신규 사용자의 경우 이 암호화된 값은 44행에서 데이터베이스에 저장됩니다.
또한, 기존 사용자의 경우 24행에서 데이터베이스에서 사용자 이름과 암호화된 비밀번호 정보를 얻고, 이 두 값을 사용하여 25행에서 복호화한 후 복호화된 값을 에서 제출한 사용자 이름 정보와 비교합니다. 28행에서 사용자의 적법성을 확인합니다.
키 자동 생성
부분에서는XOR 암호화 알고리즘을 사용하여 사용자 정보를 암호화하는 방법을 소개했습니다. 사용자가 입력한 비밀번호 정보는 실제로 암호화 알고리즘에서 키가 되며, 사용자 이름은 일반 텍스트로 사용될 수도 있습니다. 매우 기능을 잘 완성하지만, 논리적으로 이 방법은 좀 무리해 보입니다.
이 기사에서는 자동으로 생성된 키를 사용하여 사용자가 제출한 비밀번호의 일반 텍스트를 암호화하여 논리를 보다 합리적으로 만드는 기술을 소개합니다.
이 예에서는 생성된 키가 512비트라고 가정합니다. 코드는 다음과 같습니다.
1 <!--keygen.php: 자동으로 키 생성------------------------->
2 <?php
3
4 //길이가 $len인 키를 자동으로 생성합니다.
5 함수 generate_key($len)
6 {
7 $하한 = 35;
8 $상한 = 96;
9 $strMyKey = "";
10
11개($i=1;$i<=$len;$i++)
12 {
13 $rnd=rand(0,100); //난수 생성
14 $k = (($upperbound - $lowerbound) + 1) * $rnd + $lowerbound;
15 $strMyKey=$strMyKey.$k;
16}
17 $strMyKey를 반환합니다.
18}
19
20 //$file_name 파일에 키 쓰기
21 함수 write_key($key,$file_name)
스물 둘 {
23 $filename="C:key.txt";
24 $key=generate_key($key,512);
25
26 //추가 모드를 사용하여 $filename을 엽니다. 파일 포인터는 파일 끝에 있습니다.
27 if(!$handle=fopen($filename,'w'))
28 {
29 print "$filename 파일을 열 수 없습니다";
30번 출구;
31}
32
33 //열었던 파일에 $key를 씁니다.
34 if(!fwrite($handle,$key))
35 {
36 print "$filename 파일에 쓸 수 없습니다";
37 출구;
38 }
39 fclose($핸들);
40}
41
42 //키 파일에서 키를 읽습니다.
43 함수 get_key($file_name)
44 {
45 //파일 열기
46 $fp = fopen ($file_name, "r");
47 $결과="";
48 //한 줄씩 읽기
49 동안(!feof($fp))
50 {
51 $buffer = fgets($fp, 4096);
52 $결과=$결과.$버퍼;
53}
54 $결과를 반환합니다.
55 }
56
57 ///*
58 $KeyLocation = "C:key.txt"; //키를 저장할 파일
59 $key="123456";
60 write_key($key,$KeyLocation);
61 echo get_key($KeyLocation);
62 //*/
63 ?>
코드에는 3가지 기능이 포함되어 있습니다.
·generate_key($len): 길이가 $len인 키를 자동으로 생성합니다.
·write_key($key,$file_name): $file_name 파일에 키를 씁니다.
·get_key($file_name): $file_name 키 파일을 읽습니다. 키 값이
를 사용하면 사용자가 시스템에 처음 로그인할 때 사용자에게 자동으로 키 값이 생성됩니다. 이 키 값을 처리하는 방법에는 두 가지가 있습니다.
(1) 데이터베이스의 특정 필드에 저장합니다. 이 방법의 단점은 데이터베이스에 있는 키의 보안이 보장될 수 없다는 것입니다.
(2) 키를 사용자의 로컬 파일에 저장하면 키가 유출되지 않습니다. 하지만 이 방법의 단점은 사용자가 다른 컴퓨터를 사용하여 시스템에 액세스할 때 로그인할 수 없다는 것입니다.
이 예에서는 방법 2가 사용됩니다.
구체적으로 위 코드의 11~18번째 줄은 난수를 생성하여 연속적으로 키를 생성하고, 계산을 통해 복잡도를 높인다. 하한값과 상한값은 실제로 암호화에 사용하려는 ASCII 문자 범위입니다. 다음은 생성된 키 파일의 예입니다.
208123915925183361116049369344372701567721435181102718332639307390344373445407
524316475863232913993383189547474747394154915312639841226741894189965623523913
011164730113445201935692839710274127251577929493941487145611337531549110895367
593586318332391170941272701152344371709270125776235313540032267139933835677407
617384135696111239130732949469623520815987524358635491542913374933524334454251
400327015367133759324537171709152357391089524342514685239122673135531363151191
833412771743139654…
最后,需要把密钥保存在服务器上一个安全的地方,然后就可以利用其和诸如XOR这样的加密算法来对用户信息进行加密/解密了。 이전 절에서 소개한 XOR에서 이 키를 사용하는 방법은 매우 간단하므로 자세히 설명하지 않겠습니다. 총 2페이지. 9 7 1 2