ฉันต้องการวิธีจับคู่ข้อความที่พิมพ์ได้กับข้อความที่พิมพ์ได้อื่นๆ เช่น.:
เอียน บอยด์
â เคซีพี ซบาส
สังเกตข้อกำหนดที่สำคัญบางประการ:
- ตัวพิมพ์ใหญ่เป็นตัวพิมพ์ใหญ่ในเอาต์พุต
- ตัวพิมพ์เล็กในการป้อนข้อมูลเป็นตัวพิมพ์เล็กในการป้อนข้อมูล
- เว้นวรรค (และอย่างอื่นนอก A-Z0-9) ไว้ตามลำพัง
ข้อกำหนดเพิ่มเติมก็คือว่า กำหนดนั่นคืออินพุตเดียวกันจะให้เอาต์พุตเดียวกันเสมอ:
เอียน บอยด์
â เคซีพี เอ็กซ์บาส
เอียน บอยด์
â เคซีพี เอ็กซ์บาส
เอียน บอยด์
â เคซีพี เอ็กซ์บาส
ข้อกำหนดอื่น ๆ ขยายขอบเขตออกไป และฉันไม่รู้ว่าจะเรียกมันว่าอะไร ยกเว้นการพูดว่าคำที่มีคำนำหน้าทั่วไปต้องมีผลลัพธ์เดียวกันสำหรับคำนำหน้าทั่วไปเดียวกัน:
ฉัน
â เค
เอีย
â Kc
เอียน
â กพ
เอียน
â กพ
เอียน บี
â เคซีพี เอ็กซ์
เอียน โบ
â เคซีพี เอ็กซ์บี
เอียน บอย
â เคซีพี เอ็กซ์บา
เอียน บอยด์
â เคซีพี เอ็กซ์บัป
ทางออกของฉัน
ฉันสร้างโซลูชันสำหรับข้อกำหนดทางเทคนิคเหล่านี้เมื่อ 15 ปีก่อน แต่ฉันกำลังพยายามทบทวนบางสิ่งอีกครั้ง "ดีกว่า".
วิธีแก้ปัญหาของฉันคือ "การเข้ารหัสซีซาร์แบบสตรีมมิ่งพร้อมการผูกมัด".
สร้างการทดแทนซีซาร์อย่างง่าย:
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
แต่แทนที่จะเป็นการทดแทนอย่างง่าย:
ฉันใช้การผูกมัดแทน:
สถานะก่อนหน้า ผลรวมอักขระปัจจุบัน (mod) เอาต์พุตอักขระถัดไป
-------------- ----------------- ---------- --------- ----- --------------------
0 I (9) 9 K K
9 a (1) 10 c Kc
10 น. (14) 24 น. Kcp
24 B (2) 26 X Kcp X
26 o (15) 15 b Kcp Xb
15 ปี (25) 14 ปี Kcp Xba
14 d (4) 18 ม. Kcp Xbap
วิธีแก้ปัญหาที่ดีกว่าด้วยการแฮช?
ค่าเหล่านี้ไม่ใช่สิ่งที่ฉันต้องการ (หรือต้องการ) "ถอดรหัส"และการใช้รหัสซีซาร์แสดงถึงความสามารถในการถอดรหัส (ซึ่งเราทุกคนรู้ว่าไม่ใช่เรื่องยาก)
ตามแนวคิดแล้วฉันต้องการ "ฟังก์ชันทางเดียว": สิ่งที่:
- แปลงอินพุต
- ไปสู่ผลลัพธ์ที่คาดเดาไม่ได้
- กำหนด
ฉันคิดว่า: จะเกิดอะไรขึ้นถ้าฉันใช้อัลกอริทึมแฮช เพิ่มตัวอักษรทีละตัว และรับค่าปัจจุบัน "สถานะ"และแปลงไดเจสต์บางส่วนนั้นเป็นอักขระ (ตัวพิมพ์ใหญ่/ตัวพิมพ์เล็ก/หลักตามความเหมาะสมเพื่อให้ตรงกับอินพุต):
สตริง FrobTheGrobber (อินพุตสตริง)
{
// การพิสูจน์รหัสเทียมแนวคิดที่จัดการเฉพาะตัวพิมพ์ใหญ่
แฮชอัลกอริทึมแฮช = ใหม่ SHA256();
แฮช AddBytes (SECRET_KEY);
สตริง res = "";
สำหรับ Char ch ในการป้อนข้อมูล
{
hash.Add(ch);
int charCode = (hash.Hash[0] % 26) + 1; // ใช้ไบต์แรก mod 26 เพื่อรับค่าจาก 0..25
res += Char(Ord('A') + charCode;
}
}
ฉันรู้; คุณเกลียด ความต้องการ.
ทุกคนสามารถสิ่งที่ดีกว่า?