Số thành viên: | 6040 |
Số bài tập: | 1001 |
Số bài nộp: | 722923 |
Bài nộp hôm nay: | 0 |
Double crypt - Mã hóa kép |
![]() |
![]() |
Người viết: Ngô Minh Đức | |
21/04/2008 | |
Mã hóa kép
BÀI
TOÁN
c = E(p, k) .
Nghịch
đảo của hàm mã hóa E là hàm giải mã D như sau:
D ( E(p, k), k ) = p
, E ( D(c, k),
k ) = c .
Trong hàm mã hóa AES kép, hai
khối chốt khác nhau k1 và k2 được
dùng liên tục nhau theo thứ tự k1, k2:
c2 = E ( E(p, k1),
k2 ).
Trong bài toán này, cho
trước cả số nguyên s. Chỉ xét 4*s bit
ở tận cùng bên trái của một trong số chuỗi,
còn lại các bít khác (128 bit tận cùng bên phải trừ
đi các bit 4*s) đều là 0.
Hãy khôi phục cặp
khối chốt của một số đoạn văn
bản được AES mã hóa hai lần. Cho trước đoạn văn
bản chưa mã hóa p và đoạn văn bản
đã mã hóa hai lần tương ứng c2, và
cấu trúc của khối mã hóa được biểu
diễn bằng s.
Thuật toán mã hóa và
giải mã AES có sẵn trong thư viện
Bạn phải đưa ra
khối khôi phục thay vì chương trình khôi phục.
INPUT
Cho trướs 10 bộ
dữ liệu trong các tệp văn bản có tên từ double1.in đến double10.in. Một tệp input
chứa 3 dòng. Dòng đầu tiên chứa số nguyên s,
dòng thứ hai chứa văn bản chưa mã hóa p,
dòng dòng thứ ba chứa văn bản đã mã hóa hai
lần c2 từ p bằng thuật toán
AES kép. Cả hai khối đều là các chuỗi gồm 32
ký tự theo hệ thập luc phân ('0'..'9', 'A'..'F').
OUTPUT
Hãy đưa ra 10 tệp
output tương ứng với 10 tệp input. Mỗi
tệp output cũng gồm 3 dòng. Dòng thứ nhất
chứa #FILE double I trong
đó I là số thứ tự tệp input. Dòng thứ hai
chứa khối chốt k1, và dòng thứ ba
chứa khối chốt k2, sao cho
c2 = E ( E(p, k1),
k2 ).
Cả hai khối đều là
chuỗi gồm 32 ký tự theo hệ thập lục phân
('0'..'9', 'A'..'F'). Nếu có nhiều giải pháp hãy in ra
một giải pháp.
Ví dụ
Thư viện
Thư viện FreePascal (Linux: aeslibp.p, aeslibp.ppu, aeslibp.o; Windows: aeslibp.p, aeslibp.ppw, aeslibp.ow*):
type
HexStr = String [ 32 ]; { only
'0'..'9', 'A'..'F' }
Block
= array [ 0..15 ] of Byte; { 128 bits }
procedure
HexStrToBlock ( const hs: HexStr; var b: Block );
procedure
BlockToHexStr ( const b: Block; var hs: HexStr );
procedure
Encrypt ( const p, k: Block; var c: Block );
{ c =
E(p,k) }
procedure
Decrypt ( const c, k: Block; var p: Block );
{ p = D(c,k) }
Cho trước
chương trình aestoolp.pas minh họa cách dùng thư
viện FreePascal.
thư viện GNU C/C++ (Linux và
Windows: aeslibc.h, aeslibc.o*):
typedef
char HexStr[33]; /* '0'..'9', 'A'..'F', '\0'-terminated */
typedef
unsigned char Block[16]; /* 128 bits */
void
hexstr2block ( const HexStr hs, / * out-param */ Block b );
void
block2hexstr ( const Block b, / * out-param */ HexStr hs );
void encrypt ( const Block p, const Block k, / * out-param */ Block c );
/* c =
E(p,k) */
void decrypt ( const Block c, const Block k, / * out-param */ Block p );
/* p = D(c,k) */
Chương trình aestoolc.c minh
họa cách dùng thư viện GNU C/C++.
Ràng buộc
Số s các chữ số theo
hệ thập lục phân 1 <= s <= 5. Gợi ý: Một chương tình tốt có thể khôi phục một trong số khối chốt yêu cầu trong chưa đến 10 giây với bất kỳ input nào. |
< Trước | Tiếp > |
---|