Bạn đã bao giờ nghe nói về mật mã Caesar chưa ?
Julius Caesar đã sử dụng kỹ thuật này để che giấu những thông điệp bí mật từ kẻ thù của mình!
Mật mã Caesar là một trong những kỹ thuật mã hóa nguyên thủy nhất.
Ý tưởng chính đằng sau hệ thống này là xoay các chữ cái x số vị trí trên bảng chữ cái .
Ví dụ:với x = 1
, ‘A’ trở thành ‘B’, ‘C’ trở thành ‘D’, v.v.
Vậy làm cách nào để chúng ta triển khai điều này trong mã?
Rất vui vì bạn đã hỏi, hóa ra nó không khó như vẻ ngoài. Chúng tôi sẽ tận dụng lợi thế của thực tế là các chữ cái có thể được biểu thị bằng số (mã ASCII), điều này sẽ làm cho công việc xoay các chữ cái trở thành vấn đề chỉ cần thêm hai số với nhau.
Tạo bộ chuyển đổi mật mã Caesar của riêng bạn
Chúng ta sẽ bắt đầu bằng cách chuyển đổi một chuỗi đầu vào thành một mảng số nguyên:
ascii = "test".chars.map(&:ord)
Hãy phân tích vấn đề này :
Các ký tự phương thức chia chuỗi thành một mảng ký tự và nó trả về một liệt kê. Do đó, chúng tôi có thể gọi là bản đồ trên mảng.
Phương thức bản đồ rất hữu ích khi chúng ta muốn biến đổi tất cả các phần tử của mảng theo một cách nào đó. Giá trị trả về của bản đồ là một mảng khác có các phần tử được chuyển đổi.
Lưu ý:cú pháp này yêu cầu Ruby 1.9+ và nó tương đương với:
ascii = "test".chars.map { |c| c.ord }
Vì chúng tôi muốn biến mọi chữ cái thành giá trị ASCII tương ứng của nó, chúng tôi gọi là ord trên mọi phần tử của mảng.
Trong ví dụ của chúng tôi, đầu ra sẽ là:
[116, 101, 115, 116]
Thời gian xoay vòng
Tuyệt vời!
Bước tiếp theo là thêm số vòng quay mà chúng ta muốn. Chúng tôi có thể thực hiện việc này bằng cách sử dụng bản đồ một lần nữa:
shifted = ascii.map { |c| c + 5 } => [121, 106, 120, 121]
Bây giờ chúng ta chỉ có thể chuyển các số về dạng chữ cái và nối chúng lại với nhau, điều này sẽ cung cấp cho chúng ta chuỗi được mã hóa:
shifted.map { |c| c.chr }.join => "yjxy"
Để truy xuất chuỗi ban đầu, tất cả những gì chúng ta phải làm là áp dụng lại quy trình tương tự, nhưng lần này chuyển sang trái.
Điều quan trọng là phải thay đổi theo cùng số lượng vị trí mà chúng tôi đã sử dụng ban đầu; nếu không, chúng tôi sẽ không khôi phục dữ liệu ban đầu của mình.
Mã cuối cùng &các phiên bản thay thế
Bạn có thể tìm thấy mã hoàn chỉnh của caesar tại đây.
Nó tạo ra tất cả 26 lần lặp có thể có cho một chuỗi nhất định và nó cũng xử lý gói (các ví dụ trong bài thì không).
Ngoài ra còn có một phiên bản thay thế sử dụng Array # xoay
Bạn cũng có thể thích:
Định dạng chuỗi Ruby