Расшифровка блока AES

10

Сегодня ваша цель - расшифровать секретное сообщение с помощью AES . Имея зашифрованный текст и ключ, вы расшифруете и распечатаете сообщение.


  1. Ваша программа может быть на любом языке. Он будет запущен с вводом на stdin, а его вывод на stdout будет проверен на правильность.

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

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

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

Самый короткий код в байтах побеждает.

Пример ввода и вывода:

bd8ab53f10b3d38576a1b9a15cf03834
02c0ee126cae50ba938a8b16f0e04d23

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

И другой:

f4af804ad097ba832906db0deb7569e3
38794338dafcb09d6b32b04357f64d4d

Поздравляю.

orlp
источник
5
... что такое AES?
Алекс А.
3
Связанные
Питер Тейлор

Ответы:

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

Кит Рэндалл
источник
Возможно, вам стоит сделать это в Pyth, иначе я гарантирую, что кто-то подметит и переведет это, избивая вас :)
orlp
В качестве быстрого теста я создал другой тестовый пример, но ваше решение не сработало. Я добавил второй тестовый пример к вопросу, чтобы вы могли отлаживать.
orlp
@orip: исправлено. Это была ошибка при умножении на ноль.
Кит Рэндалл,