Tải bản đầy đủ (.pdf) (23 trang)

Bài Giảng Mã Hóa Theo Luồng

Bạn đang xem bản rút gọn của tài liệu. Xem và tải ngay bản đầy đủ của tài liệu tại đây (288.53 KB, 23 trang )

Mã hóa theo luồng
– Khái niệm mã hóa theo luồng
– Tạo luồng khóa tuyến tính
– Tạo luồng khóa không tuyến tính

1


Mã hóa theo luồng
(Stream Ciphers)

Khoa học về mật mã
Khóa bí mật
Private-Key
Mã hóa theo khối
Block ciphers

Mã hóa theo luồng
Stream ciphers

Mã hóa theo khối :
C = c1, c2,…, cn = ek(p1), ek(p2), …, ek(pn)
Khóa không thay đổi cho tất cả các khối (k)
Mã hóa theo luồng :
C = c0, c1, …, cn-1 = ez0(p0), ez1 (p1), …, ezn-1 (pn-1)
Bằng luồng khóa (keystream) = z0, z1, …, zn-1
2


Hàm mã hóa và giải mã
pi



zi

ci

zi

pi

Hàm mã và giải mã phổ biến nhất: Cộng theo modulo 2
Giả sử: pi, ci, zi ∈ {0,1} ; i = 0 → n-1
ci = ezi (pi) = pi + zi mod 2 → Mã hóa
pi = ezi (ci) = ci + zi mod 2 → Giải mã
Nhận xét:
1. Được Vernam sử dụng từ năm 1917
2. Cộng theo modulo 2 ≡ phép XOR với 2 đầu vào.
3. Mã hóa và giải mã hoàn toàn như nhau
3


Phép cộng modulo 2
a
0
0
1
1

b c = a + b mod 2
0 0 + 0 = 0 mod 2
1 0 + 1 = 1 mod 2

0 1 + 0 = 1 mod 2
1 1 + 1 = 0 mod 2

• Đây cũng chính là kết quả của a XOR b
• Phép mã hóa và giải mã như nhau vì:
Mã: pi + zi → ci Giải mã: ci + zi = pi + zi + zi = pi
Ví dụ: Mã hóa chữ A: AASCII = 6510 = 0100 00012
Với luồng khóa: z0z1…z7 = 001011012
4


Tạo luồng khóa




Cần phải tạo luồng khóa zi sao cho các bit của chúng
không phụ thuộc lẫn nhau. Tức là các zi phải được tạo
ra một cách hoàn toàn ngẫu nhiên
Luồng khóa sẽ được tạo ra từ 1 khóa ngắn
Khóa ban đầu K

Tạo luồng khóa

pn, …, p1, p0
Nam

zi

Tạo luồng khóa


Dũng
cn, …, c1, c0
Khóa ban đầu K

zi

pn, …, p1, p0
Mai
5


Các phương pháp tạo luồng khóa
1. Tạo luồng khóa đồng thời
(synchronous stream cipher)
zi = f(k) → Hàm tạo số ngẫu nhiên
(pseudo-random generator - PRG).

2. Tạo luồng khóa không đồng thời
(asynchronous stream cipher)
zi = f(k, ci-1, ci-2, …,ci-n) → Tạo số ngẫu
nhiên với sự phản hồi mã (feedback of
cipher).
6


Sơ đồ mã hóa theo luồng
pi

Mã hóa

pi ⊕ zi = ci

ci

zi
f()
Phản hồi mã

k
Sơ đồ mã hóa theo luồng có (hoặc không có) sự phản hồi
của mã
7


Tạo luồng khóa đồng thời
(synchronous stream cipher)

• Dãy z0,z1, … được tạo ra một cách ngẫu
nhiên và chỉ phụ thuộc vào khóa k
• Đại diện: Máy tạo luồng khóa tuyến tính
(linear feedback shift registers - LFSR)
– Với m giá trị nhị phân ban đầu máy sẽ cho ta dãy
các số nhị phân ngẫu nhiên dựa trên phép toán
XOR. Quá trình tính toán có sử dụng các kết quả
đã tính trong các bước trước
– Ví dụ: m=3, Ta có 3 hộp K0, K1, K2 theo hình vẽ
sau:
8



Máy tạo luồng khóa tuyến tính –
LFSR-3
K2 K1 K0
0

0

1

K2

K1

K0

1

0

0

z2

z1

z0

0

1


0

1

0

1

1

1

0

1

1

1

0

1

1

0

0


1

Giá trị
ban đầu

z0, z1, z2, ...
3, 1 + x + x3
[z0, z1, z2] = [1,0,0]

Với z0, z1, z2 là các giá trị ban đầu ta có:

z3 = z1+ z0 mod 2
z4 = z2+ z1 mod 2
……
Tổng quát:

zi+3 = zi+1+ zi mod 2 với i = 0, 1, 2, …
9


Máy tạo luồng khóa tuyến tính –
LFSR-m

C0 + C1x + ... + Cm-1xm-1 + xm

Cm-1

C1


C0

Km-1

K1

K0

zm-1

z1

z0
Output

