Vigenere encryption

c-sharp
algorithm

(Vũ Thuận) #1

mình đang có bài tập lớn là mô phỏng quá trình mã hóa và giải mã Vigenere
mình tính làm nó trên winform c#


ai có phương án để giải mã giúp mình vs ạ


(SITUVN.gcd) #2

Theo tham chiếu bảng thì chuỗi mã hóa của bạn sai rồi. Có chỗ M + H = T, có chỗ thì M + H = S.

Bạn bí chỗ thể hiện từng bước trên Winfrom hay chỗ giải mã?


Bảng tham chiếu cũng sai khi mất hàng loạt kí tự L.


(Vũ Thuận) #3

trên winform thì mình mới demo giao diện kiểu như này


mình đang mắc chỗ giải mã, mã hóa thì cách làm mình tạm hiểu rồi


(SITUVN.gcd) #4

Cách bạn mã hóa như thế nào?

  1. Dùng bảng (mảng 2 chiều) để tham chiếu?
  2. Dùng cách biến đổi mã kí tự (CharCode)?

Cách 2 là cách thuận tiện nhất cho cả mã hóa và giải mã.


(Vũ Thuận) #5

mình tính mã hóa bằng cách gắn giá trị của bảng chữ cái bằng dictionary{“string”,int}( {“A”,0}…,{“Z”,26}) kiểu đó ,
rồi lúc nhập str vào mình sẽ get ra mã của nó và cộng vs mã của khóa( mã khóa cũng lấy tương tự ) sau đó mod cho 26 , sau đó lại đối chiếu qua dictionary đó để đưa về chữ đã mã hóa.
hiện tại mình ms lên ý tưởng thế không biết được không


(SITUVN.gcd) #6

Ý tướng hay đấy, giống cách 2 của mình, nhưng rảnh quá :rofl:
Mỗi kí tự đều có mã kí tự cả rồi. Lập Từ điển làm gì nữa.

(int)'A'-(int)'A' = 0
(int)'B'-(int)'A' = 1
...
(int)'Z'-(int)'A' = 25

26 kí tự đi từ 0 - 25.
Lấy mã kí tự tương ứng trừ (-) mã kí tự của A là ra giá trị số rồi.

Trong bài này mã hóa và giải mã chỉ khác nhau một đoạn nhỏ, nhất là chỉ ngược nhau 1 phép tính +- thôi.

Mình chỉ dùng 4 phép toán: + - * % để mã hóa và giả mã.

Mẫu bằng Javascript:
https://codepen.io/SITUVN_gcd/pen/eaBMwQ
Viết bằng C# còn ngắn hơn nữa.


(Vũ Thuận) #7

mình không học javascirp nên nhìn mấy hàm kia ko hiểu lắm,
mình có thắc mắc thế này : bây h mình lấy được mã của thông điệp và key rồi
nhưng đến đoạn ghép mã của key và mã của thông điệp sao cho đủ chuỗi thì mình hơi mắc ý tưởng


(SITUVN.gcd) #8

Như hình ban đầu mà bạn đưa đấy, lấy chuỗi cần mã hóa/giải mã thành từng nhóm có độ dài bằng khóa rồi tham chiếu theo bảng thôi.


Cú pháp C# với Javascript chẳng khác nhau là mấy, cho vòng lặp thì gần như không có điểm khác.

  k = k.toUpperCase(); // sang in HOA
  s = s.toUpperCase(); // sang in HOA
  var r = ""; // chuỗi kết quả mã hóa/giải mã
  var c = 0; // dùng xoay vòng theo độ dài khóa.

  for(var i = 0;i<s.length;i++){ // lặp qua từng kí tự của chuỗi
    if(không_trong_khoảng_A_Z){// kí tự tại s[i] không hợp lệ
      r+=s[i]; // không mã hóa, nối luôn vào kết quả
      continue; // bỏ qua bước mã hóa
    }
    //////// PHẦN CHÍNH
    // tính toán/tham chiếu kí tự được mã hóa/giải mã
    // dựa vào s[i] và k[c]
    r += ???;
    ////////
    c = (c+1)%k.length; // tăng lên và xoay vòng theo độ dài của khóa
  }

Tùy theo yêu cầu mà phần đk if kiểm tra hợp lệ có thể bỏ qua (không mã hóa/giải mã) hoặc quăng ngoại lệ/thông báo chuỗi không hợp lệ.


(Vũ Thuận) #9

mình không hiểu cai chỗ vòng xoay c= (c+1)%k.lenght;


(SITUVN.gcd) #11

Đi qua từng kí tự của khóa, khi nào đến kí tự cuối thì lại về kí tự dầu tiên.


(Vũ Thuận) #12

mình không biết trong c# hàm nào có công dụng giống charcodeAt trong javascrip nên vẫn làm theo hướng lập từ điện giá trị cho bảng chữ cái rồi phân tích ra mã của key và thông điệp
đến đoạn đó thì mình không biết cách tính toán giữa 2 mảng 1 chiều


(SITUVN.gcd) #13

Mình đã nói là qua C# ngắn hơn Javscript nhiều mà.

(int)s[i]

(Vũ Thuận) #14

mình làm như bạn mà cuối cùng code nó ra 1 đống mã khác chứ không phải ký tự


(SITUVN.gcd) #15

Ép kiểu ngược về char nữa chứ . :smiling_imp:

r +=(char)(nguyên đoạn còn lại);

(Vũ Thuận) #16

do kiến thức mình ít nên làm phiền bạn quá ,mình thêm (char) thì nó lại ra như này


(SITUVN.gcd) #17

Mình thấy bạn có sai trong 2 phép tính + - rồi đấy.


(Vũ Thuận) #18

mình kiểm tra lại phép toán và sửa lại rồi nhưng kết quả vẫn ra 1 cái mã khác .
mai mình phải nộp bài rồi , bạn xem còn lỗi nào chỉ giúp mình vs


(SITUVN.gcd) #19

Dấu ngặc đơn nữa.
Đây là mã hóa:

Giải mã thì chỉ thay đổi chỗ tính toán lại, dựa theo đoạn Javascript mình đưa mà làm. Chú ý: thứ tự phép toán và các dấu ngoặc.


(Vũ Thuận) #20

cảm ơn bạn nha, mình làm đươc rồi


(SITUVN.gcd) #21

Thế hiểu tại sao mình dùng phép toán, mà không cần tham chiếu bảng cho phức tạp không?

Nhìn vào bảng và tìm ra quy luật chung.


Xem như giải hộ bạn luôn rồi.
Cần học thêm, nhiều thứ đơn giản bạn vẫn chưa biết.

Hãy xem lại bài làm. Nếu chưa hiểu chỗ nào thì hãy biết hỏi “Tại sao” chỗ đấy.


83% thành viên diễn đàn không hỏi bài tập, còn bạn thì sao?