XOR이 암호화에 사용되는 이유는 무엇입니까?
암호화 알고리즘에서 XOR 만 사용하고 OR, AND 및 NOR과 같은 다른 논리 게이트는 사용되지 않는 이유는 무엇입니까?
논리적 연산 XOR이 모든 암호화에서 사용되는 유일한 방법이라고 말하는 것은 사실이 아니지만, 독점적으로 사용되는 유일한 양방향 암호화입니다.
여기에 설명이 있습니다.
이진수 문자열이 있고 그 문자열 10101
을 XOR 10111
하면 얻을 수 있습니다.00010
이제 원래 문자열이 인코딩되고 인코딩 된 문자열로 키를 XOR하면 원래 문자열을 다시 가져 오면 두 번째 문자열이 키가됩니다.
XOR을 사용하면 문자열을 쉽게 암호화하고 해독 할 수 있지만 다른 논리 작업은 수행하지 않습니다.
더 긴 문자열이 있으면 키가 충분히 길 때까지 반복 할 수 있습니다. 예를 들어 문자열이 1010010011
그 다음이면 키를 두 번 작성 1011110111
하고 새 문자열로 XOR 할 수 있습니다.
다음 은 XOR 암호에 대한 위키피디아 링크입니다.
두 가지 이유를 알 수 있습니다.
1) (주요 이유) XOR은 원본 평문에 대한 정보를 유출하지 않습니다.
2) (좋은 이유) XOR은 무의식적 인 기능입니다 . 즉, XOR을 두 번 적용하면 원래의 일반 텍스트를 다시 가져옵니다 (예 : 일반 텍스트는 XOR(k, XOR(k, x)) = x
어디에 있고 키는 어디에 있습니까 ). 내부 XOR은 암호화이고 외부 XOR은 복호화입니다. 즉, 암호화와 복호화 모두에 정확히 동일한 XOR 함수를 사용할 수 있습니다.x
k
첫 번째 요점을 예시하기 위해 AND, OR 및 XOR의 진리표를 고려하십시오.
과
0과 0 = 0
0과 1 = 0
1과 0 = 0
1 AND 1 = 1 (누수!)
또는
0 또는 0 = 0 (누수!)
0 또는 1 = 1
1 또는 0 = 1
1 또는 1 = 1
XOR
0 XOR 0 = 0
0 XOR 1 = 1
1 XOR 0 = 1
1 XOR 1 = 0
첫 번째 열에 있는 모든 것은 입력 (즉, 일반 텍스트) 입니다. 두 번째 열은 키 이고 마지막 열은 특정 작업 (즉, 암호문)을 사용하는 키와 "혼합"(암호화) 된 입력의 결과입니다 .
이제 공격자가 암호화 된 바이트 (예 : 10010111)에 액세스 하고 원래 일반 텍스트 바이트를 얻고 자한다고 상상해보십시오 .
원래 일반 텍스트 바이트에서이 암호화 된 바이트를 생성하기 위해 AND 연산자가 사용되었다고 가정 해 보겠습니다. AND가 사용 된 경우 암호화 된 바이트에서 비트 '1'을 볼 때마다 입력 (즉, 첫 번째 열, 일반 텍스트)도 진리표에 따라 '1'이어야한다는 것을 확실히 알고 있습니다. 과. 암호화 된 비트가 대신 '0'이면 입력 (즉, 일반 텍스트)이 '0'인지 '1'인지 알 수 없습니다. 따라서 원래 일반 텍스트는 1 _ _ 1 _ 111이라고 결론을 내릴 수 있습니다. 따라서 원래 일반 텍스트의 5 비트가 유출되었습니다 (즉, 키없이 액세스 할 수 있음).
OR에 동일한 아이디어를 적용하면 암호화 된 바이트에서 '0'을 찾을 때마다 입력 (즉, 일반 텍스트)도 '0'이어야 함을 알 수 있습니다. '1'을 찾으면 입력이 '0'인지 '1'인지 알 수 없습니다. 따라서 입력 일반 텍스트가 _ 00 _ 0 _ _ _라고 결론을 내릴 수 있습니다. 이번에는 키에 대해 알지 못한 채 원본 일반 텍스트 바이트의 3 비트를 유출 할 수있었습니다.
마지막으로 XOR을 사용하면 원래 일반 텍스트 바이트를 얻을 수 없습니다. 암호화 된 바이트에서 '1'을 볼 때마다 '1'은 '0'또는 '1'에서 생성되었을 수 있습니다. '0'도 마찬가지입니다 ( '0'또는 '1'모두에서 올 수 있음). 따라서 원래 일반 텍스트 바이트에서 단일 비트가 유출되지 않습니다.
주된 이유는 분포를 알 수없는 확률 변수 R1이 균일 분포를 갖는 확률 변수 R2와 XOR 된 경우 결과는 균일 분포를 갖는 임의 변수이므로 기본적으로 다른 이항 연산자로는 불가능한 편향된 입력을 쉽게 무작위화할 수 있습니다.
XOR의 출력은 항상 두 입력에 의존합니다. 언급 한 다른 작업에는 해당되지 않습니다.
XOR은 가역적이라고 생각합니다. 해시를 만들고 싶다면 XOR을 피하고 싶을 것입니다.
XOR은 하나의 입력이 무엇이든 상관없이 다른 입력이 항상 출력에 영향을 미치기 때문에 직접 사용되는 유일한 게이트입니다.
그러나 암호화 알고리즘에서 사용되는 유일한 게이트는 아닙니다. 수많은 비트 셔플과 XOR 및 회전 버퍼를 포함하는 구식 암호화의 경우에도 해당 될 수 있지만 소수 기반 암호화의 경우 XOR을 통해 구현되지 않는 모든 종류의 수학이 필요합니다.
XOR은 특정 비트를 켜고 끌 수있는 토글 스위치처럼 작동합니다. 숫자 (비트 패턴)를 "스크램블"하려면 숫자로 XOR합니다. 스크램블 된 번호를 가져와 같은 번호로 다시 XOR하면 원래 번호를 되 찾을 수 있습니다 .
210 XOR 145 gives you 67 <-- Your "scrambled" result
67 XOR 145 gives you 210 <-- ...and back to your original number
XOR을 사용하여 숫자 (또는 텍스트 또는 임의의 비트 패턴)를 "스크램블"할 때 많은 암호화 기반을 갖게됩니다.
XOR은 보다 복잡한 연산 (예 : ADD, MUL)보다 적은 트랜지스터 ( 4 NAND 게이트 )를 사용하므로 게이트 수가 중요한 경우 하드웨어에서 구현하는 것이 좋습니다. 또한 XOR은 키 자료를 적용하기에 좋은 자체 역 (inverse)입니다 (동일한 코드를 암호화 및 복호화에 사용할 수 있음) AES 의 아름답고 단순한 AddRoundKey 연산이 그 예입니다.
대칭 암호화의 경우 비트를 암호와 혼합하고 길이를 늘리지 않는 유일한 실제 선택 작업은 캐리로 추가, 캐리없이 추가 (XOR) 및 비교 (XNOR) 작업입니다. 다른 작업은 비트 손실, 확장 또는 CPU에서 사용할 수 없습니다.
XOR 속성 (a xor b) xor b = a 는 스트림 암호에 유용합니다. 비트 폭 데이터를 암호화하기 위해 암호 키 및 암호 알고리즘을 사용하여 n 비트의 의사 랜덤 시퀀스가 생성됩니다.
보내는 사람: 데이터 : 0100 1010 (0x4A) 의사 랜덤 시퀀스 : 1011 1001 (0xB9) ------------------ 암호화 된 데이터 1111 0011 (0xF3) ------------------ 리시버: 암호화 된 데이터 1111 0011 (0xF3) 의사 난수 시퀀스 : 1011 1001 (0xB9) (수신자가 키를 가지며 동일한 시퀀스를 계산 함) ------------------ 0100 1010 (0x4A) 복호화 후 데이터 ------------------
세 가지 일반적인 비트 논리 연산자를 살펴 보겠습니다.
숫자를 선택하고 (마스크라고합시다) 알 수없는 값과 결합한다고 가정 해 보겠습니다.
- AND는 일부 비트를 0으로 강제하는 것입니다 (마스크에서 0으로 설정된 비트).
- OR은 일부 비트를 1로 강제하는 것입니다 (마스크에서 1로 설정된 비트).
XOR은 어떤 마스크를 선택하든 결과의 값을 확실히 알 수없는 미묘합니다. 그러나 마스크를 두 번 적용 하면 초기 값을 되 찾을 수 있습니다.
즉, AND 및 OR의 목적은 일부 정보를 제거하는 것이며, 이는 암호화 알고리즘 (대칭 또는 비대칭 암호 또는 디지털 서명)에서 원하는 것이 아닙니다. 정보를 잃어버린 경우 다시 되돌릴 수 없거나 (암호 해독) 서명이 메시지의 약간의 변경을 허용하여 목적을 무효화합니다.
즉, 구현이 아니라 암호화 알고리즘에 적용됩니다. 대부분의 암호화 알고리즘 구현은 일반적으로 32 또는 64 내부 레지스터에서 개별 바이트를 추출하기 위해 많은 AND를 사용합니다.
일반적으로 이와 같은 코드를 얻습니다 (이것은 aes_core.c에서 거의 무작위로 추출한 것입니다).
rk[ 6] = rk[ 0] ^
(Te2[(temp >> 16) & 0xff] & 0xff000000) ^
(Te3[(temp >> 8) & 0xff] & 0x00ff0000) ^
(Te0[(temp ) & 0xff] & 0x0000ff00) ^
(Te1[(temp >> 24) ] & 0x000000ff) ^
rcon[i];
rk[ 7] = rk[ 1] ^ rk[ 6];
rk[ 8] = rk[ 2] ^ rk[ 7];
rk[ 9] = rk[ 3] ^ rk[ 8];
내가 맞다면 XOR 8 개와 AND 7 개
주어진 임의의 이진수 세트가 많은 'OR'연산이 모든 '1'을 향하는 경향이 있기 때문에 단순히 많은 수의 'AND'연산이 모두 0을 향하는 경향이 있기 때문이라고 생각합니다. 많은 수의 'XOR'은 1과 0의 무작위 선택을 생성합니다.
이것은 AND와 OR이 유용하지 않다는 것이 아니라 XOR이 더 유용하다는 것입니다.
암호화에서 OR / AND 및 XOR의 보급은 두 가지 이유 때문입니다.
하나는 번개처럼 빠른 지침입니다.
두 가지는 기존의 수학 공식을 사용하여 모델링하기가 어렵습니다.
XOR은 암호화의 수학적 계산입니다. 논리적 인 작업입니다. 다른 논리 연산이 있습니다 : AND, OR, NOT, Modulo Function 등. XOR이 가장 중요하고 가장 많이 사용됩니다.
같으면 0입니다.
다르면 1입니다.
예:
메시지 : 안녕하세요
Hello의 바이너리 버전 : 01001000 01100101 01101100 01101100 01101111
키 스트림 : 110001101010001101011010110011010010010111
XOR을 사용한 암호문 : 10001110 11000110 00110110 10100001 01001010
애플리케이션 : 일회용 패드 / Vern-am Cipher는 수신자가 동일한 키 스트림을 갖고 비밀 전송 채널을 통해 암호문을 수신하는 Exclusive 또는 기능을 사용합니다. 그런 다음 수신자는 Hello의 일반 텍스트를 표시하기 위해 키 스트림을 사용하여 암호문을 Xor합니다. One Time Pad에서 키 스트림은 메시지 길이보다 길어야합니다.
사실 : One Time Pad는 진정으로 깨지지 않는 유일한 암호화입니다.
독점적이거나 블록 암호 DES algo에서 사용되는 Feistel 구조에서 사용됩니다.
참고 : XOR 연산은 0 또는 1을 출력 할 확률이 50 %입니다.
참고 URL : https://stackoverflow.com/questions/1379952/why-is-xor-used-in-cryptography
'IT Share you' 카테고리의 다른 글
내 XML 파일에서 BOM 문자를 제거하는 방법 (0) | 2020.11.09 |
---|---|
INSERT INTO .. ON DUPLICATE KEY UPDATE for multiple items (0) | 2020.11.09 |
TeamCity 웹 서버용 포트 변경 (0) | 2020.11.09 |
레이블 콘텐츠의 WPF StringFormat (0) | 2020.11.09 |
htaccess-클라이언트의 브라우저가 캐시를 지우도록 강제하는 방법은 무엇입니까? (0) | 2020.11.09 |