Tôi cần một cách để ánh xạ một số văn bản có thể in sang văn bản có thể in khác. Ví dụ.:
Ian Boyd
â Kcp Zbas
Lưu ý một số yêu cầu quan trọng:
- chữ hoa là chữ hoa trong đầu ra
- chữ thường trong đầu vào là chữ thường trong đầu vào
- không gian (và bất cứ thứ gì khác bên ngoài A-Z0-9) được để yên
Yêu cầu bổ sung là nó được xác định, đó là cùng một đầu vào luôn cho cùng một đầu ra:
Ian Boyd
â Xbas Kcp
Ian Boyd
â Xbas Kcp
Ian Boyd
â Xbas Kcp
Yêu cầu khác mở rộng về thuyết xác định và tôi không biết gọi nó là gì ngoại trừ việc nói rằng các từ có tiền tố chung cần phải có cùng một đầu ra cho cùng một tiền tố chung:
Tôi
â K
tôi
â Kc
Ian
â Kcp
Ian
â Kcp
Ian B
â Kcp X
Ian Bo
â Kcp Xb
Ian Boy
â KcpXba
Ian Boyd
â Kcp xbap
Giải pháp của tôi
Tôi đã tạo ra một giải pháp cho những yêu cầu kỹ thuật này 15 năm trước; nhưng tôi đang cố gắng xem lại nó một số thứ "tốt hơn".
giải pháp của tôi là một "một mật mã Caesar trực tuyến với chuỗi".
Tạo một sự thay thế caesar đơn giản:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26
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
F H U D I R Y E K C Z N S A B G J P V O W T L M Q X
Nhưng thay vì một sự thay thế đơn giản:
thay vào đó tôi đã sử dụng chuỗi:
Trạng thái trước Tổng ký tự hiện tại (mod) Đầu ra ký tự tiếp theo
-------------- ----------------- ---------- --------- ----- --------------------
0 Tôi (9) 9 K K
9 a (1) 10 c Kc
10 n (14) 24 p Kcp
24 B (2) 26 X Kcp X
26 o (15) 15 b Kcp Xb
15 y (25) 14 a Kcp Xba
14 d (4) 18 m Kcp Xbap
Giải pháp tốt hơn với băm?
Những giá trị này không phải là thứ tôi cần (hoặc muốn) "giải mã"và việc sử dụng mật mã caesar ngụ ý khả năng giải mã (điều mà tất cả chúng ta đều biết là không khó đến thế).
Vì vậy, về mặt khái niệm tôi thực sự muốn một "chức năng một chiều": một cái gì đó mà:
- chuyển đổi đầu vào
- đến một số đầu ra không thể đoán trước
- một cách xác định
Tôi nghĩ: điều gì sẽ xảy ra nếu tôi sử dụng thuật toán băm, thêm từng chữ cái một và nhận được giá trị hiện tại "tiểu bang"và chuyển đổi thông báo một phần đó thành một ký tự (chữ hoa/chữ thường/chữ số phù hợp để khớp với đầu vào):
Chuỗi FrobTheGrobber(Đầu vào chuỗi)
{
// bằng chứng về mã giả khái niệm chỉ xử lý chữ hoa
HashAlgorithm hash = new SHA256();
hash.AddBytes(SECRET_KEY);
Chuỗi res = "";
cho Char ch trong đầu vào
{
băm.Add(ch);
int charCode = (hash.Hash[0] % 26) + 1; // sử dụng byte đầu tiên, mod 26 để nhận giá trị từ 0..25
res += Char(Ord('A') + charCode;
}
}
Tôi biết; bạn ghét yêu cầu.
Bất cứ ai có thể điều gì tốt hơn?