Hiển thị kết quả từ 1 đến 10 / 10
  1. #1
    Tham gia
    04-07-2009
    Bài viết
    7
    Like
    0
    Thanked 0 Times in 0 Posts

    Hấp dẫn đây ! Nhờ giúp về giải thuật giải mã Vigenere

    1. 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é.
    Quote Quote

  2. #2
    Tham gia
    01-03-2009
    Bài viết
    220
    Like
    0
    Thanked 0 Times in 0 Posts
    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])

  3. #3
    Tham gia
    04-07-2009
    Bài viết
    7
    Like
    0
    Thanked 0 Times in 0 Posts
    Ui đúng thứ mình cần cảm ơn nhìu nhé.

    [=========> Bổ sung bài viết <=========]

    Quote Được gửi bởi kimduquan View Post
    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.
    Được sửa bởi mitom24h lúc 10:37 ngày 12-07-2009 Reason: Bổ sung bài viết

  4. #4
    Tham gia
    01-03-2009
    Bài viết
    220
    Like
    0
    Thanked 0 Times in 0 Posts
    đượ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ể.

  5. #5
    Tham gia
    04-07-2009
    Bài viết
    7
    Like
    0
    Thanked 0 Times in 0 Posts
    Quote Được gửi bởi kimduquan View Post
    đượ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.

  6. #6
    Tham gia
    01-03-2009
    Bài viết
    220
    Like
    0
    Thanked 0 Times in 0 Posts
    Quote Được gửi bởi mitom24h View Post
    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.
    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 đó).

  7. #7
    Tham gia
    04-07-2009
    Bài viết
    7
    Like
    0
    Thanked 0 Times in 0 Posts
    Tui 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();
    }
    Được sửa bởi mitom24h lúc 16:40 ngày 16-07-2009 Reason: Bổ sung bài viết

  8. #8
    Tham gia
    01-03-2009
    Bài viết
    220
    Like
    0
    Thanked 0 Times in 0 Posts
    void 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.

  9. #9
    Tham gia
    04-07-2009
    Bài viết
    7
    Like
    0
    Thanked 0 Times in 0 Posts
    void 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?

  10. #10
    Tham gia
    03-09-2008
    Bài viết
    14
    Like
    0
    Thanked 0 Times in 0 Posts
    tớ 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 =)).

Bookmarks

Quy định

  • Bạn không thể tạo chủ đề mới
  • Bạn không thể trả lời bài viết
  • Bạn không thể gửi file đính kèm
  • Bạn không thể sửa bài viết của mình
  •