input

Với z0, z1,…, zm-1 là các giá trị ban đầu
C0, C1,…, Cm-1 là các hệ số phản hồi ∈ {0,1}
Ci = 0 → Mạch mở; Ci = 1 → Mạch đóng
zi+m = Σj Cj.zi+j mod 2 với j = 0, 1, …m-1
Ví dụ: { C0=C1=1, C2=0; z0 =1, z1 = z2 =0; m=3}

10


Luyện tập LFSR- 4


Vẽ máy và tính luồng khóa nhận được

với m=4 :
1. (C0= C2 = 1, C1= C3 = 0); z0= z1= 0, z2= z3= 1
2. (C0= C1 = C2 = 1, C3 = 0); z0= z1= z2= 0, z3= 1
3. (C0 = C1 = C2 = C3 = 1); z0= z1= z2= z3= 0

11


Đánh giá LFSR
• Định lý: Độ dài cực đại của luồng khóa được tạo
bởi LFSR-m bằng 2m-1
• Nhận xét: Luôn có 1 số bộ nào đó (C0,…, Cm-1) cho ta độ
dài maximum của LFSR-m.
Ví dụ: Với m=4: (C0 = C1 = 1, C2 = C3 = 0) cho độ dài
2m-1 = 15. Nhưng (C0 = C1 = C2 = C3 = 1) có độ dài 5
• LFSR có thể được biểu diễn dưới dạng đa thức:
P(x) = C0 + C1x + ... + Cm-1xm-1 + xm
VD: (C0 = C1 = 1, C2 = C3 = 0) Ù P(x) = 1 + x + x4
(C0 = C1 = C2 = C3 = 1) Ù P(x) = 1 + x + x2 + x3 + x4

12


Luyện tập LFSR - m


Vẽ máy LFSR tương ứng, tính luồng khóa thu
được và tính chu kỳ của nó:
1. LFSR-3 = (3, 1 + x + x3), [z0, z1, z2] = [1,0,0]
2. LFSR-4 = (4, 1 + x + x4), [z0, z1, z2, z3] = [1,1,0,1],

3. LFSR-5 = (5, 1 + x + x2 + x4 + x5),
[z0, z1, z2, z3 , z4] = [1,0,0,1,0]

13


Tạo luồng khóa không tuyến tính
(Clock controlled shift registers)
• Máy chạy và dừng luân phiên (Anternating
stop-and-go generator)- Kết hợp 3 máy LFSR
Chỉ để điều
khiển

&
clock

LFSR R2
output

LFSR R1
not

&

LFSR R3

14


Máy chạy và dừng luân phiên

Qui trình chạy của máy như sau:
1. Máy R1 chạy
2. Nếu Kết quả của R1 là 1 thì:
– R2 chạy; R3 không chạy mà lặp lại bit kết quả
trước đó (Vòng đầu giá trị đó của R3 là 0)

3. Nếu Kết quả của R1 là 0 thì:
– R3 chạy; R2 không chạy mà lặp lại bit kết quả
trước đó (Vòng đầu giá trị đó của R2 là 0)

4. Đầu ra của R2 và R3 được XOR với nhau
và kết quả chính là 1 bit của luồng khóa
15


Máy chạy và dừng luân phiên (2)





Giả sử đầu ra của các máy R1, R2, R3 tương
ứng là: a0,a1,…; b0,b1,… và c0,c1,…
Đặt b-1 = c-1 = 0 và luồng khóa nhận được là
z0,z1,…
Khi đó: zj = bt( j )-1 ⊕ cj - t( j )
Với t(j) = (Σ ai); i = 0..j; ∀j ≥ 0
a

Khởi tạo


1

b(1)

b-1

b0

c(0)

c-1

z

z0

0

0

1

0

0

b1
c0


c1

z1

z2

z3

c2

c3

z4

z5

1

1

b2

b3

0

c4
z6

z7


z8
16


Ví dụ máy chạy và dừng luân phiên


Ví dụ: R1=(3, 1 + x + x3), [a0, a1, a2] = [1, 0, 0]
R2=(4, 1 + x + x4), [b0, b1, b2 , b3] = [1, 1, 0, 1],
R3=(5, 1 + x + x2 + x4 + x5), [c0, c1, c2 , c3] = [1, 0, 0, 1, 0]







Đầu ra của R1 (chu kỳ 7) sẽ là:
a7 = 1, 0, 0, 1, 0, 1, 1. (a0, a1…)
Đầu ra của R2 (chu kỳ 15) sẽ là:
b15 = 1, 1, 0, 1, 0, 1, 1, 1, 1, 0, 0, 0, 1, 0, 0.
Đầu ra của R3 (chu kỳ 31) sẽ là:
c31 = 1,0,0,1,0,1,0,1,1,0,0,0,0,1,1,1,0,0,1,1,
0,1,1,1,1,1,0,1,0,0,0.
Luồng khóa nhận được sẽ là:
z = 1,0,1,1,1,0,1,0,1,0,1,0,0,0,0,1,0,1,1,1,1,0,1,1,0,0,0,…
17



