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 ạ
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#
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
.
trên winform thì mình mới demo giao diện kiểu như này
Cách bạn mã hóa như thế nào?
Cách 2 là cách thuận tiện nhất cho cả mã hóa và giải mã.
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
Ý tướng hay đấy, giống cách 2 của mình, nhưng rảnh quá
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 +
và -
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.
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
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ệ.
mình không hiểu cai chỗ vòng xoay c= (c+1)%k.lenght;
Đ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.
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
Mình đã nói là qua C# ngắn hơn Javscript nhiều mà.
(int)s[i]
Ép kiểu ngược về char
nữa chứ .
r +=(char)(nguyên đoạn còn lại);
Mình thấy bạn có sai trong 2 phép tính + -
rồi đấy.
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
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.
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.