Розшифрування блоку AES


10

Сьогодні ваша мета - розшифрувати секретне повідомлення за допомогою AES . Давши шифротекст і ключ, ви розшифруєте та надрукуєте повідомлення.


  1. Ваша програма може бути будь-якою мовою. Він буде працювати з введенням на stdin, а його вихід на stdout перевірятиметься на правильність.

  2. Першим рядком введення на stdin буде 16-байтний ключ, кодований у шістнадцятковій кількості. Другим рядком введення на stdin буде 16-байтний шифротекст, кодований у шістнадцятковий.

  3. Вихід програми повинен бути 16-байтним повідомленням після розшифровки шифротексту за допомогою AES-128 із заданим ключем. Необхідно вивести результат, інтерпретований як октети ASCII. Ви можете припустити, що будь-який результат є дійсним ASCII після розшифровки.

  4. Ви не можете використовувати будь-яку бібліотеку / вбудовані функції, які реалізують AES. Ви можете використовувати такі функції для перетворення між шестигранними / двійковими / ASCII кодуваннями.

Виграє найкоротший код у байтах.

Приклад введення та виведення:

bd8ab53f10b3d38576a1b9a15cf03834
02c0ee126cae50ba938a8b16f0e04d23

Атака завтра.

І ще:

f4af804ad097ba832906db0deb7569e3
38794338dafcb09d6b32b04357f64d4d

Вітаю.


5
... Що таке AES?
Алекс А.


Відповіді:


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є шифротекстом. Я будую P, сили 3 у полі, потім S, sbox. Потім kпродовжується на ключовий графік. Нарешті ми робимо розшифровку AES. Mixcolumn - важка фаза, всі інші фази досить прості.


Можливо, ви також повинні зробити це в Pyth, інакше я вам гарантую, що хтось підмітає і перекладе це, побивши вас :)
orlp

Як швидкий тест, я створив ще один тестовий зразок, але ваше рішення не вдається. До питання я додав другий тестовий зразок, щоб ви могли налагоджувати.
orlp

@orip: виправлено. Це була помилка при множенні на нуль.
Кіт Рендалл
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.