Skip to content
Narrow screen resolution Wide screen resolution Auto adjust screen size Increase font size Decrease font size Default font size default color grey color
         
 | 
VNOI - Olympic tin học Việt Nam

Điểm tin VOJ

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

Top 10 thành viên xuất sắc

HạngThành viênĐiểm
1mr_invincible587.9
2white_cobra418.6
3hieult403.4
4phaleq384.0
5vodanh9x368.2
6con_nha_ngheo352.0
7flash_mt350.2
8darksabers349.8
9yenthanh132345.3
10rockman9x_94343.1
Double crypt - Mã hóa kép In E-mail
(2 votes)
Người viết: Ngô Minh Đức   
21/04/2008

Mã hóa kép

BÀI TOÁN

AES đang nghiên cứu một thuật toán mã hóa rất mạnh. Thuật toán làm việc với 3 khối, mỗi khối gồm 128 bit. Cho trước khối văn bản p và một khối chốt k, hàm mã hóa AES E sẽ khôi phục lại khối đã được mã hóa c:

   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 k1k2 đượ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 >