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

Báo Cáo Bài Tập Lớn Ứng dụng kĩ thuật giấu tin trong âm thanh bằng kỹ thuật EchoHidingSingleKernel

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 (419.03 KB, 12 trang )

HỌC VIỆN CƠNG NGHỆ BƯU CHÍNH VIỄN THƠNG
KHOA CƠNG NGHỆ THÔNG TIN

-------------------------------------------

MÔN HỌC

Các Kĩ Thuật Giấu Tin

Báo Cáo Bài Tập Lớn
Ứng dụng kĩ thuật giấu tin trong âm thanh bằng kỹ
thuật Echo-Hiding-Single-Kernel
Giảng viên
Nhóm lớp
Sinh viên
Bùi Đình Hn
Trần Thế Qn

: Đỗ Xuân Chợ
: D18-018
:
B18DCAT102
B18DCAT194


Mục Lục
I. Giới thiệu về ứng dụng

3

II. Thuật toán Echo-Hiding-Single-Kernel


1.Mã hóa
2.Giải mã

3
3
6

III.Giải thích dịng lệnh
1.Mã hóa
2.Giải mã

9
9
11

2


I. Giới thiệu về ứng dụng
Bối cảnh sử dụng ứng dụng: Ứng dụng giấu tin trong âm thanh bằng kỹ
thuật Echo-Hiding-Single-Kernel rất phổ biến trong việc nhúng thủy vân.. Trong
hoạt động nhúng thủy vân, với sự phát triển của các thiết bị lưu trữ, sao chép thì
hoạt bảo vệ quyền tác giả đối với một bài hát, bài phát biểu,… trở nên quan trọng
hơn. Chủ sở hữu có thể đưa vào sản phẩm âm thanh của mình với một chữ ký
nhằm xác nhận bản quyền tác giả của mình. Ứng dụng này sẽ đảm bảo việc bản
quyền tác giả không bị mất sau các quá trình biến đổi như: giải mã, tái mã hóa,
nén, chuyển đổi định dạng file. Từ đó chống sao chép và bảo vệ quyền tác giả khi
đưa ra thị trường.
Trong ứng dụng này, các nhà nghiên cứu đã sử dụng nhân echo đơn để thực
hiện việc giấu tin, nó được phát triển trên nền tảng của matlab. Đầu vào của âm

thanh được đưa qua nhân echo đơn. Sau đó tín hiệu trộn sẽ trộn âm thanh với một
tín hiệu hình sin với âm thanh đầu ra khi đi qua single echo kernel để tạo độ mịn
trong âm thanh nhằm tránh sự phát hiện của hệ thống HAS (Human Auditory
System) vì nó rất nhạy cảm. Cuối cùng tín hiệu âm thanh sẽ được cộng lại để tạo
ra tín hiệu được mã hóa.

II. Thuật tốn Echo-Hiding-Single-Kernel
1.Mã hóa
Sơ đồ mã hóa

Tín hiệu gốc được chia thành các khối đại diện cho bit thông tin được giấu
vào. Chọn L là độ dài của âm thanh sao cho N*L (N là số khối) nhỏ hơn âm thanh
ban đầu.
Thực hiện giấu dữ liệu vào trong một đoạn âm thanh bằng việc thêm vào
âm thanh một phiên bản trễ hơn của chính nó. Tin giấu sẽ được biểu diễn dưới
3


dạng nhị phân chỉ có ‘0; và ‘1’, với từng bit 0 và bit 1 này chọn ra độ trễ tương
ứng không trùng nhau, điều trên được gọi là giấu tin với nhân echo đơn (single
echo hiding).
Ta chọn 3 tham số chính là d0, d1 và α lần lượt là độ trễ của bit , bit 1 và
biên độ của âm thanh và thực thi theo công thức sau đây: c(t) = f(t) + α f(t-d)

Âm thanh sẽ được chia thành 2 hướng đi qua 2 nhân k0 và k1

