(RAIL FENCE CIPHER) ///MÃ HÓA public static string Encrypt(int rail, string plainText) { List<string> railFence = new List<string>(); for (int i = 0; i < rail; i++) { railFence.Add(""); }
int number = 0; int increment = 1; foreach (char c in plainText) { if (number + increment == rail) { increment = -1; } else if (number + increment == -1) { increment = 1; } railFence[number] += c; number += increment; }
string buffer = ""; foreach (string s in railFence) { buffer += s; } return buffer; } ///GIẢI MÃ public static string Decrypt(int rail, string cipherText) { int cipherLength = cipherText.Length; List<List<int>> railFence = new List<List<int>>(); for (int i = 0; i < rail; i++) { railFence.Add(new List<int>()); }
int number = 0; int increment = 1; for (int i = 0; i < cipherLength; i++) { if (number + increment == rail) { increment = -1; } else if (number + increment == -1) { increment = 1; } railFence[number].Add(i); number += increment; }
int counter = 0; char[] buffer = new char[cipherLength]; for (int i = 0; i < rail; i++) { for (int j = 0; j < railFence[i].Count; j++) { buffer[railFence[i][j]] = cipherText[counter]; counter++; } }
return new string(buffer);
} ///CHƯƠNG TRÌNH CHÍNH static void Main(string[] args) { int key = 4; string plainText = "I Made Ronaldo";
Console.WriteLine("Plain Text : " + plainText); Console.WriteLine("Cipher Text : " + cipherText); Console.WriteLine("Decrypt Text : " + decryptText);
} Tag: C, C++, C#, mã hóa cổ điển, Rail-Fence, Rail-Fence Cipher, an toàn, bảo mật
Related Post:
Code C/C++: Tìm đường đi Euler của đồ thị (bài toán tìm đường đi)Mô tả bài toán: cho đồ thị vô hướng G=(V,E) hãy xác định mọi đường đi qua tất cả các cạnh mỗi cạnh chỉ qua duy nhất 1 lần.Ý tưởng thuật toán:sử dụng kỹ thuật tìm kiếm theo chiều sâu bằng cách xóa cạnh đã đi qua trong quá trình tìm kiếm đường đi.Mô tả dữ liệu đầu vào và đầu ra của bài toán:Dữ liệu vào: cho trong tập tin Bai5.inp- Dòng đầu ghi số n là số…Read More
Code C/C++: Đếm số thành phần liên thông của đồ thịMô tả bài toán: cho đồ thị vô hướng G=(V,E) hãy đếm số thành phần liên thông của đồ thị G.Ý tưởng thuật toán:Bước 0: khởi tạo số thành phần liên thông bằng 0.Bước 1: xuất phát từ một đỉnh chưa được đánh dấu của đồ thị. Ta đánh dấu đỉnh xuất phát, tăng số thành phần liên thông lên 1 và chuyển sang bước 2.Bước 2: từ một đỉnh i đã đánh dấu, ta đánh dấu đỉnh j n…Read More
Code C/C++: Đường đi Hamilton (bài toán đồ thị)Mô tả bài toán: cho đồ thị vô hướng G=(V,E) hãy xác định mọi đường đi từ đỉnh xuất phát đi qua tất cả các đỉnh mỗi đỉnh chỉ qua duy nhất 1 lần.Ý tưởng thuật toán: sử dụng kỹ thuật tìm kiếm theo chiều sâu bằng cách đánh dấu đỉnh đã đi qua trong quá trình tìm kiếm.Mô tả dữ liệu đầu vào và đầu ra của bài toán:Dữ liệu vào: cho trong tập tin Bai4.inp- Dòng …Read More
Code C/C++: Xét tính liên thông của đồ thịXét tính liên thông của đồ thịMô tả bài toán: cho đồ thị vô hướng G=(V,E) hãy kiểm tra tính liên thông của đồ thị G.Ý tưởng thuật toán:Bước 1: xuất phát từ một đỉnh bất kỳ của đồ thị. Ta đánh dấu đỉnh xuất phát và chuyển sang Bước 2.Bước 2: từ một đỉnh i đã đánh dấu, ta đánh dấu đỉnh j nếu A[i,j] = 1 và j chưa được đánh dấu và chuyển sang Bước 3.Bước 3: thực…Read More
Code C/C++: Thuật toán sắp xếp trộn (Merge Sort)Mô tả bài toán: cho 2 danh sách A và B lần lượt có m và n phần tử đã sắp xếp theo thứ tự. Bài toán đặt ra trộn 2 danh sách A và B với nhau thành danh sách C cũng là một danh sách có thứ tự.Thuật toán:Bước 1 :khởi tạo ba chỉ số chạy trong vòng lặp i = 0, j = 0, k = 0 tương ứng cho ba mảng A, B và C.Bước 2: tại mỗi bước nếu cả hai chỉ số (i<m và…Read More
Code C/C++: Tìm mọi đường đi từ giữa hai đỉnh của đồ thịTìm mọi đường đi từ giữa hai đỉnhMô tả bài toán: cho đồ thị vô hướng G=(V,E) hãy xác định mọi đường đi từ đỉnh D tới đỉnh C của đồ thị G.Ý tưởng thuật toán: sử dụng kỹ thuật tìm kiếm theo chiều sâu.Mô tả dữ liệu đầu vào và đầu ra của bài toán:Dữ liệu vào: đồ thị liên thông và cho trong tập tin Bai3.inp - Dòng đầu ghi số n là số đỉnh của một đồ thị (0&l…Read More
Klik untuk melihat kode: