Nhờ Giúp Về Giải Thuật Giải Mã Vigenere [Archive] - Diễn Đàn Tin Học

Diễn Đàn Tin Học > Lập trình > Các ngôn ngữ lập trình > C/C++ > Nhờ giúp về giải thuật giải mã Vigenere PDA

View Full Version : Nhờ giúp về giải thuật giải mã Vigenere

mitom24h05-07-2009, 11:541. Tên đề tài: Cài đặt thuật toán mật mã VIGENERE để mật mã văn bản. 2. Nội dung: Mật mã là một ngành khoa học biến đổi các thông điệp trở nên vô nghĩa đối với những người không có quyền được biết nội dung của thông điệp. Có nhiều thuật toán đã đc phát minh từ xa xưa. Thuật toán Vigenere là 1 trong những thuật toán mật mã cổ điển, thuật toán thực hiện trên nguyên lý dịch chuyển vị trí của kí tự trong bảng Alphabet. Số vị trí dịch chuyển phụ thuộc vào khoá đc dùng để mật mã. Xét ví dụ dưới đây: P: VIGENERECIPHER K: KEYKEYKEYKEY C: FMEORCBIASTFOV K: có vị trí thứ 11, V có vị trí 22 trong bảng chữ cái Alphabet vì vậy V sẽ đc dịch chuyển đi 11 vị trí đến vị trí của chữ cái F. Viết chương trình cài đặt thuật toán trên với các chức năng: - Có giao diện menu đơn giản - Mã khoá và giải mã với khoá, và văn bản do người sử dụng cung cấp. - Mã khoá và giải mã với khoá và tệp văn bản. 3. Ngôn ngữ lập trình: C, C++. Bạn nào có code Ví dụ hoặc biết cách xử lý với thuật toán thì PM lại cho mình hoặc qua yahoo: never_vn05 nhé. kimduquan06-07-2009, 17:10giao diện thì mình ko biết còn thuật giải đơn giản lắm kí tự chữ cái thì nằm trong đoạn[65,90],để mã hóa : cho i chạy từ đầu đến cuối, C[i]=P[i]-abs(P[i]-K[i])(nếu P[i]>K[i]), C[i]=P[i]+abs(P[i]-K[i])(nếu P[i]<K[i]),với abs() là trị tuyệt đối,để giải mã thì bạn phải tìm được P[i] dựa và K[i] và C[i] đã biết,để tìm P[i],bạn phải giải hệ phương trình sau với C[i] và K[i] đã biết: C[i]=P[i]-abs(P[i]_K[i])(nếu P[i]>K[i]) C[i]=P[i]+abs(P[i]-K[i])(nếu P[i]<K[i]) mitom24h09-07-2009, 16:31Ui đúng thứ mình cần cảm ơn nhìu nhé. [=========> Bổ sung bài viết <=========] giao diện thì mình ko biết còn thuật giải đơn giản lắm kí tự chữ cái thì nằm trong đoạn[65,90],để mã hóa : cho i chạy từ đầu đến cuối, C[i]=P[i]-abs(P[i]-K[i])(nếu P[i]>K[i]), C[i]=P[i]+abs(P[i]-K[i])(nếu P[i]<K[i]),với abs() là trị tuyệt đối,để giải mã thì bạn phải tìm được P[i] dựa và K[i] và C[i] đã biết,để tìm P[i],bạn phải giải hệ phương trình sau với C[i] và K[i] đã biết: C[i]=P[i]-abs(P[i]_K[i])(nếu P[i]>K[i]) C[i]=P[i]+abs(P[i]-K[i])(nếu P[i]<K[i]) Theo bảng mã vigenere mình có thể tạo 1 ma trận với 26 hàng và 26 cột rồi duyệt trên bảng đó. Với C,C++ có thể làm đc ko hả bạn. kimduquan13-07-2009, 11:50được nhưng bạn tạo ma trận làm gì đối với bài này chỉ cần làm vòng lặp là được rồi,tại vì quan điểm của mình là làm cho bài toán đơn giản hết sức có thể. mitom24h14-07-2009, 23:31được nhưng bạn tạo ma trận làm gì đối với bài này chỉ cần làm vòng lặp là được rồi,tại vì quan điểm của mình là làm cho bài toán đơn giản hết sức có thể. Bạn ơi viết giúp mình cái code thuật toán này với. Mình làm xong cái menu rồi nhưng chưa biết áp cái thuật toán này vô bài. Giúp với sắp đến hạn nộp rùi. kimduquan15-07-2009, 16:17Bạn ơi viết giúp mình cái code thuật toán này với. Mình làm xong cái menu rồi nhưng chưa biết áp cái thuật toán này vô bài. Giúp với sắp đến hạn nộp rùi. bạn tự viết đi,có sẵn giải thuật rồi,chỉ cần chuyển thành code,mình đã chỉ sẵn cho bạn mã giả rồi đó,chỉ cần chuyển thành mã thật thui(viết có mỗi cái vòng lặp mà cũng lười thì mình thua bạn luôn đó). mitom24h16-07-2009, 02:46Tui ko phải là lười. Ngồi 2-3 ngày nay rồi chưa viết đc cái j. Cũng nghiên cứu chứ co phải không đâu. Không biết tôi mới nhờ chứ biết thì nói làm j. Tui là 1 con gà về C++ mà [=========> Bổ sung bài viết <=========] Cái thuật toán ông đưa tôi vẫn còn chưa hiểu lắm. Đau hết cả đầu đây nè [=========> Bổ sung bài viết <=========] Đât là BT mình đang làm dở. Chạy CT lên thì nó lại ko in ra xâu kí tự C[i]. Xem giúp mình là sai ở đâu nhé(CT ko báo lỗi) #include<conio.h> #include<stdio.h> #include<string.h> #include<iostream.h> #include<ctype.h> char *giaimavb(char *P,char *K) { char *C; int k=strlen(K);int p=strlen(P);int i; P=strupr(P); K=strupr(K); loop1: if(k<p) { *K=*K+*K; k=strlen(K); if(k<p) goto loop1; } while(i<=p) { K[i]-='a'-1; if((P[i]+K[i])>'z') C[i]='a'+(K[i]+P[i]-'z')-1; else if(P[i]==32) C[i]=P[i]; else C[i]=P[i]+K[i]; cout<<(char)C[i]; i++; if(i>=p) break; } return C; } void vanban() { clrscr(); char *P,*K,*C; int i,p,k; printf("\n \t\t Giai ma Van Ban \n\n"); printf("\n Moi ban nhap khoa : ");scanf("%d",*K); printf("\n Moi ban nhap ban ro chu : ");fflush(stdin);gets(P); C=giaimavb(P,K); printf("\nBan giai ma la:%s\n",C); getch(); } void tepvanban() { clrscr(); } void menu2() { int chon2; while(1) { clrscr(); cout<<"\n\tMA HOA VA GIAI MA VAN BAN\n\n"; cout<<"\n\t\t[1]Ma hoa Van ban"; cout<<"\n\t\t[2]Giai ma Van ban"; cout<<"\n\t\t[0]Thoat"; cout<<"\n\n\tMoi ban chon:";cin>>chon2; switch(chon2) { case 0: return; case 1: vanban(); break; case 3: tepvanban();break; default : cout<<"\n Moi ban nhap lai"; } } } void menu3() { int chon3; while(1) { clrscr(); cout<<"\n\tMA HOA VA GIAI MA TEP VAN BAN\n\n"; cout<<"\n\t\t[1]Ma hoa tep Van ban"; cout<<"\n\t\t[2]Giai ma tep Van ban"; cout<<"\n\t\t[0]Thoat"; cout<<"\n\n\tMoi ban chon:";cin>>chon3; switch(chon3) { case 0: return; case 1: vanban(); break; case 2: tepvanban();break; default : cout<<"\n Moi ban nhap lai"; } } } void menu1() { int chon1; while(1) { clrscr(); cout<<"\n\tCHUONG TRINH CAI DAT THUAT TOAN VIGENERE DE MA HOA VAN BAN\n\n"; cout<<"\n\t\t[1]Ma hoa va giai ma Van ban"; cout<<"\n\t\t[2]Ma hoa va giai ma tep Van ban"; cout<<"\n\t\t[0]Thoat"; cout<<"\n\n\tMoi ban chon:";cin>>chon1; switch(chon1) { case 0: return; case 1: menu2(); break; case 2: menu3();break; default : cout<<"\n Moi ban nhap lai"; } } } void main() { clrscr(); menu1(); } kimduquan17-07-2009, 10:47void mahoa(char*C,char*P,char*K,int n) { for(int i=0;i<n;i++) { if(P[i]>K[i]) C[i]=P[i]-abs(P[i]-K[i]); if(P[i]<K[i]) C[i]=P[i]+abs(P[i]-K[i]) } } còn phần giải mã thì giải cái hệ phương trình của mình để tìm hệ thức liên hệ(giải ra giấy)sau khi có hệ thức liên hệ thì làm y như hàm mahoa(),để tìm hệ thức liên hệ,ta đặt x=C[i],y=P[i],z=K[i]->hệ trở thành: x=y-|y-z|(y>x) x=y+|y-z|(y<x) <->|y-z|=y-x(y>x) |y-z|=x-y(y<x) <->(y-z)^2=(x-y)^2<->y^2-2*y*z+z^2=x^2-2*x*y+y^2 <->2*y*(-z+x)=-z^2+x^2<->y=(x+z)/2 hoặc x-z=0,còn lại bạn tự làm đi. mitom24h17-07-2009, 19:11void mahoa(char*C,char*P,char*K,int n) { for(int i=0;i<n;i++) { if(P[i]>K[i]) C[i]=P[i]-abs(P[i]-K[i]); if(P[i]<K[i]) C[i]=P[i]+abs(P[i]-K[i]) } } Cái này là cái j thế có khác cái đoạn này là mấy đâu: Giao diện thì mình ko biết còn thuật giải đơn giản lắm kí tự chữ cái thì nằm trong đoạn[65,90],để mã hóa : cho i chạy từ đầu đến cuối, C[i]=P[i]-abs(P[i]-K[i])(nếu P[i]>K[i]), C[i]=P[i]+abs(P[i]-K[i])(nếu P[i]<K[i]),với abs() là trị tuyệt đối,để giải mã thì bạn phải tìm được P[i] dựa và K[i] và C[i] đã biết,để tìm P[i],bạn phải giải hệ phương trình sau với C[i] và K[i] đã biết: C[i]=P[i]-abs(P[i]_K[i])(nếu P[i]>K[i]) C[i]=P[i]+abs(P[i]-K[i])(nếu P[i]<K[i]) Hình như bạn ko đọc hoặc chạy thử code của tôi hả? Hình như bạn cũng chả hiểu j nhỉ. Nhờ giúp thì giúp cho đến nơi đến chốn. KO giúp thì thôi. Lên trên này cứ lên mặt với người khác vậy? dungnhik5h21-09-2009, 21:40tớ cũng đang cần làm bài tập viết chương trình cho cái hệ mã này đây. nhưng mà lên đây nghe các cậu cãi nhau ==> nản hẳn. cùng giúp nhau học. "2 người mỗi người có một quả tao, nếu trao đổi cho nhau thì thứ có đc sẽ chỉ là vị táo >< 2 người có kiến thức, khi trao đổi cho nhau thì kết quả nhận đc......." là gì thì các cậu bit rồi đó. nếu như trên đây thì chỉ là "đọ xem quả táo nào to hơn" thôi ==. đọ hàng =)). Powered by vBulletin® Version 4.2.0 Copyright © 2024 vBulletin Solutions, Inc. All rights reserved.

Từ khóa » Code Hệ Mã Vigenere