Âm thanh sau khi đi qua nhân nhân echo đơn sẽ sinh ra hai tín hiệu một là
tín hiệu âm thanh gốc, hai là tín hiệu âm thanh trễ có độ trễ và biên độ nhỏ hơn âm
thanh gốc.


4


Với hai đoạn âm thanh này thì hồn tồn HAS sẽ nhận ra sự khác biệt lớn
này. Vì vậy để tạo độ mịn cho âm thanh, người ta phải sinh ra một tín hiệu trộn với
đặc điểm giao thao theo đồ thị hình sin. Ví dụ như tín hiệu dưới đây:

Tín hiệu sau khi đi qua hàm trộn ở cả hai quá trình đối với bit 0 và bit 1 sẽ
phủ định của nhau.
Cuối cùng ta cộng hai tín hiệu này lại và biểu diện theo công thức sau:
X = Y + K0*Mixer +K1*(1-Mixer)
X: tín hiệu thu được
Y: tín hiệu gốc
K0: nhân 0
K1: nhân 1
Mixer: tín hiệu trộn
5


Kết quả:

2.Giải mã
Theo q trình mã hóa, bit 0 được biểu diễn với độ trễ d0, bit 1 được biểu
diễn với độ trễ d1. Việc trích xuất văn bản nhúng liên quan đến việc phát hiện
khoảng cách giữa các tiếng vọng với tín hiệu gốc.
Chúng ta bắt đầu với một tín hiệu mẫu là một chuỗi các xung sao cho
chúng cách nhau một khoảng đã định và có biên độ giảm dần theo cấp số nhân.

6



Thêm vào một tiếng vang với độ trễ 𝛅 bằng cách sử dụng nhân sau:

Và ta có kết quả là tín hiệu đã được thêm tiếng vang của tín hiệu gốc:

Tiếp theo cần tìm cepstrum của stego signal.
7


Cepstrum được định nghĩa là phép biến đổi Fourier ngược của hàm logarit
phổ biên độ tần số, được sử dụng trong các phương pháp ẩn tiếng vọng trong quá
trình giải mã.
Với việc phân tích này, ta sẽ có được tiếng vang một cách độc lập với tín
hiệu gốc ban đầu. Âm thanh stego được chia thành các phân đoạn có cùng độ dài
phân đoạn như trong q trình mã hóa. Tiếng vọng được quy định bởi độ lệch đã
định, vì thế ta có thể biết phân đoạn này đại diện cho bit 0 hay 1.

F:
Phép biến đổi fourier
ln(x): Logarit phức tạp
F⁻¹: Nghịch đảo của phép biến đổi fourier

Cepstrum của tín hiệu stego

8


Sau đó, để truy xuất bit được mã hóa, ta cần tìm bit thứ n của phân đoạn thứ
n trong cepstrum, Nếu


cₙ[d₀+1]>cₙ[d1+1] bit = 0 và ngược lại bit = 1;

Trong Matlab, cepstrum được tính bằng cơng thức sau:

III.Giải thích dịng lệnh
1.Mã hóa
Hàm thực hiện giấu tin;
function out = echo_enc_single(signal, text, d0, d1, alpha, L)
%ECHO_ENC_SINGLE Echo Hiding Technique với nhân echo đơn
%
%
Đầu vào của hàm
%
signal : tín hiệu gốc (âm thanh gốc) là một mảng 2 chiều
%
text
: Tin cần giấu (char)
%
d0
: Độ trễ của bit 0
%
d1
: Độ trễ của bit 1
%
alpha : Biên độ âm thanh của tiếng vang
%
L
: Độ dài của một khối đại diện cho 1 bit tín giấu (length of frame)
%
%

Đầu ra của hàm
%
out
: Âm thanh sau khi thực hiện giấu tin

if nargin < 4
d0 = 150;
d1 = 200;
end

%Độ trễ của bit 0
%Độ trễ của bit 1

if nargin < 5
alpha = 0.5;
end

%Biên độ của tiếng vang

if nargin < 6
L = 8*1024;
end

%Độ dài của một khối

[s.len, s.ch] = size(signal);
%Tạo một struct với độ dài của s.len là kích thước

9



