Tải bản đầy đủ (.docx) (38 trang)

bài 4 mã hóa công khai

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 (1015.68 KB, 38 trang )

BẢO

MẬT

THÔNG

TIN
BÀI

4:


HÓA

CÔNG

KHAI
Nguyễn

Hữu

Thể
1
Nội

dung


Lý thuyết số học



Mã hóa công khai


Mã hóa RSA


Demo giải thuật RSA
2


thuyết

số

học


Phép chia modulo


Ước số


Số nguyên tố


Số nguyên tố cùng nhau


Phần tử nghịch đảo của phép chia modulo



Ước chung lớn nhất
3
Phép chia modulo
4
Ước số, số nguyên tố, số nguyên tố cùng nhau
5
Phần tử nghịch đảo của phép chia modulo
6
Ước chung lớn nhất - Thuật toán Euclid
7


hóa

khóa

công

khai


Mã hóa khóa công khai (public key cryptography)


Còn gọi là mã hóa bất đối xứng (asymetric cryptography).


Whitfield Diffie và Martin Hellman đã đề xuất 1976

⇒Bước đột phá quan trọng trong lĩnh vực mã hóa.
8


hóa

khóa

công

khai


Sử dụng hai loại khóa trong cùng một cặp khóa:


Khóa công khai (public key) được công bố rộng rãi => dùng
mã hóa thông tin.


Khóa riêng (private key) => dùng giải mã thông tin đã được
mã hóa bằng khóa công khai.
9


hóa

khóa

công


khai
10
RSA


Là phương pháp mã hóa khóa công khai.


Ron Rivest, Adi Shamir và Len Adleman tại học viện MIT đề
xuất năm 1977.


Hiện nay đang được sử

dụng rộng rãi.
11
RSA


Giải thuật RSA thao tác trên các khối (blocks) trong

đó bản rõ
(plaintext) và bản mã (ciphertext)

được chia ra thành nhiều
khối, mỗi khối là một số nguyên trong khoảng từ 0 đến n– 1.


Để tăng tính bảo mật, n thường được chọn khá lớn.



n càng lớn thời gian để mã hóa và giải mã càng lớn.


Kích thước của

n thường là 1024 bits hay 309 chữ số trong
hệ thập phân
12


tả

giải

thuật

RSA


Bản rõ được chia thành từng khối

để mã hóa, mỗi khối có giá
trị nhỏ hơn n.


Kích

thước


các

khối

phải

nhỏ

hơn

hoặc

bằng

log
2
(n);

trong

thực
tế mỗi khối có kích thước

k bits, với 2
k
< n ≤2
k+1



Với một khối M của bản rõ, khối C của bản mã (tương

ứng với
khối M)

được tính như sau:
và để giải mã khối C, ta sử dụng công thức:
13


tả

giải

thuật

RSA


Cả người gởi và người nhận đều phải biết
n
.


Người gởi (có nhiệm vụ mã hóa bản rõ) biết giá trị của
e
, và chỉ
có người nhận mới biết giá trị của
d
.



Khóa công khai (public key)
KU={e,

n}


Khóa bí mật (private key)
KR

=

{d,

n}
14
Giải

thuật

RSA
15
Giải

thuật

RSA



Giả sử người dùng A đã công bố khóa công khai của mình v
à
người dùng B muốn gởi cho A thông điệp M. B sẽ dùng khó
a
công khai của A (gồm 2 số
e

n
) để mã hóa thông điệp M the
o
công thức:


Sau đó B gởi bản mã C cho A. Khi A nhận

được

C, A sẽ dùn
g
khóa cá nhân của mình (gồm 2 số
d

n
) để giải mã:


Như thế A sẽ nhận được bản rõ của thông điệp M mà B muố
n
gởi cho anh ta. Vì


d

được giữ bí mật và chỉ có mình A biết
d
nên ngoài A ra không ai có thể giải mã được C.
16
Giải

thuật

RSA

-
Ví dụ 1
Sinh

khóa:
kích thước bit là 3 bit. Chọn 2
3
< p.q =<2
3+1
1.

Chọn hai số nguyên tố: p= 5, q= 3.
2.

Tính n = pq= 5 x 3 = 15
3.

Tính hàm Euler

ϕ(
n) = (p – 1)(q – 1) = 4 × 2 = 8
Chọn e sao cho 1 < e <
ϕ(
n) và nguyên tố cùng nhau với
ϕ(
n) = 8;
ta chọn e = 3.
4.

Tính d sao cho 1 < d <
ϕ(
n) và ed ≡ 1 mod
ϕ(
n).
- Tính được d =
3,
vì 3 × 3 mod 8 = 1.
5.

Nhận được khóa công khai
KU
= {e, n} = {3, 15}
6. Khóa bí mật
KR
= {d, n} = {3, 15}.
⇒ Mã hóa: M

= 2. Tính: C=M^e mod n = 2^3 mod 15 = 8
⇒ Giải mã: M = C^d mod n = 8^3 mod 15 = ((8^2 mod 15)(8 mod 15))mod 15


=
(64 mod 15)(8 mod 16) mod 15 = 4 * 8 mod 15 = 2
17
Giải

