아래 설명 된대로 CipherSaber 암호화 프로그램을 구현하십시오 . 지침 :
- 가장 작은 항목 (바이트)이 이깁니다.
- 그러나 코드 골프 규범 에서 벗어난 경우, 골프 항목이 심각하지 않더라도 흥미로운 항목을 게시 할 수 있습니다.
- 항목은 일반적으로 표준 입력에서 일반 텍스트를 가져 와서 원하는 방식으로 사용자가 지정한 키를 사용하여 암호문을 표준 출력에 기록하는 프로그램입니다.
- 그러나 이것을 절차로 구현하려면 괜찮습니다.
- IV는 암호로 안전한 의사 난수 생성기에서 가져와야합니다. 해당 언어가 지원하지 않으면 다른 언어를 선택하십시오. ;-)
- 암호화 관련 라이브러리, 시스템 호출 또는 명령어 (위에 명시된 PRNG 이외)를 사용하지 마십시오. 물론, 일반적인 하위 수준의 비트 단위 연산은 괜찮습니다.
CipherSaber는 RC4 / Arcfour의 변형이므로 후자를 설명하는 것으로 시작한 다음 CipherSaber가 변경 한 사항을 설명하겠습니다.
0. RC4 / 아크 포
Arcfour는 다른 곳 에서 완전히 지정 되었지만 완전성을 위해 여기에 설명하겠습니다. (인터넷 초안과이 설명 사이에 불일치가있는 경우 전자는 표준입니다.)
키 설정
두 배열을 설정, S
및 S2
길이 256, 둘, k_1
키의 첫 번째 바이트이고, k_n
마지막이다.
S = [0, ..., 255]
S2 = [k_1, ..., k_n, k_1, ...]
( S2
모든 256 바이트가 채워질 때까지 키의 바이트로 반복해서 채워집니다.)
그런 다음 j
0으로 초기화 하고 256 번 셔플하십시오.
j = 0
for i in (0 .. 255)
j = (j + S[i] + S2[i]) mod 256
swap S[i], S[j]
end
이것으로 키 설정이 완료되었습니다. S2
배열은 더 이상 여기에 사용되지 않으며, 세정 할 수있다.
암호 스트림 생성
초기화 i
하고 j
0으로 설정 한 후 다음과 같이 키 스트림을 생성하십시오.
i = 0
j = 0
while true
i = (i + 1) mod 256
j = (j + S[i]) mod 256
swap S[i], S[j]
k = (S[i] + S[j]) mod 256
yield S[k]
end
데이터 암호화 / 복호화
- 암호화하려면 일반 텍스트와 함께 키 스트림 출력을 XOR하십시오.
- 암호 해독을 위해 키 스트림 출력을 암호문과 함께 XOR
1. 암호 세이버
CipherSaber (이 질문에서 우리가 구현하고있는 것)는 두 가지 방식으로 RC4 / Arcfour의 변형입니다.
10 바이트 IV / 초급
메시지를 암호화 할 때 via와 같은 10 개의 임의 바이트를 가져 /dev/urandom
와서 암호화 된 출력의 처음 10 바이트에 기록해야합니다. 메시지를 해독 할 때 입력의 처음 10 바이트는 메시지를 암호화하는 데 사용되는 IV입니다.
RC4 / Arcfour 키 설정 단계는 키로 실행되며 passphrase || IV
, 여기서 passphrase
사용자 지정 암호 IV
는 위에서 설명한대로 ||
연결되어 있습니다. "Hello, world!"의 암호입니다. "supercalif"의 IV (단, -P 일 가능성은 낮음)는 "Hello, world! supercalif"의 키가됩니다.
키 설정의 여러 반복
WEP 암호화를 완전히 손상시킨 취약점을 방지하기 위해 RC4의 주요 설정 단계에있는 셔플 링 루프는 사용자가 지정한 횟수만큼 실행됩니다. j
반복 사이에 값을 유지해야합니다.
2. 시험 벡터
다음은 프로그램을 테스트하는 데 사용할 수 있는 몇 가지 테스트 벡터 입니다. 또한 squeamish ossifrage 는 결과의 유효성을 검사하는 데 사용할 수 있는 CipherSaber 암호화 및 암호 해독 도구 를 만들었습니다 .
암호화 프로그램 만 구현하면됩니다. 암호 해독 프로그램을 제공 할 필요는 없지만 올바른 키를 사용하여 올바르게 구현 된 암호 해독 프로그램으로 처리 할 경우 암호 프로그램의 출력이 원래 입력으로 올바르게 왕복해야합니다.
urandom
"승리"에 관심이있는 경우 원하는 경우 별도의 출품작 이 될 수있는 버전을 만들 수 있습니다. :-)