Lập trình giấu file văn bản trong file ảnh

Kiều Việt Phương
(_VoldemorT87_)

New Member
Tui bị giao một bài tập : Giấu 1 file văn bản trong một file ảnh. hoặc mã hóa 1 đoạn văn bản rồi giải mã.
Theo mọi người thì tui nên làm thía nào bi giờ? Bài thì sắp phải nộp rùi!
Giúp với!...
 
Giấu 1 file văn bản trong file ảnh JPEG thì cứ copy cái đoạn văn bản vào cuối file JPEG là được, file JPEG vẫn sẽ hiển thị đúng.

Còn mã hóa thì đơn giản rồi. Nếu ko yêu cầu mã hóa theo 1 cách gì đặc biệt thì cứ dùng Caesar cipher là được rồi. Dịch mỗi ký tự đi 3 vị trí: a --> d, b --> e,...
 
Làm phiền mọi người một chút!:D
Chương trình mã hóa sử dụng password như sau:
Program Code_Decode_file;
Uses Crt;
Type
file_name=string[11];
Password=string;
message=string;
coded=record
data:integer;
End;
Var
Source_file,Destination_file:file_name;
Decode:Boolean;{Code or Decode file}
Pword:password;
(*************************)
Procedure Author;
Begin
Writeln('Code file program');
Writeln('Writen by Nguyen Anh Quyen');
Writeln('HYUNDAI-DONGANH');
Writeln('Steel tower manufacturing co,');
End;
(*************************)
Procedure error_message(mess:message);
Begin
Writeln;Write(mess);
Readln;Halt;
End;
(*************************)
Procedure Code_or_Decode(Var uncode:boolean);
Var choice:char;
Begin
Writeln(' Enter : ');
Writeln(' 1 => Code a file.');
Writeln(' 2 => Decode a coded file.');
Write (' Choose : ');
choice:=readkey;writeln(choice);
If choice='1' then uncode:=false
Else If choice='2' then uncode:=true else Halt;
End;
(*************************)
Function Upcase_filename(filename:file_name):file_name;
Var i:byte;
Begin
for i := 1 to Length(filename) do
filename := UpCase(filename);
Upcase_filename:=filename;
End;
(*************************)
Procedure read_file_name(var sfile,dfile:file_name);
Begin
Write('Enter Source File : ');Readln(sfile);
Write('Enter Destination File : ');Readln(dfile);
If Upcase_filename(sfile)=Upcase_filename(dfile) then
Error_Message('You can not code or decode into itself !');
End;
(*************************)
Procedure Read_password(var pw:password);
Begin
Write('Enter PassWord : ');Readln(pw);
If pw='' then pw:='NguyenAnhQuyen';
Writeln('Wait . . .');
End;
(*************************)
Procedure check_Password(pw:password;sfile:file_name);
Var f1:file of coded;
i,len_old_pw:integer;
pw_code:coded;
old_pw:password;
Begin
Assign(f1,sfile);
{$I-} (* Kiem tra su ton tai cua file *)
Reset(f1);
If IOResult<>0 then error_message('File '+sfile+' does not exist
!');
{$I+}
Read(f1,pw_code);
len_old_pw:=pw_code.data;
i:=1;old_pw:='';
While i<=len_old_pw do
Begin
read(f1,pw_code);
old_pw:=old_pw+chr(pw_code.data-ord(pw));
i:=i+1;
End;
Close(f1);
If old_pw<>pw then error_message('Invalid PassWord !');
End;
(*************************)
Procedure Code_file(pw:password;sfile,dfile:file_name);
Var f1:file of char;
f2:file of coded;
code:coded;
ch:char;
i:integer;
Begin
Assign(f1,sfile);
{$I-} (* Kiem tra su ton tai cua file *)
Reset(f1);
If IOResult<>0 then error_message('File '+sfile+' does not exist
!');
{$I+}i:=1;
Assign(f2,dfile);
Rewrite(f2);
code.data:=length(pw);
Write(f2,code);
While i<=length(pw) do
Begin
code.data:=ord(pw)+ord(pw);
Write(f2,code);
i:=i+1;
End;i:=1;
While not eof(f1) do
Begin
read(f1,ch);
code.data:=(ord(ch)+ord(pw))*3;
Write(f2,code);
i:=i+1;
If i>length(pw) then i:=1;
End;
Close(f1);Close(f2);
End;
(*************************)
Procedure UnCode_file(pw:password;sfile,dfile:file_name);
Var f1:file of coded;
f2:file of char;
code:coded;
ch:char;
i,len_old_pw:integer;
Begin
Assign(f1,sfile);
Reset(f1);
Assign(f2,dfile);
Rewrite(f2);
Read(f1,code);
len_old_pw:=code.data;
For i:=1 to len_old_pw do
read(f1,code);
i:=1;
While not eof(f1) do
Begin
read(f1,code);
ch:=chr((code.data div 3)-ord(pw));
Write(f2,ch);
i:=i+1;
If i>length(pw) then i:=1;
End;
close(f1);close(f2);
End;
(*************************)
Begin
Code_or_Decode(Decode);
read_file_name(source_file,destination_file);
Read_password(pword);
If not decode then
Code_file(pword,source_file,destination_file)
Else
Begin
check_Password(pword,source_file);
UnCode_file(pword,source_file,destination_file);
End;
Author;
End.
Tuy nhiên luc' chạy thì nó cứ báo lỗi khi chỉ ra file cần mã hóa hoặc giải mã! Thậm chí khi file mã hóa và giải mã trùng tên cũng báo lỗi!
Có ai giúp tôi đc ko?
 
Kiều Việt Phương đã viết:
Làm phiền mọi người một chút!:D
Chương trình mã hóa sử dụng password như sau:
........
Có ai giúp tôi đc ko?
Thực ra là có làm sao đâu???Em chạy ngon lành mà.Chỉ có cái filename cho ngắn quá thôi nên bị cắt bớt. (file_name=string[11])

Mà lần sau thì anh nhét cái code vào
Mã:
 ý,giữa chừng lại thấy cái mặt cười toe toét :))

