1
ĐẠI HỌC QUỐC GIA HÀ NỘI
TRƯỜNG ĐẠI HỌC CÔNG NGHỆ
BÁO CÁO TIỂU LUẬN
MẬT MÃ VÀ AN TOÀN DỮ LIỆU
Đề tài :
Chữ ký số trên âm thanh số
Giảng viên hướng dẫn : PGS.TS. Trịnh Nhật Tiến
Sinh viên thực hiện : Bùi Trung Hiếu
HÀ NỘI 5 – 2014
Mục lục
Mục lục 2
GIỚI THIỆU 2
TÀI LIỆU THAM KHẢO 33
GIỚI THIỆU
Trong những năm gần đây, mạng internet phát triển mạnh cùng với việc chia sẻ
thông tin, lan truyền tập tin âm thanh trên mạng. Nhưng môi trường mạng internet là
môi trường hỗn hợp của nhiều mạng, nhiều loại thông tin. Do vậy, vấn đề bản quyền
thông tin, xác định nguồn của thông tin, cụ thể ở đây là âm thanh số là một điều mới
mẻ và chưa được triển khai rộng rãi ở Việt Nam. Chữ ký điện tử còn khá mới, chỉ được
triển khai ở một số ít các doanh nghiệp tư, cơ quan hải quan, cơ quan thuế của Chính
phủ, mới chỉ được áp dụng trên tập tin văn bản, tập tin ảnh số.
Trong tiểu luận này, tôi tập trung trình bày những kiến thức cơ bản nhất về đặc
trưng dữ liệu âm thanh, hàm băm, chữ ký số và ứng dụng chữ ký số trên âm thanh
số.
Mặt dù đã hết sức cố gắng, nhưng do thời gian có hạn, cùng sự hạn chế của bản
thân nên đề tài còn nhiều thiếu sót. Rất mong nhận được ý kiến đóng góp của thầy cô
và các bạn.
2
I. ĐẶC TRƯNG CỦA DỮ LIỆU ÂM THANH
mong muốn sinh ra bởi việc thiếu hụt thông tin từ sample rate). Mỗi mẫu sẽ cần một
lượng bit nhất định để lưu trữ gọi là sample size, và ta có thể tính toán dung lượng
cần thiết cho một sample.
Ví dụ: với âm thanh 16 bit, ta cần sử dụng 16 bit hay 2 byte cho một mẫu (8
bit = 1 byte). Như vậy 1 giây âm thanh với sample rate 44100/16 bit mono (một
kênh âm thanh) sẽ có độ lớn là 44100x2 = 88200 byte.
Nếu cũng với các thông số như vậy nhưng thay vì mono, ta sử dụng stereo (2
kênh âm thanh), dung lượng sẽ phải nhân đôi và trở thành 176400 byte. Đây là lý do
vì sao âm thanh vòm (5.1) hay các loại âm thanh sử dụng nhiều kênh khác (6.1, 7.1,
…) lớn hơn rất nhiều so với âm thanh stereo hay mono mặc dù chúng cũng được nén
ở cùng chất lượng.
- BitDepth: Để lưu lại dưới dạng số, mỗi mẫu được biểu diễn bằng một
lượng bit dữ liệu nhất định, gọi là Bit Depth. Các bản nhạc hiện nay thường
có Bit Depth là 16 bits, 24 bits… Bit Depth càng lớn âm thanh càng sắc
nét, trung thực nên nó còn được gọi là Resolution (độ nét).
- Kênh âm thanh (Channel): Bằng các thuật toán, tín hiệu số sẽ được tách ra
thành nhiều kênh sao cho khi nghe bằng hệ thống loa thích hợp sẽ có cảm
giác như khi đang nghe nhạc trong không gian thực tế.
4
- Âm thanh Lossy, lossless và uncompressed
Âm thanh uncompressed là loại âm thanh không áp dụng bất kỳ một phương
pháp nén nào. Được sử dụng dưới định dạng WAV hay PCM.
Âm thanh lossless là loại âm thanh sử dụng phương pháp loại bỏ những dữ
liệu không liên quan tồn tại trong file gốc để thu được một file nhỏ hơn nhưng vẫn
giữ được chất lượng như ban đầu. Âm thanh xử lý lossless sẽ có bit rate thấp hơn so
với âm thanh chưa nén. Âm thanh lossless được sử dụng rộng rãi và phát triển thành
những định dạng quen thuộc như AC3, AAC, DTS, MPEG-1/2/3, Vorbis, Real
Audio…
Âm thanh lossy là loại âm thanh thu được khi sử dụng những phần mềm
encode âm thanh phổ biến hiện nay để chuyển đổi các định dạng âm thanh. Đây là
Ví dụ: Xét sóng của tín hiệu x = sin (2*pi*100*t).
b) Khái niệm nhiễu
Nhiễu là tín hiệu do chính bản thân mạch điện từ và môi trường truyền
thông phát sinh ra. Giảm nhiễu hoặc khử nhiễu là thao tác chính trong xử lý tín hiệu
số. Nhiễu trắng là nhiễu có độ lớn như nhau ở mọi tần số (trên lý thuyết), trong thực
tế chúng ta chỉ xét trong phạm vị giới hạn băng tần khá rộng hay nói đúng hơn nhiễu
trắng là tín hiệu có mật độ công suất phổ (PSD) cố định ở mọi băng tần.
6
Có hai loại phân bổ xác suất của nhiễu thường nhắc tới là nhiễu phân bố
đều và nhiễu Gauss.
+ Phân bố đều là phân bố có hàm mật độ PDF f(x) không đổi trong
khoảng biến thiên của biến số x, có giá trị kỳ vọng là µ=0.
+ Phân bố Gauss là phân bố chuẩn. Dạng nhiễu phổ biến nhất trong thực
tế là nhiễu trắng có phân bổ Gauss.
c) Phân loại tín hiệu
Tùy theo từng tiêu chuẩn mà có nhiều cách phân loại khác nhau:
+ Dạng sóng: tín hiệu sin, vuông, tác giác, xung…
+ Tần số: hạ tần, cao tần (HF), âm tần (AF), siêu cao tần (VHF)…
+ Sự liên tục: tín hiệu liên tục, tín hiệu rời rạc.
+ Tính xác định: tín hiệu xác định, tín hiệu ngẫu nhiên.
2.2. Phân tích Fourier
a) Biến đổi Fourier rời rạc (DFT)
7
Tín hiệu tuần hoàn rất ít gặp trong thực tế, trong khi đó tín hiệu không
tuần hoàn và có số mẫu giới hạn lại thường xảy ra. Đối với các tín hiệu này lại không
phù hợp với phép biển đổi Fourier rời rạc theo thời gian. Do đó đối với tín hiệu
không tuần hoàn có độ dài hữu hạn N, người ta thường xem nó như là tín hiệu tuần
hoàn ở chu kỳ N, theo định nghĩa Fourier rời rạc của tín hiệu ta có:
Với k = 0,1,…,N-1. Đây là phép biến đổi Fourier thuận, ký hiệu DFT.
X
Gọi G(Ω) là đáp ứng tần số được yêu cầu và H(Ω): xung của hệ thống.
Đối với G(Ω) đáp ứng xung được cho bởi biểu thức Fourier như sau:
Xem mạch lọc là thông thấp lý tưởng tức là G(Ω) = 1 khi - Ω
C
< Ω < Ω
C
, ngược lại thì G(Ω) = 0.
* Độn không
Đây là thao tác thực hiện chèn bít 0 vào các thành phần trống của tín
hiệu sau khi thực hiện lọc qua cửa sổ.
9
* Nhân chập nhanh
Giúp thực hiện nhanh các thao tác tính toán nhân chập trên tín hiệu.
* Đáp ứng xung
Lưu ý:
Đáp ứng xung của hệ thống H là tín hiệu ra h(t), tín hiệu vào là một
xung lực đơn vị ∂(t). Vì xung lực ở t=0 nên đáp ứng xung cũng bắt đâu ở t=0.
Đáp ứng xung:
2.3. Lý thuyết trải phổ
a) Định nghĩa trải phổ
Trải phổ là kỹ thuật truyền tín hiệu, được sử dụng rộng rãi trong truyền
thông. Trong đó năng lượng của tín hiệu được “trải” trên một băng thông rộng hơn
nhiều lần lượng băng thông cần thiết tối thiểu nhờ sử dụng mã giả ngẫu nhiên, mã
này độc lập với tín hiệu thông tin. Bên nhận thông tin sẽ tiến hành “giải trải” bằng
cách đồng bộ hóa mã giả ngẫu nhiên.
Có 4 kiểu trải phổ:
• Trải phổ trực tiếp
• Nhẩy tần
• Nhẩy thời gian
• Hệ lai
x
m-2
+ … + g
1
x + g
0
(1)
Trong đó g
i
có giá trị là 0 hoặc 1 và g
m
= g
0
= 1
Cho g(x) = 0. Ta có sự hồi quy như sau :
1 = g
1
x + g
2
x
2
+ … + g
m-1
x
m-1
+ g
m
x
m
= g
1
c
i-1
+ g
2
c
i-2
+ … + g
m-1
c
i-(m-1)
+ g
m
c
i-m
(3)
c
i+m
= g
1
c
i+m-1
+ g
2
c
i+m-2
+ … + g
m-1
c
sang Bark như sau:
HBZ và LBZ là các tần số trên và tần số dưới của critical band z.
Sm(z) = Spz(z) * B(z)
T(z) là ngưỡng nghe sau cùng, được tính bằng công thức:
T(z) = max (Tnorm(z), TH)
TH: (ngưỡng nghe) là giá trị nhỏ nhất có thể nghe được và được tính theo
công thức
TH = max([Ppt(jw)])
Trong đó Ppt(jw) là công suất của tín hiệu thăm dò p(t):
p(t) = sin(2∏sin 4000r)
Tnorm(z) là ngưỡng nghe sau khi chuẩn hóa ngưỡng nghe thô. Và được tính
như sau:
Với Traw(z) là ngưỡng năng lượng thô:
Trong đó O(z) = α(14.5 + z) + (1 – α)5.5
13
III. Đại diện tài liệu và Hàm băm
3.1. Vấn đề đại diện tài liệu và hàm băm
a) Một số vấn đề với “chữ ký số”
* Vấn đề 1:
“Ký số” thực hiện trên từng bit tài liệu, nên độ dài của “chữ ký số” ít nhất
cũng bằng độ dài của tài liệu. Một số chữ ký trên bản tin có kích thước gấp đôi bản
tin gốc. Ví dụ khi dùng sơ đồ chữ ký DSS để ký vào bản tin có kích thước 160 bit,
thì chữ ký số này sẽ có kích thước 320 bit.
Trong khi đó trên thực tế, ta cần phải ký vào các bản tin có kích thước rất lớn,
ví dụ vài chục MegaByte (tương ứng hàng ngàn trang tin trên giấy). Như vậy phải
tốn nhiều bộ nhớ để lưu trữ “chữ ký”, mặt khác tốn nhiều thời gian để truyền “chữ
ký” trên mạng…
* Vấn đề 2:
Với một số sơ đồ chữ ký “an toàn”, thì tốc độ ký lại chậm vì chúng dùng nhiều
phép tính số học phức tạp như số mũ modulo.
trên mạng,…
Cơ chế gửi tài liệu cùng “chữ ký” trên nó sử dụng hàm băm được mô tả theo
các hình sau.
15
3.2. Tổng quan về Hàm băm
a) Hàm băm (Hàm tạo đại diện tài liệu)
* Khái niệm Hàm băm
Hàm băm là thuật toán không dùng khóa để mã hóa (ở đây dùng thuật ngữ
“băm” thay cho “mã hóa”), nó có nhiệm vụ “lọc” (băm) tài liệu (bản tin) và cho kết
quả là một giá trị “băm” có kích thước cố định, còn gọi là “đại diện tài liệu” hay
“đại diện bản tin”, “đại diện thông điệp”.
Hàm băm là hàm một chiều, theo nghĩa giá trị của hàm băm là duy nhất, và từ
giá trị băm này, “khó thể” suy ngược lại được nội dung hay độ dài ban đầu của tài
liệu gốc.
* Đặc tính của Hàm băm
Hàm băm h là hàm một chiều (One-way Hash) với các đặc tính sau:
+ Với tài liệu đầu vào (bản tin gốc) x, chỉ thu được giá trị băm duy nhất z =
h(x).
16
+ Nếu dữ liệu trong bản tin x bị thay đổi hay bị xóa để thành bản tin x’, thì giá
trị băm h(x’) ≠ h(x).
Cho dù chỉ là một sự thay đổi nhỏ, ví dụ chỉ thay đổi 1 bit dữ liệu của bản tin
gốc x, thì giá trị băm h(x) của nó cũng vẫn thay đổi. Điều này có nghĩa là: hai thông
điệp khác nhau, thì giá trị băm của chúng cũng khác nhau.
+ Nội dung của bản tin gốc “khó” thể suy ra từ giá trị băm của nó. Nghĩa là:
với thông điệp x thì “dễ” tĩnh được z = h(x), nhưng lại “khó” tính ngược lại được x
nếu chỉ biết giá trị băm h(x) (Kể cả khi biết hàm băm h)
* Ứng dụng của hàm băm
+ Với bản tin dài x, thi chữ ký trên x cũng sẽ dài, như vậy tốn thời gian “ký”,
tốn bộ nhớ lưu giữ “chữ ký”, tốn thời gian truyền “chữ ký” trên mạng.
theo các thuật toán này có độ dài cố định là 128 bit. Hàm băm MD4 đưa ra vào năm
1990. Một năm sau phiên bản mạnh hơn là MD5 cũng được đề xuất.
Hàm băm an toàn SHA, phức tạp hơn nhiều, cũng dưa trên các phương pháp
tương tự, được công bố trong Hồ sơ liên bang năm 1992 và được chấp nhận làm tiêu
chuẩn vào năm 1993 do Viện Tiêu chuẩn và Công nghệ Quốc gia (NIST). Giá trị
băm theo thuật toán này có độ dài cố định là 160 bit.
IV. Chữ ký số
4.1. Khái niệm “chữ ký số”
a) Giới thiệu “chữ ký số”
Để chứng thực nguồn gốc hay hiệu lực của một tài liệu (ví dụ: đơn xin học,
giấy báo nhập học, hợp đồng mua bán,…), từ xưa đến nay người ta dùng chữ ký
“tay”, ghi vào phía dưới của mỗi tài liều. Như vậy người ký phải trực tiếp “ký tay”
vào tài liệu.
Ngày nay các tài liệu được số hóa, người ta cũng có nhu cầu chứng thực
nguồn gốc hay hiệu lực của các tài liệu này. Rõ ràng không thể “ký tay” vào tài liệu
số, vì chúng không được in ấn trên giấy. Tài liệu “số” (hay tài liệu “điện tử”) là một
xâu các bít (0 hay 1), xâu bít có thể rất dài (nếu in trên giấy có thể hàng nghìn trang).
“Chữ ký” để chứng thực một xâu bít tài liệu cũng không thể là một xâu bít nhỏ đặt
phía dưới xâu bít tài liệu. Một “chữ ký” như vậy chắc chắn sẽ bị kẻ gian sao chép để
đặt dưới một tài liệu khác bất hợp pháp.
18
Những năm 80 của thế kỷ 20, các nhà khoa học đã phát minh ra”chữ ký số” để
chứng thực một “tài liệu số”. Đó chính là “bản mã” của xâu bít tài liệu.
Người ta tạo ra “chữ ký số” (chữ ký điện tử) trên “tài liệu số” giống như tạo ra
“bản mã” của tài liệu với “khóa lập mã”.
Như vậy “ký số” trên “tài liệu số” là “ký” trên từng bít tài liệu. Kẻ gian khó
thể giả mạo “chữ ký số” nếu không biết “khóa lập mã”.
Để kiểm tra một “chữ ký số” thuộc về một “tài liệu số”, người ta giải mã “chữ
ký số” bằng “khóa giải mã”, và so sánh với tài liệu gốc.
Ngoài ý nghĩa để chứng thực nguồn gốc hay hiệu lực của các tài liệu số hóa.
(x,y) =
Sai, nếu y ≠ Sig
k
(x)
Chú ý:
19
Người ta thường dùng hệ mã hóa công khai để lập “Sơ đồ chữ ký số”. Ở đây
khóa bí mật a dùng làm khóa “ký”, khóa công khai b dùng làm khóa kiểm tra “chữ
ký”.
Ngước lại với việc mã hóa, dùng khóa công khai b để lập mã, dùng khóa bí
mật a để giải mã.
Điều này là hoàn toàn tự nhiên, vì “ký” cần giữ bí mật nên phải dùng khóa bí
mật a để “ký”. Còn “chữ ký” là công khai cho mọi người biết, nên họ dùng khóa
công khai b để kiểm tra.
4.2. Phân loại chữ ký số
a) Phân loại chữ ký theo đặc trưng kiểm tra chữ ký
* Chữ ký có thể khôi phục thông điệp
Là loại chữ ký, người nhận có thể khôi phục lại được thông điệp đã được “ký”
bởi “chữ ký này”.
Ví dụ: Chữ ký RSA là chữ ký có thể khôi phục thông điệp.
* Chữ ký không thể khôi phục thông điệp
Là loại chữ ký, người nhận không thể khôi phục được thông điệp gốc.
Ví dụ: Chữ ký Elgamal là chữ ký không khôi phục được thông điệp gốc.
b) Phân loại chữ ký theo mức an toàn
* Chữ ký “không thể phủ nhận”
Nhằm tránh việc nhân bản chữ ký để sử dụng nhiều lần, tốt nhất là người gửi
tham gia trực tiếp vào việc kiểm thử chữ ký. Điều đó được thực hiện bằng một giao
thức kiểm thử, dưới dạng một giao thức mời hỏi và trả lời.
Ví dụ: Chữ ký không phủ định (Chaum – van Antverpen)
* Chữ ký “một lần”
(mod n).
* Chú ý
- Giữa sơ đồ chữ ký RSA và sở đồ mã hóa RSA ta thấy có sự tương ứng.
- Việc ký chẳng qua là mã hóa, việc kiểm thử lại chính là việc giải mã.
- Việc “ký số” vào x tương ứng với việc “mã hóa” tài liệu x.
- Kiểm thử chữ ký chính là việc giải mã “chữ ký”, để kiểm tra xem tài liệu đã
giải mã có đúng là tài liệu trước khi ký không. Thuật toán và khóa kiểm thử “chữ ký”
là công khai, ai cũng có thể kiểm thử chữ ký được.
- Chữ ký RSA thuộc loại chữ ký khôi phục thông điệp
b) Chữ ký Elgamal
* Sơ đồ
- Tạo cặp khóa (bí mật, công khai) – a,b
Chọn số nguyên tố p sao cho bài toán logarit rời rạc trong Z
P
là “khó” giải.
Chọn phần tử nguyên thủy g Є Z
*
P
. Đặt P = Z
*
P
, A = Z
*
P
– Z
P-1
.
Chọn khóa bí mật a Є Z
*
P
r
mod p và δ = (x-a*γ)*r
-1
mod (p-1)
- Kiểm tra chữ ký
Ver
k
(x, γ, δ) = đúng h
γ
* γ
δ
≡ g
x
mod p.
* Chú ý
- Nếu chữ ký được tính đúng, kiểm thử sẽ thành công vì
h
γ
* γ
δ
≡ g
a
γ
* g
r*
δ
mod p ≡ g
(
a
thay cho
Z
*
p
, do đó mọi tính toán được thực hiện trong Z
*
p
, nhưng thành phần chữ ký lại thuộc
Z
*
q
.
Thay đổi công thức tính δ trong sơ đồ chữ ký Elgamal thành
δ = (x + α * γ)r
-1
mod q.
Điều kiện kiểm thử là h
γ
γ
δ
≡ g
x
mod p được sửa thành
α
x*
δ
-1
* β
γ
*
*
q
, A = Z
*
q
x Z
*
q
, K= {(p, q, α , a, h)/ a Є Z
*
P
, h ≡ α
α
mod p}.
Với mỗi khóa (p, q, α , a, h), k’ = a bí mật, k’’ = (p, q, α , h) công khai.
- Ký số
Dùng 2 khóa ký: khóa a và khóa ngẫu nhiên bí mật r Є Z
*
q
.
Chữ ký trên x Є Z
*
P
là Sig
k’
(x,r) = (γ, δ), trong đó
γ = (α
r
mod p) mod q, δ = (x + a * γ) * r
-1
V. MÃ NGUỒN CHƯƠNG TRÌNH KÝ SỐ TRÊN FILE ÂM THANH
5.1. Xây dựng lớp BigInteger
- Phương thức tính modulo (gcd(this, bi))
public BigInteger gcd(BigInteger bi)
{
BigInteger x;
BigInteger y;
if ((data[maxLength – 1] & 0x80000000) != 0) //negative
x= - this;
else
x = this;
if ((bi.data[maxLength – 1] & 0x80000000) != 0) // negative
y = - bi;
24
else
y = bi;
BigInteger g=y;
while (x.dataLength >1 || (x.dataLength == 1 && x.data[0] != 0 ))
{
g = x;
x = y % x;
y = g;
}
return g;
}
- Phương thức sinh số nguyên tố ngẫu nhiên có kích thước n (bit)
public static BigInteger genPseudoPrime(int bits, int confidence, Random rand)
{
BigInteger result = new BigInteger();
bool done = false;