Ví dụ máy chạy và dừng luân phiên (2)
R1: (a0, a1, … , a7) = 1, 0, 0, 1, 0, 1, 1.
R2: (b0, b1, … , b15) = 1, 1, 0, 1, 0, 1, 1, 1, 1, 0, 0, 0, 1, 0, 0.
R3: (c0, c1, … , c31) = 1,0,0,1,0,1,0,1,1,0,0,0,0,1,1,1,0,0,1,1,
0,1,1,1,1,1,0,1,0,0,0.
z = 1,0,1,1,1,0,1,0,1,0,1,0,0,0,0,1,0,1,1,1,1,0,1,1,0,0,0,…

a

Khởi tạo 1

b(1)

0

c(0)

0

z

0 0 1 0 1 1 1 0 0 1 ...

1

1
1 0

0 1 0
0


1 ...
1 0

...

1 0 1 1 1 0 1 0 1 0 1 ...
18


Đánh giá độ an toàn
• Số box của máy R được gọi là độ dài của nó
• R1, R2, R3 cần được chọn sao cho độ dài của luồng
khóa (L) được tạo ra là lớn nhất (phụ thuộc vào độ
dài máy L1, L2, L3 và giá trị các bit khởi tạo).
• Trường hợp L1, L2, L3 đôi một nguyên tố cùng nhau
thì L sẽ lớn nhất và: L = L1.L2.L3
• Tuy nhiên thường người ta thường chọn Li xấp xỉ
bằng nhau (L1 ≈ L2 ≈ L3 ≈ l)
• Khi l ≈ 128 máy trên có thể coi là an toàn. (Phương
pháp “chia để trị” đối với R1 cần thực hiện là 2128
bước để có thể tìm ra khóa)
19


Thám mã LFSR
• Giả sử kẻ lạ biết vài plaintext với ciphertext
(Known plaintext attack) và biết số m:
– Biết plaintext (độ dài 2m): p0, p1, …, p2m-1.
– Biết ciphertext (độ dài 2m): c0, c1, …, c2m-1.

– Tính được luồng khóa:
zi = pi + ci mod 2; i = 0, 1,…, 2m-1 (?)

• Mục đích: Tính các hệ số Ci với:
zi+m = (Σ Cj . zi+j ) mod 2;
j = 0 → m-1, Cj ∈ {0, 1}
20


Phá mã của LFSR
• Ta viết dưới dạng triển khai:
i=0
zm
= C0z0 + C1z1 +…+ Cm-1zm-1
mod 2
i=1
zm+1 = C0z1 + C1z2 +…+ Cm-1zm
mod 2
………………………………………………………....
i=m-1 z2m-1 = C0zm-1 + C1zm +…+ Cm-1z2m-2 mod 2
• Ta có hệ PT tuyến tính với m ẩn C0,…,Cm-1. Ta có thể giải
được dễ dàng và tìm được Ci theo zj
• Vậy với LFSR bậc m bằng cách xem xét đầu vào và ra của
2m cặp bit ta có thể tìm được Ci
• Kết luận: LFSRs rất không an toàn. Tuy nhiên tổ hợp của
chúng (VD: máy chạy và dừng luân phiên lại an toàn hơn)
• Có thể dùng TT khối để tạo ra các chuỗi bit cho TT luồng
21



A5
• A5 là TT luồng sử dụng để mã hóa trong mạng điện
thoại di động (GSM), được bảo vệ như là bí mật kinh
doanh
• Có vài phiên bản (A5, A5/1, A5/2)
• Tất cả đều bị bẻ khóa (A5/2 : 8/1999, A5/1 : 4/2000)
• A5/1 gồm có 3 LFSR's với 19, 22 và 23 bit trong đó
sử dụng các đa thức phản hồi thưa
• Phiên bản A5/2 còn yếu hơn với việc sử dụng LFSR
thứ 4 để tắt mở - rất dễ bị tấn công
• Sử dụng SOBER (1998) để thay thế A5 cho GSM
• Một số TT khác: RC4, BBS
22


Bài tập
1.

Cho máy chạy và dừng luân phiên sau:
R1=(3, 1 + x + x3), [a0, a1, a2] = [1, 0, 0]
R2=(4, 1 + x3 + x4), [b0, b1, b2 , b3] = [1, 1, 0, 1],
R3=(5, 1 + x2+ x5), [c0, c1, c2 , c3 , c4] = [1, 0, 1, 0, 0]
Viết thủ tục tạo máy trên và xuất ra chuỗi dài 50 bits

2.

Sử dụng kết quả trên để mã hóa chuỗi thông điệp sau: “A bus”

3.


Viết chương trình cho máy tạo chuỗi bit sau:
LFSR-m = (m, C0 + C1x + ... + Cm-1xm-1 + xm ),
Với giá trị đầu vào: [z0, z1, …, zm-1]. Xuất ra n bits.

4.

Viết chương trình tạo máy chạy và dừng luân phiên

5.

Viết chương trình sử dụng máy chạy và dừng luân phiên để mã
hóa một chuỗi bit có độ dài không quá k.
23



×