[quote]Tui bị giao một bài tập : Giấu 1 file văn bản trong một file ảnh. hoặc mã hóa 1 đoạn văn bản rồi giải mã. 
Theo mọi người thì tui nên làm thía nào bi giờ? Bài thì sắp phải nộp rùi!
Giúp với!...[/quote] 

End of Image (EOI) marker (FFD9)
(http://www.obrador.com/essentialjpeg/headerinfo.htm)

Cứ nhét văn bản vào dưới cái đấy là xong.
 
Chỉnh sửa lần cuối:
Lạ thật! Tui chỉnh lại file_name=string;
ngưng vẫn ko thể nhập file nguồn!
Xin hỏi: Luc' nhập tên file có cần đưa ra cả đường dẫn ko? Tôi thử mấy lần mà vẫn chưa đc.
 
Lạ thật! Tui chỉnh lại file_name=string;
ngưng vẫn ko thể nhập file nguồn!
Xin hỏi: Luc' nhập tên file có cần đưa ra cả đường dẫn ko? Tôi thử mấy lần mà vẫn chưa đc.
Không nhập file nguồn mà là nhập tên file cần mã hóa.Hình như anh hiểu nhầm.Chương trình bắt nhập tên file(nếu cùng thư mục thì không cần đường dẫn) rồi nhập tên file để save (khác file nguồn) sau đó thì mã hóa.File đó phải có sẵn rồi.Mà anh bị lỗi là lỗi gì thế?
 
Chỉnh sửa lần cuối:
Có lẽ bạn Lê Việt Bách hiểu nhầm: Đây là chương trình mã hóa và cả giải mã (Program Code_Decode_file;). Vì thế tôi hiểu file nguồn là file cần giải mã hoặc mã hóa (phần tôi đang băn khoăn là phần mã hóa!). Phần nhập tên file nguồn bạn bảo tôi "nếu cùng thư mục thì không cần đường dẫn" nhưng cùng thư mục với cái j`vậy???
Ngoài ra tôi muốn hỏi thêm: Có thể mở rộng ra mã hóa ko chỉ có file văn bản đc ko?
 
Có lẽ bạn Lê Việt Bách hiểu nhầm: Đây là chương trình mã hóa và cả giải mã (Program Code_Decode_file. Vì thế tôi hiểu file nguồn là file cần giải mã hoặc mã hóa (phần tôi đang băn khoăn là phần mã hóa!). Phần nhập tên file nguồn bạn bảo tôi "nếu cùng thư mục thì không cần đường dẫn" nhưng cùng thư mục với cái j`vậy???
Ngoài ra tôi muốn hỏi thêm: Có thể mở rộng ra mã hóa ko chỉ có file văn bản đc ko?

Cùng thư mục với cái chương trình mã hoá và giải mã đó.Nếu không chắc chắn thì nhập luôn cả đường dẫn đầy đủ:(c:\...\...).
Lúc chạy thì em làm thế này:
bấm 1(code a file)
nhập c:\levels.txt
nhập c:\encoded.txt
pass :asdf
thế là nó mã hoá.mở encoded.txt ra chả hiểu gì cả. :))

sau đó chạy lại.
bấm 2:
nhập:c:\encoded.txt
Nhập:c:\decoded.txt
pass:asdf
sau đó mở decoded.txt ra thì thấy đã được giải mã.

Anh mã hoá gì chả được,không phụ thuộc nó là kiểu file gì.

cái code kia có một đoạn rất buồn cười
coded=record
data:integer;
end;
 
sao ko viết C cho dễ đọc code. Viết Pascal ko ứng dụng dc j đâu mà lại dài, lằng nhằng, khó đọc code
 
Riêng trong cái chương trình này mà chú nghĩ là viết = C sẽ ngắn, dễ đọc & đỡ lằng nhằng hơn sao?? :))
 
Chỉnh sửa lần cuối:
Thật ra đoạn code sau:
[coded=record
data:integer;
end;]
cũng không buồn cười lắm đâu! Đây là 1 kiểu đơn giản để định nghĩa lại kiểu file dữ liệu cần mã hóa=> khó biết đc cấu trúc file=> tăng độ phức tạp cho file mã hóa. Có người còn khuyên nên định nghĩa thêm nhiều trường nữa nhằm tăng độ phức tạp. Tuy nhiên theo tôi làm thế thì kích thước file mã hóa sẽ tăng rất nhiều. Riêng kiểu định nghĩa trên thì kích thước file đã tăng gấp đôi. Theo tôi cách làm trên vẫn chưa thật hoàn hảo. Có cách nào vừa đảm bảo độ phức tạp vừa tạo file mã hóa kích thước nhỏ ko nhỉ?
 
Back
Bên trên