Sử dụng các công cụ xử lý âm thanh thực hiện các thao tác như: co dãn, cắt xén,… trên file audio. Các phần mềm xử lý âm thanh chuyên nghiệp có thể dễ dàng giúp thực hiện các thao tác này.
2.3.2.4. Tấn công xoá thuỷ vân
Với các phương pháp tấn công thuộc nhóm này, hiệu quả phụ thuộc nhiều vào file audio sử dụng phương pháp thuỷ vân nào.
- Tấn công vào kết cấu file - Thực hiện xoá nhiễu - Lọc phi tuyến
Chương 3: CHƢƠNG TRÌNH THỬ NGHIỆM 3.1. CHƢƠNG TRÌNH THUỶ VẤN SỐ
3.1.1. Cấu hình hệ thống
- Phần cứng: Chương trình chạy trên bộ vi xử lý của Intel và AMD, yêu cầu tối thiểu CPU 1.6GHz, 384 MB RAM, 1024x768 display, 5400 RPM hard disk.
- Phần mềm: Chương trình được xây dựng bằng ngôn ngữ lập trình C# thuộc phiên bản Visual Studio 2008, chạy trên nền hệ điều hành Windows của hãng Microsoft ( Windows Server 2003, Windows XP, Windows Vista, Windows 7).
3.1.2. Các thành phần của chƣơng trình
Chương trình Audio Watermarking có 2 phần chính: Embedded (nhúng thuỷ vân) và Extraction (tách thuỷ vân). Chương trình thực hiện nhúng thuỷ vân dưới dạng hình ảnh (jpg, bmp, gif), âm thanh (wav), văn bản (text) vào tệp tin âm thanh (wav).
Chương trình Embedded (nhúng thuỷ vân) bao gồm: - File gốc: tệp tin âm thanh cần nhúng thuỷ vân (wav) - File thuỷ vân: tệp tin thuỷ vân (jpg, bmp, gif, txt,...)
- File kết quả: tệp tin âm thanh đã được nhúng thuỷ vân (wav) Chương trình Extraction (tách thuỷ vân) bao gồm:
- File đã thuỷ vân: tệp tin âm thanh đã được nhúng thuỷ vân (wav)
- Key: tệp tin chứa khoá dùng để tách thuỷ vân, được sinh ra trong quá trình nhúng thuỷ vân (txt)
- File thuỷ vân: tệp tin thuỷ vân tách được từ tệp tin âm thanh (jpg, bmp, gif, txt, ...)
3.1.3. Hƣớng dẫn sử dụng chƣơng trình Audio Watermarking
3.1.3.1. Hướng dẫn sử dụng chương trình nhúng thuỷ vân
*Giao diện chƣơng trình
Hình 18: Giao diện chương trình nhúng thuỷ vân
Bƣớc 1: Bấm nút Browse ở mục File gốc để chọn tệp tin âm thanh cần nhúng thuỷ vân.
VD: chọn bài hát 03-Tren Dinh Phu Van- My Linh.wav
Bƣớc 2: Bấm nút Browse ở mục File thuỷ vân để chọn tệp tin thuỷ vân. VD: chọn bức ảnh bìa đĩa CD bia.jpg
Hình 20: Chọn file thuỷ vân
Bƣớc 3: Bấm nút Browse ở mục File kết quả, chọn vị trí lưu tệp tin âm thanh sau khi nhúng thuỷ vân, gõ tên tệp tin âm thanh kết quả.
VD: trendinhphuvan_watermark
Hình 21: Chọn vị trí lưu file âm thanh sau khi nhúng thuỷ vân
Bƣớc 4: Bấm nút Nhúng để thực hiện nhúng thuỷ vân và chờ thông báo từ chương trình.
3.1.3.2. Hướng dẫn sử dụng chương trình tách thuỷ vân
*Giao diện chƣơng trình
Hình 22: Giao diện chương trình tách thuỷ vân
Bƣớc 1: Bấm nút Browse ở mục File đã thuỷ vân để chọn tệp tin âm thanh cần tách thuỷ vân.
VD: chọn bài hát trendinhphuvan_watermark.wav
Bƣớc 2: Bấm nút Browse ở mục Key, chọn tệp tin chứa khoá (key.txt)
Hình 24: Chọn tệp tin chứa khoá tách thuỷ vân
Bƣớc 3: Bấm nút Browse ở mục File thuỷ vân, chọn vị trí lưu tệp tin thuỷ vân tách được.
VD: đặt tên là bia.jpg
Hình 25: Chọn vị trí lưu file thuỷ vân tách được
3.2. CHƢƠNG TRÌNH KÝ SỐ TRÊN ÂM THANH 3.2.1. Cấu hình hệ thống 3.2.1. Cấu hình hệ thống
- Phần cứng: Chương trình chạy trên bộ vi xử lý của Intel và AMD, yêu cầu tối thiểu CPU 1.6GHz, 384 MB RAM, 1024x768 display, 5400 RPM hard disk.
- Phần mềm: Chương trình được xây dựng bằng ngôn ngữ lập trình C# thuộc phiên bản Visual Studio 2008, chạy trên nền hệ điều hành Windows của hãng Microsoft ( Windows Server 2003, Windows XP, Windows Vista, Windows 7).
3.2.2. Các thành phần của chƣơng trình
Chương trình Digital Signature sử dụng 3 thuật toán chữ ký số là: RSA, Elgamal và DSS. Chương trình sử dụng các hàm băm (MD5, SHA1) tạo ra các đại diện cho các file âm thanh cần bảo vệ sau đó thực hiện ký số trên các đại diện này.
Chương trình Digital Signature bao gồm: - Chữ ký điện tử RSA
- Chữ ký điện tử Elgamal - Chữ ký điện tử DSS
Trong thực tế để đảm bảo độ an toàn cho chữ ký điện tử rất cần các số nguyên tố lớn và các phép toán liên quan (VD: trong chuẩn chữ ký điện tử DSS yêu cầu số nguyên tố p phải có độ lớn 512 bit), tuy nhiên sự giới hạn của các kiểu dữ liệu có sẵn không cho phép biểu diễn các số có kích thước quá lớn (VD: ngôn ngữ lập trình C# kiểu dữ liệu long kích thước tối đa 64 bit ). Do đó trong chương trình đã xây dựng lớp BigInteger với các phương thức, phép toán trên các số nguyên lớn (cụ thể sẽ được trình bày trong phần phụ lục đi kèm).
3.2.3. Hƣớng dẫn sử dụng chƣơng trình Digital Signature *Giao diện chính của chƣơng trình *Giao diện chính của chƣơng trình
Hình 26: Giao diện chương trình Digital Signature
Trong menu lựa chọn một loại chữ ký điện tử thích hợp (RSA, Elgamal, DSS) để chuyển tới từng chương trình chữ ký cụ thể.
3.2.3.1. Hướng dẫn sử dụng phần Tính khoá
Bƣớc 1: Sau khi chọn thuật toán ký số RSA, Elgamal hoặc DSS.
VD: chọn RSA, trong mục Tính khoá lựa chọn hoặc nhập độ dài của 2 số nguyên tố p, q (tính bằng bit).
Bƣớc 2: Bấm nút Tính khoá chương trình sẽ tự động tính toán các khoá công khai và bí mật sau đó lưu vào 2 tệp tin có tên là: public_key_rsa.dat và
private_key_rsa.dat.
VD: Với p, q có kích thước 160 bit, chương trình tự động tính toán các khoá bí mật và công khai lưu vào 2 file như sau:
File private_key_rsa.dat
3.2.3.2. Hướng dẫn sử dụng phần Ký số
Bƣớc 1: Bấm nút Browse ở phần Tài liệu gốc chọn tài liệu cần ký số (các định dạng âm thanh như: wav, mp3,…)
VD: chọn file 01-Tren Dinh Phu Van-Hong Hanh.wav
Hình 28: Chọn file âm thanh cần ký số
Bƣớc 2: Sau khi chọn xong file âm thanh cần ký, chương trình sẽ tự động tạo đại diện theo hàm băm MD5 (mặc định từ trước), có thể thay đổi hàm băm dùng để tạo đại diện bằng việc chọn ở mục Hàm băm
Bƣớc 3: Bấm nút Browse ở phần Khoá ký chọn tệp tin private_key_rsa.dat
được tạo từ phần Tính khoá để lấy khoá bí mật dùng để ký.
Hình 30: Chọn file chứa khoá dùng để ký số
Bƣớc 4: Bấm nút Browse ở phần Chữ ký chọn vị trí lưu kết quả ký được.
Hình 31: Chọn vị trí lưu file chữ ký
3.2.3.3. Hướng dẫn sử dụng phần Kiểm tra
Hình 32:Giao diện phần kiểm tra chữ ký số RSA
Bƣớc 1: Bấm nút Browse ở phần Tài liệu gốc chọn tài liệu cần kiểm tra (các định dạng âm thanh như: wav, mp3,…)
VD: chọn file 01-Tren Dinh Phu Van-Hong Hanh.wav
Hình 33: Chọn file âm thanh cần kiểm tra
Bƣớc 2: Sau khi chọn xong file âm thanh cần kiểm tra, lựa chọn hàm băm phù hợp để tạo đại diện.
Bƣớc 3: Bấm nút Browse ở phần Chữ ký chọn tệp tin chữ ký được tạo từ phần ký số có tên là Signature.txt
Hình 34: Chọn file chữ ký cần kiểm tra
Bƣớc 4: Bấm nút Browse ở phần Khoá kiểm tra chọn tệp tin
public_key_rsa.dat được tạo từ phần Tính khoá để lấy các khoá công khai dùng để
kiểm tra.
Hình 35: Chọn file chứa khoá công khai để kiểm tra
KẾT LUẬN
Thông qua việc tìm hiểu nghiên cứu một số phương pháp bảo vệ bản quyền âm thanh số, luận văn đã phân tích đánh giá các phương pháp từ đó làm cơ sở cho việc thiết kế các chương trình bảo vệ bản quyền phục vụ tối đa nhu cầu người sử dụng.
Đồng thời luận văn đã nghiên cứu một số phương pháp thuỷ vân và một số phương pháp sử dụng chữ ký số để bảo vệ bản quyền âm thanh số. Các phương pháp thuỷ vân số trên âm thanh chủ yếu khai thác khuyết điểm của hệ thính giác người (Human Auditory System – HAS), đảm bảo các đặc tính của thuỷ vân. Ngoài ra luận văn còn nghiên cứu bổ sung sử dụng chữ ký số để bảo vệ bản quyền file âm thanh. Từ đó tiến hành cài đặt chương trình nhúng thuỷ vân trên file âm thanh và ký số trên file âm thanh. Tuy nhiên chương trình thử nghiệm mới sử dụng phương pháp thuỷ vân truyền thống nên khả năng chống lại các kiểu tấn công là chưa cao, các phương pháp thuỷ vân bảo vệ bản quyền hiệu quả cao chưa được thực hiện.
Luận văn gồm hai kết quả chính:
1/. Tìm hiểu nghiên cứu tài liệu, sau đó trình bày các vấn đề sau: + Một số khái niệm về: An toàn thông tin, dữ liệu âm thanh
+ Một số phương pháp bảo vệ bản quyền âm thanh (Thuỷ vân số, Chữ ký số) + Một số khả năng tấn công bản quyền âm thanh.
2/. Thử nghiệm ứng dụng:
+ Thử nghiệm chương trình nhúng thuỷ vân vào file âm thanh.
+ Thử nghiệm chương trình ký số trên file âm thanh (RSA, Elgamal, DSS)
Hướng phát triển
Luận văn đã nghiên cứu tìm hiểu một số phương pháp bảo vệ bản quyền âm thanh sử dụng thuỷ vân và chữ ký số, tuy nhiên để nâng cao hiệu quả bảo vệ bản quyền cần tiếp tục hoàn thiện, nghiên cứu bổ sung và cài đặt các phương pháp thuỷ vân như: trải phổ kết hợp mô hình thính giác, lượng tử hoá chỉ mục,…
TÀI LIỆU THAM KHẢO Tiếng Việt
[1] - Phan Đình Diệu, “Lý thuyết độ phức tạp tính toán”, Đại học Quốc gia Hà Nội, Hà Nội, 1999.
[2] - Nguyễn Phạm Anh Dũng, “Lý thuyết trải phổ và ứng dụng”, NXB Bưu điện Hà Nội, 5-2000.
[3] - Quách Tuấn Ngọc “Xử lý tín hiệu số”, NXB Giáo dục, 1995 [4] - Trịnh Nhật Tiến, “Giáo trình an toàn dữ liệu”, Hà Nội, 2008.
Tiếng Anh
[5] - David Kahn, “The History of Steganography” (1996), Proc. Of First Int. Workshop on Information Hiding, Cambridge, UK, May 30-June 1996, Lecture notes in Computer Science, Vol.1174, Ross Anderson(Ed), p.1-7.
[6] - Fabien A. P. Petitcolas, et al (1999). “Information Hiding – A survey”, Proceedings of the IEEE, Vol. 87, No.7, p. 1062-1078.
[7] - Ingemar J.Cox, Matthew L.Miller, Jeffrey A.Bloom, Jessica Fridrich, Ton Kalker, “Digital Watermarking and Steganography”, Morgan Kaufmann Publishers.
[8] - Jonathan Cummins, Patrick Diskin, Samuel Lau and Robert Parlett,
“Steganophy And Digital Watermarking”, 2004.
[9] - Th. Beth, M.Frish, G.J.Simmons (1992), Public-Key Cryptography: State of
the Art and Future Direction, Sptinger-Verlag, Germany.
PHỤ LỤC
1. Mã nguồn chƣơng trình thuỷ vân số trên file âm thanh
- Chương trình nhúng thuỷ vân:
publicvoid Embedded(Stream messageStream)
{
byte[] waveBuffer = newbyte[bytesPerSample]; byte message, bit, waveByte;
int messageBuffer;
while ((messageBuffer = messageStream.ReadByte()) >= 0) {
message = (byte)messageBuffer;
for (int bitIndex = 0; bitIndex < 8; bitIndex++) {
sourceStream.Read(waveBuffer, 0, waveBuffer.Length); waveByte = waveBuffer[bytesPerSample - 1];
bit = (byte)(((message & (byte)(1 << bitIndex)) > 0) ? 1 : 0); if ((bit == 1) && ((waveByte % 2) == 0))
{
waveByte += 1; }
elseif ((bit == 0) && ((waveByte % 2) == 1)) { waveByte -= 1; } waveBuffer[bytesPerSample - 1] = waveByte; destinationStream.Write(waveBuffer, 0, bytesPerSample); } }
waveBuffer = new byte[sourceStream.Length - sourceStream.Position]; sourceStream.Read(waveBuffer, 0, waveBuffer.Length);
destinationStream.Write(waveBuffer, 0, waveBuffer.Length); }
- Chương trình tách thuỷ vân:
publicvoid Extract(Stream messageStream, long messageLength) {
byte[] waveBuffer = newbyte[bytesPerSample]; byte message, bit, waveByte;
int kt=0;
while ( messageStream.Length < messageLength) {
message = 0;
for (int bitIndex = 0; bitIndex < 8; bitIndex++) {
sourceStream.Read(waveBuffer, 0, waveBuffer.Length); waveByte = waveBuffer[bytesPerSample - 1]; bit = (byte)(((waveByte % 2) == 0) ? 0 : 1); message += (byte)(bit << bitIndex);
} kt = kt + 1; if(kt > 4 ) messageStream.WriteByte(message); } }
2. Mã nguồn chƣơng trình ký số trên file âm thanh
* Xây dựng lớp BigInteger
- Phương thức tính modulo (gcd(this, bi) )
publicBigInteger 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; 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)
publicstaticBigInteger genPseudoPrime(int bits, int confidence, Random rand) {
BigInteger result = newBigInteger(); bool done = false;
while (!done) { result.genRandomBits(bits, rand); result.data[0] |= 0x01; done = result.isProbablePrime(confidence); } return result; }
- Phương thức sinh số nguyên tố ngẫu nhiên có kích thước n (bit) thoả mãn : gcd(number, this) =1
publicBigInteger genCoPrime(int bits, Random rand) {
bool done = false;
BigInteger result = newBigInteger(); while (!done)
{
result.genRandomBits(bits, rand); BigInteger g = result.gcd(this);
if (g.dataLength == 1 && g.data[0] == 1) done = true;
}
return result; }
- Phương thức tính số nghịch đảo theo modulo
publicBigInteger modInverse(BigInteger modulus)
{
BigInteger[] p = { 0, 1 };
BigInteger[] q = newBigInteger[2]; BigInteger[] r = { 0, 0 };
int step = 0;
BigInteger a = modulus; BigInteger b = this;
while (b.dataLength > 1 || (b.dataLength == 1 && b.data[0] != 0)) {
BigInteger quotient = newBigInteger(); BigInteger remainder = newBigInteger(); if (step > 1)
{
BigInteger pval = (p[0] - (p[1] * q[0])) % modulus; p[0] = p[1];
p[1] = pval; }
if (b.dataLength == 1)
singleByteDivide(a, b, quotient, remainder); else
multiByteDivide(a, b, quotient, remainder); q[0] = q[1]; r[0] = r[1]; q[1] = quotient; r[1] = remainder; a = b; b = remainder; step++; }
if (r[0].dataLength > 1 || (r[0].dataLength == 1 && r[0].data[0] != 1)) throw (newArithmeticException("No inverse!"));
BigInteger result = ((p[0] - (p[1] * q[0])) % modulus); if ((result.data[maxLength - 1] & 0x80000000) != 0) result += modulus; // get the least positive modulus
return result; }
* Các phƣơng thức chính của chữ ký điện tử RSA
- Phương thức sinh khoá cho chữ ký RSA
privatevoid bttaokhoa_Click(object sender, EventArgs e)
{
if (cmbp.Text.Length == 0 || cmbq.Text.Length == 0) {
MessageBox.Show("Bạn chưa chọn đủ thông tin!", "Error!",
MessageBoxButtons.OK);
} else
{
Random rand = newRandom();
p = BigInteger.genPseudoPrime(int.Parse(cmbp.Text), 5, rand); q = BigInteger.genPseudoPrime(int.Parse(cmbq.Text), 5, rand);
n = p* q; pi_n = (p - 1) * (q - 1); b = pi_n.genCoPrime(pi_n.bitCount()-1, rand); a = b.modInverse(pi_n); String public_key,private_key; public_key = "<n>"+n.ToString() + "</n>"+ "\r\n" + "<b>"+b.ToString()+ "</b>"; private_key = "<p>" + p.ToString() + "</p>" + "\r\n" + "<q>" + q.ToString() + "</q>" + "\r\n" + "<a>" + a.ToString()+"</a>";
Directory.SetCurrentDirectory(System.Windows.Forms.Application.StartupPath);
File.WriteAllText(@"public_key_rsa.dat", public_key); File.WriteAllText(@"private_key_rsa.dat", private_key); MessageBox.Show("Thành công!", "Thông báo",
MessageBoxButtons.OK);
} }
- Phương thức ký số của chữ ký RSA
privatevoid btkyso_Click(object sender, EventArgs e)
{
if (txttailieu.Text.Length ==0 || txtkhoaky.Text.Length ==0 || txtgtbam.Text.Length ==0 )
{
MessageBox.Show("Bạn nhập thiếu thông tin !", "Thông báo!"); }
else
{
BigInteger HashValue_bigint; String[] line;
StreamReader private_key_file = null;
private_key_file = newStreamReader(txtkhoaky.Text); line = newString[3];
int i=0; while (i<3) { line[i] = private_key_file.ReadLine(); i++; } line[0] =line[0].Replace("<p>",""); line[0] = line[0].Replace("</p>",""); line[1]= line[1].Replace("<q>",""); line[1] = line[1].Replace("</q>",""); line[2] = line[2].Replace("<a>", ""); line[2] = line[2].Replace("</a>", ""); p= new BigInteger (line[0].ToString(),10); q = new BigInteger(line[1].ToString(), 10); a = new BigInteger(line[2].ToString(), 10); n = p * q;
// Doi gia tri hash o dang byte[] thanh BigInteger tuong ung
HashValue_bigint = new BigInteger(txtgtbam.Text.ToString(),10); encode = HashValue_bigint.modPow(a, n);
File.WriteAllText(txtchuky.Text, encode.ToString()); private_key_file.Close();
MessageBox.Show("Hoàn thành !!!", "Thông báo"); }
}
- Phương thức kiểm tra của chữ ký RSA
privatevoid btkiemtra_Click(object sender, EventArgs e)
{
if (txtkhoakt.Text.Length ==0 || txtchukykt.Text.Length ==0 || txttailieukt.Text.Length ==0 )
{
MessageBox.Show("Bạn nhập thiếu thông tin!", "Thông báo"); }
else
{ BigInteger SigValue_bigint; String[] line;
byte[] HashValue;
System.IO.FileStream oFileStream = null; BigInteger tg;
if (rbmd5_kt.Checked == true) {
System.Security.Cryptography.MD5CryptoServiceProvider
oMD5Hasher = new System.Security.Cryptography.MD5CryptoServiceProvider(); oFileStream = GetFileStream(txttailieukt.Text);
HashValue = oMD5Hasher.ComputeHash(oFileStream); tg = newBigInteger(HashValue); } else { System.Security.Cryptography.SHA1CryptoServiceProvider oSHA1Hasher = new System.Security.Cryptography.SHA1CryptoServiceProvider(); oFileStream = GetFileStream(txttailieukt.Text); HashValue = oSHA1Hasher.ComputeHash(oFileStream); tg = newBigInteger(HashValue); }
//Doc file public_key
StreamReader public_key_file = null;
public_key_file = newStreamReader(txtkhoakt.Text); line = newString[2];
int i = 0; while (i < 2) { line[i] = public_key_file.ReadLine(); i++; } line[0] = line[0].Replace("<n>", ""); line[0] = line[0].Replace("</n>", ""); line[1] = line[1].Replace("<b>", ""); line[1] = line[1].Replace("</b>", ""); n = new BigInteger(line[0].ToString(),10); b = new BigInteger(line[1].ToString(), 10); //Doc file chu ky
File.ReadAllText(txtchukykt.Text); SigValue_bigint = new
BigInteger(File.ReadAllText(txtchukykt.Text),10);
decode = SigValue_bigint.modPow(b, n); if (tg==decode)
{
MessageBox.Show("Chữ ký chính xác !", "Thông báo"); }
else
{
MessageBox.Show("Chữ ký không chính xác !", "Thông báo"); }
} }