thuật

RSA

-
Ví dụ 2
Sinh



khóa

: kích thước bit là 4 bit. Chọn 2
4
< p.q =<2
4+1
1.

Chọn hai số nguyên tố: p= 7, q= 3.
2.

Tính n = pq= 7 x 3 = 21
3.


Tính hàm Euler
ϕ(
n) = (p – 1)(q – 1) = 6 × 2 = 12
Chọn e sao cho 1 <
e
<
ϕ(
n) và nguyên tố cùng nhau với
ϕ(
n) = 12;
ta chọn e = 5.
4.

Tính d sao cho 1 < d <
ϕ(
n) và e.d ≡ 1 mod
ϕ(
n) hay e.d mod
ϕ(
n) = 1
- Tính được d = 5
,

vì 5 × 5 mod 12 = 1
5.

Nhận được khóa công khai
KU
= {e, n} = {5, 21}
6. Khóa bí mật

KR
= {d, n} = {5, 21}.
⇒ Mã hóa: M

= 2. Tính: C=M
e
mod n = 2
5
mod 21 = 11
⇒ Giải mã: M = C
d
mod

n = 11
5
mod 21 = ((11
2
mod 21)(11
2

mod 21) (11
1

mod
21))mod 21

= ((121 mod 21) (121 mod 21)11) mod 21 = 16x16x11 mod 21 =
2
18
Demo


RSA
Số nguyên rất nhỏ
19
Demo

RSA


Số nguyên rất nhỏ
int[]

sinhKhoaRSA(){
//Chọn

2

số

nguyên

tố

p,

q.



thể


viết

hàm

phát

sinh

ngẫu
nhiên

SNT
int

p

=

3,

q

=

5;
int

n,


e,

d,

phi;
int

a[]

=

new

int[3];
n

=

p*q;
phi

=

(p-1)*(q-1);
e

=

timSNTCungNhau(phi);
d


=

timNghichDaoModulo(e,

phi);
a[0]

=

n;
a[1]

=

e;
a[2]

=

d;
return

a;

//trả

về

mảng


lưu

các

khóa

n,

e,

d
}
Demo

RSA


Số nguyên rất nhỏ
int

maHoaRSA(int

M,

int

e,

int


n){
//Mã

hóa

C

=

M^e

mod

n.

Hàm

pow:

C^d

<

10^19



kích
thước


kiểu

long
long

C

=

(long)Math.pow(M,

e)

%

n;
return

(int)C;
}
int

giaiMaRSA(int

C,

int

d,


int

n){
//Mã

hóa

M

=

C^d

mod

n.

Hàm

pow:

C^d

<

10^19




kích
thước

kiểu

long
long

M

=

(long)Math.pow(C,

d)

%

n;

return

(int)M;
}
21
Demo

RSA



Số nguyên rất nhỏ
public

static

void

main(String[]

args)

{
RSA

rsa

=

new

RSA();

//Tạo

biến

đối

tượng


rsa

thuộc

lớp

RSA
int

M

=

3;
//Văn

bản

rõ.

M

<

p.q
int

a[]

=


rsa.sinhKhoaRSA();
int

n,

e,

d;
n

=

a[0];

e

=

a[1];

d

=

a[2];
System.out.println("n

=


"

+

n);
System.out.println("e

=

"

+

e);
System.out.println("d

=

"

+

d);
int

C

=

rsa.maHoaRSA(M,


e,

n);
System.out.println("C

=

"

+

C);
n = 15
}
int

MM

=

rsa.giaiMaRSA(C,

d,

n);
System.out.println("MM

=


"+MM);
e=3
d=3
C = 12
MM = 3
22
Demo

RSA
Số nguyên nhỏ + BigInteger
23
Demo

RSA


Số nguyên nhỏ + BigInteger
Viết

lại

phương

thức



hóa

với


kiểu

dữ

liệu

BigInteger

cho

lũy

thừa
long

maHoaRSA(int

M,

int

e,

int

n){

//Mã


hóa

C

=

M^e

mod

n
//Cách

1:

Dùng

class

BigInteger

của

Java
/*BigInteger

MM

=


null;
BigInteger

nn

=

null;
MM

=

BigInteger.valueOf(M);
MM

=

MM.pow(e);
nn

=

BigInteger.valueOf(n);
MM

=

MM.mod(nn);
long


C

=

MM.longValue();
*/
//Cách

2:

Dùng

class

BigInteger

của

Java,

rút

gọn.
long

C

=
BigInteger.valueOf(M).pow(e).mod(BigInteger.valueOf(n)).longVal
ue();

return

C;
}
24
Demo

RSA


Số nguyên nhỏ + BigInteger
Viết

lại

phương

thức

giải



với

kiểu

dữ

liệu


BigInteger

cho

lũy

thừa
long

giaiMaRSA(long

C,

int

d,

int

n){

//Mã

hóa

M

=


C^d

mod

n
long

M

=
BigInteger.valueOf(C).pow(d).mod(BigInteger.valueOf(n)).longVal
ue();
return

M;

Tài liệu bạn tìm kiếm đã sẵn sàng tải về

Tải bản đầy đủ ngay
×