AES 블록 해독


10

오늘 당신의 목표는 AES를 사용하여 비밀 메시지를 해독하는 것입니다 . 암호문과 키가 주어지면 메시지를 해독하고 인쇄합니다.


  1. 귀하의 프로그램은 모든 언어로 제공 될 수 있습니다. stdin의 입력으로 실행되고 stdout의 출력이 올바른지 확인합니다.

  2. stdin의 첫 번째 입력 행은 16 바이트 키이며 16 진수로 인코딩됩니다. stdin의 두 번째 입력 행은 16 바이트로 인코딩 된 16 바이트 암호문입니다.

  3. 주어진 키로 AES-128을 사용하여 암호문을 해독 한 후 프로그램의 출력은 16 바이트 메시지 여야합니다. ASCII 옥텟으로 해석 된 결과를 출력해야합니다. 암호 해독 후 결과가 유효한 ASCII라고 가정 할 수 있습니다.

  4. AES를 구현하는 라이브러리 / 내장 기능을 사용할 수 없습니다. 이러한 기능을 사용하여 16 진 / 이진 / ASCII 인코딩간에 변환 할 수 있습니다.

바이트 단위의 최단 코드가 이깁니다.

입력 및 출력 예 :

bd8ab53f10b3d38576a1b9a15cf03834
02c0ee126cae50ba938a8b16f0e04d23

내일 공격 해

그리고 또 다른:

f4af804ad097ba832906db0deb7569e3
38794338dafcb09d6b32b04357f64d4d

축하합니다.


5
... AES 란 무엇입니까?
Alex A.


답변:


4

파이썬, 661 자

R=range
I=lambda x:[int(x[2*i:2*i+2],16)for i in R(16)]
k=I(raw_input())
c=I(raw_input())
P=[]
x=1
for i in R(512):P+=[x];x^=x*2^(x>>7)*0x11b
S=[255&(99^j^(j>>4)^(j>>5)^(j>>6)^(j>>7))for i in R(256)for j in[(P[255-P.index(i)]if i else 0)*257]]
for r in R(10):
 for i in R(4):k+=[k[-16]^S[k[-3-(i>2)*4]]]
 k[-4]^=[1,2,4,8,16,32,64,128,27,54][r]
 for i in R(12):k+=[k[-16]^k[-4]]
for r in R(11):
 c=[x^y for x,y in zip(k[160-16*r:],c)]
 if r>9:break
 for i in[0,4,8,12]*(r>0):c[i:i+4]=[x^y^z^w for j in R(4)for x,y,z,w in[[P[a+P.index(v)]if v else 0 for a,v in zip((2*[104,238,199,223])[3-j:],c[i:i+4])]]]
 c=(c*13)[::13];c=map(S.index,c)
print''.join(map(chr,c))

k핵심 c은 암호문입니다. 필드에 3의 거듭 제곱 인 P를 빌드 한 다음 Ssbox를 빌드 합니다. 그런 다음 k주요 일정으로 연장됩니다. 마지막으로 AES 암호 해독을 수행합니다. Mixcolumns는 어려운 단계이며 다른 모든 단계는 매우 간단합니다.


어쩌면 당신은 또한, Pyth에서 하나를 수행해야한다, 그렇지 않으면 나는 당신을 보장 할 수 있습니다 사람 : 당신에게 구타를 따라 청소 및 번역합니다
orlp

빠른 테스트로 다른 테스트 케이스를 생성했지만 솔루션이 실패합니다. 디버그 할 수 있도록 두 번째 테스트 케이스를 질문에 추가했습니다.
orlp

@orip : 수정되었습니다. 0을 곱한 버그였습니다.
Keith Randall
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.