% của âm thanh, s.ch là số kênh truyền
bit = getBits(text);
% Thực hiện chuyển đổi từ dạng char sang nhị phân đối với tin giấu
nframe = floor(s.len/L);
% Tính số khối có thể có trên tín hiệu âm thanh gốc
N = nframe - mod(nframe,8);
%Tính số khối tối đa để chèn tin giấu tương đương với số kí tự tối đa có thể giấu
vào %âm thanh
if (length(bit) > N)
%Nếu độ dài âm thanh lớn hơn số khối tối đa thì cần cắt bớt thông tin cần giấu chỉ
từ %khối 1 đến khối N
warning('Message is too long, being cropped!');
bits = bit(1:N);
else
%Còn nếu ngược lại ta thực hiện tạo ra dữ liệu kiểu char có số lượng tương ứng
với N
warning('Message is being zero padded...');
bits = [bit, num2str(zeros(N-length(bit), 1))'];
%num2str trả về mảng ký tự đại diện cho các số lấy xấp xỉ là 1
%bits biến đổi từ ma trận về array[1][1] kiểu char
end
% tạo ra ma trận 2 chiều
%Tạo nhân k0
k0 = [zeros(d0, 1); 1]*alpha;
%Tạo nhân k1
k1 = [zeros(d1, 1); 1]*alpha;
%Cho tín hiệu gốc đi qua nhân k0
echo_zro = filter(k0, 1, signal);
% Cho tín hiệu gốc đi qua nhân k1

echo_one = filter(k1, 1, signal);
%thực hiện lọc dữ liệu từ signal với từng nhân k
window = mixer(L, bits, 0 ,1, 256);
mix = window * ones(1, s.ch);

%Tạo tín hiệu trộn
%Điều chỉnh tín hiệu trộn tương ứng với số kênh
%truyền

%%%%%%%%%%%%%%%%%%%%%%% Tin nhắn được mã hóa... %%%%%%%%%%%%%%%%%%%%%%%
%Thực hiện tọa đầu ra theo công thức X = Y + K0*Mixer +K1*(1-Mixer)
out = signal(1:N*L, :) + echo_zro(1:N*L, :) .* abs(mix-1) ...
+ echo_one(1:N*L, :) .* mix;
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%Ghép tín hiệu đã giấu tin với phần cịn lại của tín hiệu gốc
out = [out; signal(N*L+1:s.len, :)];
%Rest of the signal
end

2.Giải mã
Hàm thực hiện giải mã:
function out = echo_dec(signal, L, d0, d1, len_msg)
%ECHO_DEC Decoding function for Echo Hiding Technique
%

10


%
Đầu Vào

%
signal : tín hiệu Stego
%
L
: Độ dài của một khối đại diện cho 1 bit tín giấu (length of frame)
%
d0
: độ trễ cho bit0
%
d1
: độ trễ cho bit1
%
len_msg : độ dài của messeage
%
%
Output
%
out
: tin nhắn được khai thác
%
%
Kadir Tekeli ()
if nargin < 2
%độ dài của 1 phân đoạn
L = 8*1024;
end
if nargin < 4
%độ trễ cho bit0
d0 = 150;
%độ trễ cho bit1

d1 = 200;
end
if nargin < 5
len_msg = 0;
end
%số lượng frame
N = floor(length(signal)/L);
xsig = reshape(signal(1:N*L,1), L, N);
%chia tín hiệu thành các frames
%chuỗi chứa kết quả
data = char.empty(N, 0);
for k=1:N
rceps = ifft(log(abs(fft(xsig(:,k))))); %tìm cepstrum
if (rceps(d0+1) >= rceps(d1+1))
data(k) = '0';
else
data(k) = '1';
end
end
m
= floor(N/8); % tính số block/ số byte sẽ được trích xuất
%ma tran m*8
%trích xuất thành các dãy nhị phân
bin = reshape(data(1:8*m), 8, m)';
out = char(bin2dec(bin))';
%bin to char
if (len_msg~=0)
out = out(1:len_msg);
end
end


11


12



×