ROT13 [rotate by 13 places] - Là 1 kiểu mã hóa thay thế [substitution cipher].
26 chữ cái A-Z và 26 chữ cái a-z được chia làm đôi [13], và đặt tương ứng nhau.
Các chữ cái của bản rõ [bản chưa mã hóa], sẽ được thay thế lại theo đúng thứ tự tương ứng của bảng chữ cái đã đặt ra. để tạo thành bản đã được mã hóa [bản mờ].
Minh họa cho dễ hiểu
Bảng chữ cái chia làm đôi thành 2 hàng, mỗi hàng 13 chữ cái.
A B C D E F G H I J K L M
| | | | | | | | | | | | |
N O P Q R S T U V W X Y Z
Muốn viết chữ HUNGXON theo thứ tự trên ta có:
H ứng với U
U ------- H
N ------- A
G ------- T
X ------- K
O ------- B
N ------- A
Tương tự với các chữ cái in thường
a b c d e f g h i j k l m
| | | | | | | | | | | | |
n o p q r s t u v w x y z
Để mã hóa toàn bảng chữ cái thì ghép 2 dãy với nhau:
A B C D E F G H I J K L M a b c d e f g h i j k l m
N O P Q R S T U V W X Y Z n o p q r s t u v w x y z
Thuật toán:
Ta tạo 2 mảng:
mảng [a]: ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz
mảng [b]: NOPQRSTUVWXYZABCDEFGHIJKLMnopqrstuvwxyzabcdefghijklm
2 mảng này có sự đối xứng với nhau theo mẫu nhé A-N, N-A, b-o, o-b ...
Ở vị trí 1 của 2 mảng là A-N thì ở vị trí khác phải là N-A thì lúc decode không bị sai :D
chuỗi cần mã hóa: HUNGxon
H ở vị trí 8 trong mảng [a], ứng với vị trí số 8 mảng [b] là U
Vậy H thay
bằng U
Tương tự như vậy ta được chuỗi mã hóa: UHATkba
Để giải mã cũng so sánh vậy:
[a] -- [b]
U ----- H
H ----- U
A ----- N
T ----- G
k ----- x
b ----- o
a ----- n
Code php
Trong PHP có thể dùng hàm strstr[] để so sánh và thay thế:
function rot13[$str] {
$a = "NOPQRSTUVWXYZnopqrstuvwxyzABCDEFGHIJKLMabcdefghijklm0123456789";
$b = "ABCDEFGHIJKLMabcdefghijklmNOPQRSTUVWXYZnopqrstuvwxyz5678901234"
return strtr[$str, $a, $b];
}
Mở rộng
Có thể thêm vào các ký tự [email protected]#$%^&[]* hoặc đảo sự hoán đổi các phần tử nhưng
phải
đảm bảo tính đối xứng.
Kiểu như:
[email protected]#$%^&*[]_+{}":?>