การทำให้ การค้นหาแบบไบนารี เป็นข้อมูลทั่วไปในมิติที่สูงขึ้น

การค้นหาแบบไบนารี สวัสดีทุกคน ตอนนี้ฉันกำลังพักร้อนอยู่ที่อารูบา ดำน้ำดูปะการัง ออกไปเที่ยวกับครอบครัว และทำงานบางอย่างเกี่ยวกับ kindle scribe ที่ฉันได้รับในวันคริสต์มาส อาลักษณ์เป็นสิ่งทดแทนกระดาษที่ยอดเยี่ยม และฉันก็กำลังขุดมันอยู่ ฉันใช้มันบ่อยในขณะที่ทำงานผ่านสิ่งต่างๆ ในโพสต์นี้ แต่ฉันยังใช้มันกับผู้พัฒนาเกม C++ โดยไม่มีหนังสือกราฟิกที่ฉันกำลังทำอยู่ ฉันจะต้องหาวิธีส่งออกหน้าเพื่อสร้างไดอะแกรมที่ดีขึ้นสำหรับบล็อกโพสต์ในอนาคต (;

อย่างไรก็ตาม ฉันเลิกเล่นทวิตเตอร์แล้วย้ายไปที่มาสโตดอน ฉันอยู่ที่นี่แล้วถ้าคุณอยากติดตามฉัน: https://mastodon.gamedev.place/@demofox

ฉันเพิ่งเล่น battleship กับลูกชายของฉันและคิดว่าการเลือกตำแหน่งที่จะยิงนั้นเหมือนกับการสุ่มตัวอย่างฟังก์ชัน 2d แบบไบนารี่ที่ให้ผลตอบแทน 1 สำหรับการตีหรือ 0 สำหรับการพลาด มีความละเอียดอ่อนมากกว่านี้เนื่องจากมีเรือที่มีความยาวต่างกัน ดังนั้นคุณสามารถรับข้อมูลเพิ่มเติมได้เมื่อเวลาผ่านไป แต่มันทำให้ฉันนึกถึงรูปแบบการยิงในอุดมคติเมื่อค้นหาเรือข้าศึก

ฉันได้ข้อมูลบางอย่างจากมาสโตดอนและพบลิงค์ที่น่าสนใจ

แต่แล้วฉันก็มีความคิดที่แตกต่าง: การค้นหาไบนารีสามารถสรุปจากอาร์เรย์ 1D เป็นอาร์เรย์ 2D หรือสูงกว่าได้หรือไม่ ถ้าเป็นเช่นนั้นพวกเขาจะต้องได้รับการจัดเรียง การจัดเรียงอาร์เรย์ 2 มิติหมายความว่าอย่างไร ไม่น่าแปลกใจเลย ฉันไม่ใช่คนแรกที่คิดเรื่องนี้ และฉันจะเชื่อมโยงไปยังแหล่งข้อมูลบางอย่าง ถึงกระนั้น การเดินทางก็น่าสนใจ และฉันมีโค้ดบางส่วนที่ใช้การค้นหาไบนารีมิติที่สูงกว่า:

โค้ดนี้เขียนขึ้นเพื่อให้อ่านง่าย/เข้าใจได้ ดังนั้นจึงใช้การเรียกซ้ำ ซึ่งในความเป็นจริงแล้วคุณจะไม่ทำเช่นนั้น โดยเฉพาะอย่างยิ่งสำหรับกรณีการค้นหาแบบไบนารี 1 มิติ

การเรียงลำดับ

การแก้ปัญหาการเรียงลำดับก่อนอื่น คุณสามารถทำให้อาร์เรย์ 2 มิติ (หรือสูงกว่า) แบนราบเป็นอาร์เรย์ 1 มิติเหมือนกับที่วางไว้ในหน่วยความจำแล้วจัดเรียง จากนั้นคุณจะทำการค้นหาแบบไบนารี 1 มิติ แต่นั่นไม่ได้ให้ประโยชน์ด้านมิติที่สูงกว่าแก่คุณ การค้นหาแบบไบนารี

ใช้แนวคิดจาก heps คุณสามารถจัดเรียงบางส่วนเพื่อให้ค่าทางด้านขวาและด้านล่างมากกว่าหรือเท่ากับค่าปัจจุบันในทุกตำแหน่ง และนั่นคือสิ่งที่ฉันจะทำ

ฉันลองพยายามคิดค้นอัลกอริทึมการเรียงลำดับสำหรับสิ่งนี้อยู่พักหนึ่งก่อนที่จะพบว่าคุณสามารถจัดเรียงแถวแกน X ทั้งหมด จากนั้นตามด้วยคอลัมน์แกน Y ทั้งหมด และคุณก็จะได้สิ่งนี้ สำหรับ 3D ขึ้นไป คุณยังคงจัดเรียงแกนใหม่แต่ละแกนต่อไป

มันเจ๋งมาก ดูเหมือนว่าการเรียงลำดับจะได้รับการแก้ไข แต่สิ่งนี้มีประโยชน์หรือไม่ สิ่งนี้ช่วยคุณค้นหาหรือไม่

ลองใช้มุมมองต้นไม้ / กราฟ

ครั้งแรกที่ฉันพยายามมองว่านี่เป็นต้นไม้ที่มีค่ามีลูกสองคน ค่าทางด้านขวาและค่าด้านล่าง เมื่อทำเช่นนี้ ฉันสังเกตเห็นว่าต้นไม้ไม่ใช่ต้นไม้ แต่เป็นกราฟ เนื่องจากค่าเกือบทั้งหมดมีพาเรนต์สองตัว สิ่งที่ดีคือเนื่องจากอาร์เรย์ N-dimensional สามารถจัดเก็บไว้ในหน่วยความจำเป็นอาร์เรย์ 1 มิติ (เนื่องจากนั่นคือวิธีการทำงานของหน่วยความจำ) กราฟนี้สามารถใช้ประโยชน์จากสิ่งนั้นและไม่ต้องการตัวชี้ใด ๆ โดยการเชื่อมโยงระหว่างพ่อแม่และลูกเป็นนัย ( บวก 1 ถึง x เพื่อให้ได้ลูก 1 คน บวก 1 เข้ากับ y เพื่อให้ได้ลูกอีกคน)

ยังไม่แน่ใจว่ามีประโยชน์หรือไม่ แต่จนถึงขณะนี้มีแนวโน้มที่ดี!

ในการค้นหาโครงสร้างนี้ ฉันลองค้นหาเชิงลึกก่อนและพบว่าต้องใช้เวลาอ่านหลายครั้งระหว่างการค้นหา เกือบแย่พอๆ กับการค้นหาเชิงเส้น ส่วนใหญ่เป็นเพราะเด็กมีพ่อแม่หลายคน คุณจะค้นหากราฟย่อยเดียวกันซ้ำซ้อน ฉันวางแผนที่จะเพิ่ม “ดัชนีเวอร์ชันการค้นหา” ในแต่ละค่า เขียนดัชนีนี้เมื่อทดสอบโหนดกราฟ และอ่าน/เรียกซ้ำผ่านโหนดกราฟที่มีหมายเลขเวอร์ชันน้อยกว่าเท่านั้น ซึ่งหมายเลขเวอร์ชันนี้จะเพิ่มขึ้นทุกครั้งที่ทำการค้นหา

ก่อนที่ฉันจะทำตามนั้น ฉันมีความคิดที่ฟังดูดีมากกว่า

กลับไปที่มุมมอง Flat Array

คุณสามารถค้นหาไบนารีในคอลัมน์แรกเพื่อดูว่าค่าใดมีค่ามากกว่าสิ่งที่คุณค้นหาและตัดส่วนใหญ่ของอาร์เรย์ออกหรือไม่ หากคุณสามารถตัดจุดเริ่มต้นออกได้ คุณจะมีขอบเขตขั้นต่ำและสูงสุดในการค้นหา น่าเสียดายที่จำนวนแถวจะผันแปร ซึ่งไม่ดีนักที่จะได้ผลลัพธ์ที่สมบูรณ์แบบอย่างสม่ำเสมอ แต่อย่างน้อยคุณก็สามารถค้นหาแบบไบนารีในแต่ละแถวเพื่อค้นหาค่าของคุณได้ บางทีคุณอาจทำการค้นหาแบบไบนารีข้ามคอลัมน์และสร้างกรอบขอบที่จัดแนวแกนเพื่อค้นหา

แม้จะมีคุณสมบัติที่ดีอยู่บ้าง แต่วิธีการแก้ปัญหานั้นก็ยังไม่ดีพอ มันแปรผันเกินไปว่าจะต้องค้นหาด้วยวิธีที่ล้าสมัยมากเพียงใด ซึ่งหมายถึงเวลาดำเนินการที่ผันแปรและไม่ได้ผลประโยชน์ที่สม่ำเสมอ

วิธีที่ดีกว่าในการดูสิ่งต่าง ๆ มาจากการตระหนักว่าองค์ประกอบใด ๆ ในหนึ่งในอาร์เรย์ 2d เหล่านี้ สิ่งใดก็ตามที่มีค่าพิกัด x และ y สูงกว่าหรือเท่ากับจะมากกว่าหรือเท่ากับองค์ประกอบนั้นในค่า นอกจากนี้ อะไรก็ตามที่มีค่าพิกัด x และ y ต่ำกว่าหรือเท่ากันจะน้อยกว่าหรือเท่ากับองค์ประกอบนั้น สิ่งนี้ทำให้สามารถแบ่งสไตล์การค้นหาแบบไบนารีและพิชิตอัลกอริทึมได้

เปรียบเทียบองค์ประกอบตรงกลางของอาร์เรย์ 2 มิติกับค่าการค้นหา หากมีค่าเท่ากัน แสดงว่าการค้นหาของคุณเสร็จสิ้น

หากองค์ประกอบตรงกลางน้อยกว่าค่าการค้นหา คุณทราบดีว่าค่าการค้นหาไม่สามารถอยู่ในควอแดรนท์ที่ดัชนี x และ y เท่ากันหรือน้อยกว่า เนื่องจากค่าทั้งหมดมีค่าเท่ากันหรือน้อยกว่า

ถ้าองค์ประกอบตรงกลางมากกว่าค่าการค้นหา คุณรู้ว่าค่าการค้นหาไม่สามารถอยู่ในควอแดรนท์ที่ดัชนี x และ y เท่ากันหรือมากกว่า เนื่องจากค่าเหล่านี้มีค่าเท่ากันหรือมากกว่า

เมื่อคุณลบควอแดรนท์ออก คุณจะเหลือสี่เหลี่ยมสองอันสำหรับวนซ้ำ

คุณทำขั้นตอนนี้ต่อไปจนกว่าคุณจะพบค่าการค้นหาและส่งคืนค่าจริง หรือพื้นที่ของพื้นที่การค้นหาเป็นศูนย์ หมายความว่าไม่พบค่านั้นและส่งคืนค่าเท็จ

อาร์เรย์ 3 มิติและสูงกว่า

แนวคิดเหล่านี้สรุปเป็น 3 มิติโดยที่คุณทำการเรียงลำดับสามแกนของอาร์เรย์ 3 มิติเพื่อเริ่มต้น

เช่นเดียวกับกรณีอาร์เรย์ 2 มิติ จากนั้นคุณทดสอบองค์ประกอบตรงกลางกับคีย์ค้นหาและทำเสร็จแล้ว ลบออกเทนต์ค่าต่ำที่สัมผัส (0,0,0) หรือลบออกเทนต์ค่าสูงที่สัมผัส (ความกว้าง ความสูง , ความลึก).

ในกรณี 2 มิติ การลบควอแดรนท์ทำให้เรามีสี่เหลี่ยมสองรูปเพื่อเรียกซ้ำ ในกรณี 3 มิติ การถอดแปดเหลี่ยมออกทำให้เรามีคิวบอยด์สามลูกเพื่อเรียกซ้ำ การค้นหาแบบไบนารี

สิ่งนี้ทำให้ภาพรวมเป็น 4D ขึ้นไปได้ดี โดยทำตามรูปแบบของมิติที่ต่ำกว่า

คุณสมบัติด้านประสิทธิภาพ

ใน 1D อัลกอริทึมนี้เป็นการค้นหาแบบไบนารีที่คุณทิ้งครึ่งซ้ายหรือขวาของอาร์เรย์หลังจากเปรียบเทียบองค์ประกอบตรงกลางกับคีย์ค้นหา แต่ละขั้นตอนจะลบ 1/2 ของค่าออกจากการพิจารณา

ในแบบ 2 มิติ อัลกอริทึมนี้จะโยนควอแดรนท์ที่มีค่าต่ำกว่าหรือควอแดรนท์ที่มีค่าสูงกว่าออกไปในแต่ละขั้นตอน แต่ละขั้นตอนจะลบ 1/4 ของค่าออกจากการพิจารณา

3D พ่นค่าแปดหรือ 1/8 ของค่าจากการพิจารณาในแต่ละขั้นตอน

เรากำลังเผชิญกับคำสาปแห่งมิติและได้รับผลตอบแทนที่ลดลง ทิ้ง 1 / (2^D) ในแต่ละขั้นตอนสำหรับการค้นหาไบนารีมิติ

สิ่งนี้ยังแสดงให้เห็นว่าอัลกอริทึมมีประสิทธิภาพมากที่สุดใน 1D เช่นเดียวกับการค้นหาแบบไบนารี โดยค่าครึ่งหนึ่งจะถูกลบออกจากการพิจารณาในแต่ละขั้นตอน

มีวิธีใดที่จะช่วยได้บ้าง? เราสามารถจัดเรียงอาร์เรย์เพื่อเพิ่มค่าในแต่ละขั้นตอนได้หรือไม่ ไม่แน่ใจ.

Face-sso (By K&O) หากท่านสนใจ เครื่องสแกนใบหน้ารุ่นต่างๆ หลากหลายรุ่น หรือ ติดตั้งระบบสแกนใบหน้า สามารถติดต่อสอบถามได้โดยตรง เรามีแอดมินคอยคอบคำถาม 24 ชั้วโมงที่ Line OA เครื่องสแกนใบหน้า สามารถ ขอราคาพิเศษได้ ตามงบประมาณที่เหมาะสม สอบถามได้สบายใจทั้ง เรื่องค่าบริการ ราคา และ งบประมาณ มั่นใจเพราะเป็นราคาที่สุด คุ้มค่าที่สุด

หากท่านมีความสนใจ บทความ หรือ Technology สามารถติดต่อได้ตามเบอร์ที่ให้ไว้ด้านล่างนี้
Tel.086-594-5494
Tel.095-919-6699

one-time pad ความ ลับที่สมบูรณ์แบบ หากใช้งานอย่างเหมาะสม

one-time pad (OTP) เป็นอัลกอริธึมการเข้ารหัสที่ให้ ความ ลับที่สมบูรณ์แบบ หากใช้งานอย่างเหมาะสม แป้น ซึ่งโดยพื้นฐานแล้วเป็นคีย์ที่มีความยาวเท่ากับข้อความ จะต้องใช้เพียงครั้งเดียว (ดังนั้นชื่อนี้) จึงเก็บเป็นความลับ และส่วนที่ยากจะสร้างขึ้นโดยใช้วิธีการสุ่มอย่างแท้จริง มันทำงานโดยXORการรวมแพดและข้อความเข้าด้วยกัน ซึ่งทำให้ไซเฟอร์เท็กซ์แยกไม่ออกจากข้อมูลที่สร้างขึ้นแบบสุ่ม

ฉันต้องการให้ชัดเจนกับข้อกำหนดที่นี่ แผ่นแบบครั้งเดียวไม่ใช่ “สุ่ม” ตัวเลขไม่สุ่ม ไม่ใช่แค่จำนวนทรัพย์สินเท่านั้นที่สามารถมีได้ เพื่อความอวดรู้ สิ่งที่สุ่มคือวิธีการสร้างตัวเลข คิดว่า “ตัวสร้างตัวเลขสุ่ม” ไม่ใช่ “ตัวสร้างตัวเลขสุ่ม”

ตัวสร้างตัวเลขสุ่มหลอก (PRNG) เช่นเดียวกับที่คอมพิวเตอร์ของคุณใช้เพื่อสร้างตัวเลขแบบสุ่มสำหรับเกมจะไม่ทำงานที่นี่ คอมพิวเตอร์ของคุณถูกกำหนดขึ้นอย่างไม่ตั้งใจและไม่สามารถเป็นตัวสร้างตัวเลขสุ่มที่แท้จริงได้ด้วยตัวมันเอง PRNGs แสดงรูปแบบและวนซ้ำในที่สุด โดยคายตัวเลขเดียวกันในลำดับเดียวกับตอนที่เริ่มต้น เมื่อแผ่นถูกสร้างขึ้นแบบสุ่ม แต่ละบิตในแผ่นจะเป็น อิสระทางสถิติจากทุก ๆ บิต นั่นคือ ค่าหนึ่งของหนึ่งบิตไม่มีผลกับค่าของบิตอื่น ด้วยเหตุนี้ ข้อความไซเฟอร์ที่เข้ารหัสจากแพดแบบใช้ครั้งเดียวจึงมีแนวโน้มที่จะถอดรหัสเป็นข้อความธรรมดาใดๆ ที่มีความยาวเท่ากันได้เท่าๆ กัน สิ่งนี้ทำให้มันมีภูมิคุ้มกันต่อการโจมตีแบบเดรัจฉาน บิตใน PRNG ไม่เป็นอิสระทางสถิติ ทำให้พวกเขาเสี่ยงต่อการถูกโจมตี ถ้าคุณรู้ค่าของคีย์หนึ่งบิต คุณก็จะรู้บางอย่างเกี่ยวกับบิตอื่นๆ ในคีย์ด้วย

โดยทั่วไป ทั้งสองฝ่ายที่ต้องการสื่อสารโดยใช้แพดแบบใช้ครั้งเดียวจะแลกเปลี่ยนแพดขนาดใหญ่ เช่น ซีดีที่เต็มไปด้วยข้อมูลที่สร้างขึ้นแบบสุ่มก่อนที่ฝ่ายใดฝ่ายหนึ่งจะเดินทางไปที่อื่น เช่น ประเทศอื่น ซึ่งข้อมูลต้องถูกส่งกลับอย่างปลอดภัย . เมื่อมีการใช้ไบต์จากแพด ไบต์เหล่านั้นจะถูกทำลายและไม่ถูกนำมาใช้อีก หากแพดมีความยาว 100kB จะสามารถส่งข้อมูลได้สูงสุด 100kB เท่านั้นอย่างปลอดภัย เช่นเดียวกับรูปแบบการเข้ารหัสส่วนใหญ่ การจัดการคีย์เป็นหนึ่งในส่วนที่ยากที่สุด

ฉันได้เตรียมโปรแกรม C ง่ายๆ สำหรับเข้ารหัสข้อความโดยใช้แพดแบบใช้ครั้งเดียว (ลิงก์ดาวน์โหลดที่ด้านบน) มันเข้ารหัสstdinโดยใช้แผ่นแบบครั้งเดียวที่ให้ไว้ในไฟล์ที่ระบุเป็นอาร์กิวเมนต์แรก Ciphertext ถูกส่งไปstdoutที่ โบนัสเพิ่มเติม เมื่อมีการระบุอาร์กิวเมนต์ที่สอง บิตที่ใช้ของคีย์จะถูกเขียนลงในไฟล์ที่ระบุในชื่อไฟล์ที่สอง ฉันจะแสดงให้คุณเห็นว่าทำไมฉันถึงเพิ่มสิ่งนี้ในอีกสักครู่

สมมติว่าคุณมีไฟล์ข้อมูลแบบสุ่มrandom.dataเป็นแพดแบบใช้ครั้งเดียวเพื่อใช้ในการเข้ารหัสซอร์สโค้ดสำหรับโปรแกรมนี้

otp สุ่มข้อมูล < otp.c > otp.c.otp

หากคุณแชร์แพดrandom.dataกับเพื่อนซึ่งคุณกำลังพยายามสื่อสารด้วย เธอสามารถถอดรหัสมันได้ด้วยคำสั่งที่คล้ายกัน

otp สุ่มข้อมูล < otp.c.otp > otp.c

random.dataมีขนาดเพียง 207kB ดังนั้นข้อความของคุณจะยาวกว่านั้นไม่ได้ นอกจากนี้ เมื่อส่ง 207kB แล้ว คุณต้องเปลี่ยนแพดใหม่ก่อนที่จะส่งไซเฟอร์เท็กซ์เพิ่มเติมได้ หากคุณนำแพดของคุณกลับมาใช้ใหม่ แสดงว่าคุณประนีประนอมต่อความปลอดภัยของไซเฟอร์เท็กซ์ใหม่และไซเฟอร์เท็กซ์เก่า one-time pad

เหตุผลที่ฉันระบุตัวเลือกที่สองคือ: คุณสามารถใช้งาน/dev/randomได้โดยตรงโดยไม่ทำแผ่นรองหาย (สมมติว่าคุณมีระบบปฏิบัติการที่มีเครื่องหมาย/dev/randomเหมือนกับระบบปฏิบัติการทั่วไปทุกประการ)

#เข้ารหัส
otp /dev/random Random.pad < otp.c > otp.c.otp

#ถอดรหัส
otp random.pad < otp.c.opt > otp.c

นี่เป็นเพียงเชิงวิชาการเท่านั้น เนื่องจากโดยทั่วไปแล้วแพดแบบครั้งเดียวจะถูกแลกเปลี่ยนก่อนที่จะมีข้อความธรรมดา มิเช่นนั้นคุณก็สามารถแลกเปลี่ยนข้อความธรรมดาได้ตามปกติเมื่อคุณแลกเปลี่ยนแพดแบบครั้งเดียวตามปกติ! นอกจากนี้/dev/randomยังช้า มันสร้างตัวเลขโดยใช้เสียงรบกวนจากสิ่งแวดล้อมซึ่งมีให้ที่หยดเท่านั้น หากคุณต้องการเข้ารหัสข้อความขนาด 1MB อาจใช้เวลาหลายวัน ด้วยข้อความสั้นๆ คุณสามารถเร่งความเร็วได้ด้วยการเลื่อนเมาส์ไปรอบๆ หรือบดแป้นพิมพ์ (สิ่งนี้อาจสนุก)

เพิ่มเติมเกี่ยวกับแผ่นแบบใช้ครั้งเดียวต่อไป โดยเฉพาะอย่างยิ่งฉันจะนำเสนอเคล็ดลับสองประการ: วิธีที่ได้ผลและวิธีที่ไม่ได้ผล

ใน โพสต์ ที่ แล้ว ฉันได้พูดถึงแผ่นแบบใช้ครั้งเดียว ข้อมูลสำหรับโพสต์นี้มาจาก Applied Cryptography ของ Bruce Schneier (ส่วนที่ 10.8)

แผ่นรองแบบใช้ครั้งเดียวนั้นยอดเยี่ยมสำหรับสิ่งที่เรียกว่าการ ปฏิเสธที่เป็นไปได้ ด้วยการปฏิเสธที่สมเหตุสมผล เมื่อบุคคลที่เก็บข้อมูลที่เข้ารหัสถูกบีบบังคับให้ถอดรหัสข้อมูล ผู้ซักถามจะไม่สามารถบอกได้ว่าบุคคลนั้นปฏิบัติตามคำสั่งถอดรหัสหรือไม่ ตัวอย่างเช่น เหยื่อสามารถให้คีย์สำรองที่ถอดรหัสข้อความรหัสเป็นข้อความธรรมดาจำลองที่ไม่เป็นอันตราย เพื่อทำให้สิ่งนี้น่าเชื่อถือมากขึ้น ข้อความธรรมดาอาจเป็นสิ่งที่น่าอาย เช่น ภาพอนาจารหรือจดหมายรักลับๆ

เรามีแผ่นแบบใช้ครั้งเดียวKข้อความธรรมดา ข้อความธรรมดาPจำลอง (ภาพอนาจารหรือจดหมายรัก) Dคีย์จำลองK'และข้อความCเข้ารหัส ด้านล่าง ฉันแสดง XOR ด้วย^.

ในการเข้ารหัสข้อความธรรมดาของเรา ซึ่งเป็นอัลกอริทึมแพดแบบใช้ครั้งเดียวตามปกติ

P ^ K = C

Bob และ Alice ใช้ K ร่วมกัน ดังนั้นการถอดรหัสจึงทำงานเหมือน

C^K = พี

อย่างไรก็ตาม ตำรวจลับมาพร้อมกับ ตะปูควง ของพวกเขา และเรียกร้องให้อลิซและบ็อบมอบแผ่นรองแบบใช้ครั้งเดียวให้พวกKเขา พวกเขาจะจัดหาให้K'แทน K ถูกกำหนดอย่างไร? แบบนี้,

K' = C^D

เนื่องจากKเป็นแพดแบบใช้ครั้งเดียวและสร้างขึ้นแบบสุ่ม จึงไม่มีทางพิสูจน์ได้ว่าไม่ใช่K'คีย์จริง อลิซและบ็อบยอมแพ้ ตำรวจลับถอดรหัสมัน K'

C^K' = C^C^D = D

“เห็นไหม เราแค่เก็บเรื่องรัก ๆ ใคร่ ๆ ไว้เป็นความลับจากคู่ครองของเรา!”

Face-sso (By K&O) หากท่านสนใจ เครื่องสแกนใบหน้ารุ่นต่างๆ หลากหลายรุ่น หรือ ติดตั้งระบบสแกนใบหน้า สามารถติดต่อสอบถามได้โดยตรง เรามีแอดมินคอยคอบคำถาม 24 ชั้วโมงที่ Line OA เครื่องสแกนใบหน้า สามารถ ขอราคาพิเศษได้ ตามงบประมาณที่เหมาะสม สอบถามได้สบายใจทั้ง เรื่องค่าบริการ ราคา และ งบประมาณ มั่นใจเพราะเป็นราคาที่สุด คุ้มค่าที่สุด

หากท่านมีความสนใจ บทความ หรือ Technology สามารถติดต่อได้ตามเบอร์ที่ให้ไว้ด้านล่างนี้
Tel.086-594-5494
Tel.095-919-6699

การ เข้ารหัสแผ่นครั้งเดียวด้วย QR และ JAVASCRIPT พื้นฐาน

เข้ารหัสแผ่นครั้งเดียวด้วย QR การเข้ารหัสแพดแบบครั้งเดียวให้ความปลอดภัยที่ไม่แตกหัก* หากคุณสามารถรับประกันการสร้างตัวเลขสุ่มอย่างแท้จริง และความปลอดภัยของแพดที่สร้างขึ้น การใช้งานจากมุมมองของคนธรรมดาที่เข้ารหัสเป็นวิธีที่สนุกในการเรียนรู้เพิ่มเติมเกี่ยวกับมัน และสามารถเพิ่มชั้นความปลอดภัยพิเศษให้กับการสื่อสารที่ละเอียดอ่อนที่สุดของคุณ

รูปแบบของแพดแบบใช้ครั้งเดียวที่ใช้โดยสำนักงานความมั่นคงแห่งชาติของสหรัฐอเมริกา ชื่อรหัสว่า DIANA ตารางด้านขวาเป็นตัวช่วยในการแปลงระหว่าง txt ธรรมดาและข้อความเข้ารหัสโดยใช้อักขระด้านซ้ายเป็นคีย์ วงกลมสีดำเป็นสิ่งประดิษฐ์ของการคัดลอก เนื่องจากมีการเจาะรูในต้นฉบับ
(ภาพและข้อความคัดลอกคำต่อคำจาก: https://en.wikipedia.org/wiki/File:NSA_DIANA_one_time_pad.tiff)

ฉันเริ่มต้นด้วยการพยายามเลียนแบบตัวอย่าง NSA ด้านบน ในที่สุดฉันก็ลงเอยด้วยคีย์อักขระ 169 ตัว (แมปเป็นตาราง 13 x 13) ในขณะที่ฉันพยายามเข้ารหัสอักขระเพิ่มเติมในโค้ด QR มันยังใช้งานได้ดีสำหรับข้อความสั้น ๆ และเพื่อพิสูจน์แนวคิด มันมากเกินพอ

รหัส R นั้นสั้นและเรียบง่ายและแสดงไว้ด้านล่าง มันเริ่มต้นด้วยการสร้างตัวเลขสุ่ม 13 x 13 ตั้งแต่ 0 ถึง 25 เพื่อแมปเป็น A ถึง Z นอกจากนี้ยังใช้ไลบรารี qrcode เพื่อสร้างรหัส QR ของคีย์เข้ารหัส จากนั้นจะส่งออกเป็นไฟล์ PDF เพื่อพิมพ์และแจกจ่ายให้กับทั้งผู้ส่งและผู้รับ

#==========================
# Simple one-time-pad generator
# with QR code generation for encryption key
#
# J. van der Linde (jvdl@jvdl.me)
#
# Updated 30 April 2021
#==========================

rm(list = ls())

library(dplyr)
library(qrcode)
library(grid)
library(gridExtra)

#==========================

setwd("~/R/Projects/onetimepad/")

#export pdf to file
pdf("~/R/Projects/onetimepad/otp.pdf")

#initialise with number of rows, cols, and sheets of paper to generate
dim_row <- 13
dim_col <- 13
total_chars <- dim_row * dim_col
total_sheets <- 3

for (i in 1:total_sheets) {
    print(paste("Producing sheet no.", i, "of", total_sheets))
    otp_num <- floor(runif(total_chars, min = 0, max = 26)) #generate from 0 to 25
    otp_char <- replace(otp_num, TRUE, LETTERS[unlist(otp_num + 1)]) #rewrite numbers 0-25 to A-Z
    otp_string <- paste(unlist(otp_char), collapse = '') #create a continuous string for the QR code
    
    otp_num_matrix <- matrix(otp_num, nrow = dim_row, ncol = dim_col, byrow = TRUE) #create a numeric matrix
    otp_char_matrix <- matrix(otp_char, nrow = dim_row, ncol = dim_col, byrow = TRUE) #create a char matrix
    
    otp_char_df <- data.frame(otp_char_matrix) #create dataframe of char matrix
    rownames(otp_char_df) <- seq(dim_row) #set rownames as 1 ... x
    colnames(otp_char_df) <- seq(dim_col) #set colnames as 1 ... y
    
    #output the table of chars to the PDF
    grid.table(otp_char_df)
    grid.text(paste("SHEET", i, "OF", total_sheets), x = unit(0.5, "npc"), y = unit(0.95, "npc"))
    
    #print QR code of OTP to PDF
    qrcode_gen(otp_string)
    
    if (i != total_sheets){
        grid.newpage()
    }
}

#close pdf device
dev.off()

ด้านล่างนี้เป็นข้อความที่ตัดตอนมาจากเอาต์พุต PDF แนวคิดคือควรพิมพ์สำเนาเอกสารนี้สองชุด ชุดหนึ่งสำหรับผู้ส่งและอีกชุดหนึ่งสำหรับผู้รับ ควรส่ง OTP ด้วยตนเองเพื่อให้แน่ใจว่าไม่ถูกดักฟัง ทั้งคู่ควรเก็บ OTP ไว้ในที่ที่ปลอดภัยและทำลายสำเนาอิเล็กทรอนิกส์นี้

PDF ของคีย์เข้ารหัส OTP ที่สร้างขึ้นและรหัส QR ที่เกี่ยวข้อง

เมื่อจำเป็นต้องส่งข้อความที่มีความลับเป็นพิเศษ ตัวละครเอกของเราซึ่งเราจะเรียกพวกเขาว่าอลิซและบ็อบตามประเพณี จะต้องตกลงเกี่ยวกับรหัสที่จะใช้ พวกเขาอาจเตรียมการล่วงหน้าโดยเริ่มที่แผ่นแรกและดำเนินการต่อไปตามลำดับ หรือพวกเขาสามารถตัดสินใจเลือกแผ่นงานได้เอง ตัวอย่างเช่น อลิซสามารถส่งข้อความหาบ๊อบโดยพูดว่า “ใช้ชีต 3 วันนี้” เข้ารหัสแผ่นครั้งเดียวด้วย QR

ในสถานการณ์สมมติของเรา สมมติว่าอลิซต้องพบกับบ็อบ บางทีพวกเขาอาจสรุปธุรกรรมที่เป็นความลับหรือประท้วงเพื่อประชาธิปไตยในประเทศของตน เธอต้องการส่งข้อความว่า “เจอกันตอนสิบเอ็ดโมงที่จัตุรัสกลางเมือง” ประการแรก เธอใช้โปรแกรม ส่งข้อความโต้ตอบแบบทันทีที่ ปลอดภัยอย่าง Signal เพื่อเริ่มการสนทนากับ Bob

อลิซ: สวัสดี FreedomProtestor123 วันนี้ใช้แผ่น3 ข้อความจะตามมาในไม่ช้า

บ๊อบ: สวัสดี DemocracyGirl42 จะทำ

เหตุการณ์ปัจจุบัน…

โดยใช้การบวกแบบโมดูลาร์ (รหัสของเราสำหรับ AZ เท่านั้น ซึ่งมีหมายเลขตั้งแต่ 0 ถึง 25) Alice คำนวณข้อความที่เข้ารหัส เธอเพิ่มตัวอักษรตัวแรกของข้อความต่อตัวอักษรตัวแรกของคีย์ โมดูโล 26 เธอทำซ้ำสำหรับตัวอักษรตัวที่ 2 ของข้อความและตัวอักษรตัวที่สองของคีย์ ไปเรื่อยๆ จากนั้นเธอก็จับคู่ตัวเลขผลลัพธ์ของการบวกแบบโมดูลาร์กลับไปเป็นตัวอักษร

นอกจากนี้ยังสามารถทำได้ค่อนข้างง่ายด้วยความช่วยเหลือของคอมพิวเตอร์ อลิซสามารถใช้โทรศัพท์ของเธอสแกนคิวอาร์โค้ดที่อยู่ติดกับตารางแบบเก่าและทำขั้นตอนให้เสร็จสิ้นผ่านแอปหรือหน้าเว็บ อลิซต้องทำให้แน่ใจว่าเธอสามารถไว้วางใจทุกอย่างในห่วงโซ่นี้ได้ ตั้งแต่เครื่องสแกนรหัส QR ไปจนถึงการไม่ขัดขวางการรับส่งข้อมูลทางอินเทอร์เน็ตของเธอ

ฉันเชื่อมโยงที่นี่กับตัวอย่าง HTML/JS พื้นฐานซึ่งสามารถโฮสต์ออนไลน์หรือเก็บไว้ออฟไลน์เพื่อใช้งานได้ โค้ดนี้จงใจให้เรียบง่ายและสะอาดตา (ไม่มี CSS) เพื่อให้ตรวจสอบแหล่งที่มาได้ง่ายและตัดสินใจได้ว่าจะเชื่อถือหรือไม่ คุณสามารถดูการใช้งานโฮสต์ของฉันได้ที่http://jvdl.me/otp.html ; เนื่องจากเป็นหน้า HTML ที่เรียบง่าย โทรศัพท์หรือคอมพิวเตอร์ทุกเครื่องสามารถแสดงผลได้

การใช้ปุ่มบนแผ่นงาน 3

(DKPKAREZTPABSCHIBLTHZZLNARDGRXVGIBGQDPWLESQWKKAVQDKSPHZNMRDBBNJPTWDANLOARNELLMGODWAMQPYACBABRVTYAPDQHVQESOWQJESMMMDLZULCVGTCYXVZYIJBKOODXCXYSAUCAFGNUUPIBXPHLSXPBBLTQTLUO)

และข้อความของเธอ “เจอกันตอนสิบเอ็ดโมงที่จัตุรัสกลางเมือง” ในที่สุดอลิซก็ลงเอยด้วยข้อความเข้ารหัสต่อไปนี้:

อลิซ: VOT IOL ES XAEWWP HU JY MOD SZJN JTAROZ

บ๊อบ: เข้าใจแล้ว ขอบคุณ

ลึกลับและคลุมเครือ บางทีก็โรแมนติก…

อลิซสามารถเว้นวรรคเพื่อป้องกันไม่ให้อะไรถูกอนุมานจากความยาวของคำ บ๊อบจะยังสามารถเข้าใจข้อความได้ อลิซสามารถใช้ตัวอักษรที่ใช้กันน้อยกว่าปกติ (เช่น Q หรือ X) แทนการเว้นวรรคเพื่อแยกคำในขณะที่ยังคงรักษาข้อความต่อเนื่องกัน สิ่งนี้จะหลีกเลี่ยงการเน้นคำที่เข้ารหัสทีละคำ

อลิซไม่ต้องการคีย์ทั้งหมดเนื่องจากข้อความของเธอสั้น Bob ทำขั้นตอนนี้ซ้ำด้วยการลบและโมดูโลแทนการบวกและโมดูโล เขาลบคีย์ออกจากข้อความที่เข้ารหัสเพื่อรับข้อความต้นฉบับที่ถอดรหัสแล้ว ตอนนี้เขารู้แล้วว่าจะได้พบกับอลิซเมื่อไหร่และที่ไหน

อลิซและบ็อบเป็นคนฉลาดทั้งคู่ พวกเขาคำนึงถึงสิ่งต่อไปนี้ทั้งหมด:

  • อลิซและบ็อบตรวจสอบให้แน่ใจว่าพวกเขาได้รับแผ่นอิเล็กโทรดเพียงชุดเดียว อลิซสร้างมันขึ้นมาและมอบให้บ็อบด้วยตนเอง หรือในทางกลับกัน เข้ารหัสแผ่นครั้งเดียวด้วย QR
  • ข้อความไม่ควรยาวเกินคีย์ (เช่น ไม่ควรวนซ้ำ)
  • พวกเขาจำเป็นต้องปกป้องแผ่นอิเล็กโทรดด้วยชีวิตและจัดเก็บอย่างปลอดภัย โดยเฉพาะอย่างยิ่งหากถูกพบอาจทำให้พวกเขาเสียชีวิตได้
  • พวกเขาจำเป็นต้องเขียนแผ่นงานที่ใช้แล้วหลังจากเกิดการเข้ารหัส/ถอดรหัส
  • พวกเขาส่งข้อความที่เข้ารหัสผ่านแพลตฟอร์มอื่นที่ปลอดภัย เช่น Signal ถ้าเป็นไปได้

ขอบคุณสำหรับการติดตาม! ปลอดภัยในการสื่อสารของคุณ คุณสามารถทำซ้ำงานที่ทำที่นี่ได้อย่างง่ายดายด้วยซอฟต์แวร์ฟรี หากคุณมีข้อความที่เป็นความลับจริงๆ ที่คุณกำลังพยายามจะสื่อ

Face-sso (By K&O) หากท่านสนใจ เครื่องสแกนใบหน้ารุ่นต่างๆ หลากหลายรุ่น หรือ ติดตั้งระบบสแกนใบหน้า สามารถติดต่อสอบถามได้โดยตรง เรามีแอดมินคอยคอบคำถาม 24 ชั้วโมงที่ Line OA เครื่องสแกนใบหน้า สามารถ ขอราคาพิเศษได้ ตามงบประมาณที่เหมาะสม สอบถามได้สบายใจทั้ง เรื่องค่าบริการ ราคา และ งบประมาณ มั่นใจเพราะเป็นราคาที่สุด คุ้มค่าที่สุด

หากท่านมีความสนใจ บทความ หรือ Technology สามารถติดต่อได้ตามเบอร์ที่ให้ไว้ด้านล่างนี้
Tel.086-594-5494
Tel.095-919-6699

One-time pad (OTP) หรือ Vernam-cipher หรือ perfect cipher ดียังไง

One-time pad (OTP) หรือที่เรียกว่า Vernam-cipher หรือ perfect cipher เป็นอัลกอริทึมการเข้ารหัสที่รวมข้อความธรรมดาเข้ากับคีย์สุ่ม เป็นการเข้ารหัสที่ไม่สามารถแตกได้ทางคณิตศาสตร์เพียงอย่างเดียวที่มีอยู่แผ่นรองแบบใช้ครั้งเดียวถูกใช้โดยทีมปฏิบัติการพิเศษและกลุ่มต่อต้านในช่วงสงครามโลกครั้งที่ 2 ซึ่งเป็นที่นิยมในหมู่หน่วยข่าวกรองและสายลับของพวกเขาตลอดช่วงสงครามเย็นและหลังจากนั้น และปกป้องการรับส่งข้อความทางการทูตและการทหารทั่วโลกเป็นเวลาหลายสิบปีแพดแบบครั้งเดียวได้รับชื่อเสียงว่าเป็นระบบเข้ารหัสที่เรียบง่ายแต่แข็งแกร่งพร้อมการรักษาความปลอดภัยที่สมบูรณ์ ซึ่งอัลกอริทึมการเข้ารหัส

ลับที่ทันสมัยในปัจจุบันไม่มีใครเทียบได้ ไม่ว่าความก้าวหน้าทางเทคโนโลยีจะเกิดขึ้นในอนาคต การเข้ารหัสแพดแบบใช้ครั้งเดียวคือและจะยังคงเป็นระบบเดียวที่ไม่มีการแตกหักอย่างแท้จริงที่ให้ความลับของข้อความในระยะยาวอย่างแท้จริงเราสามารถพูดคุยเกี่ยวกับแป้นแบบครั้งเดียวได้ก็ต่อเมื่อปฏิบัติตามกฎที่สำคัญบางประการ หากใช้กฎเหล่านี้อย่างถูกต้อง แผ่นรองแบบใช้ครั้งเดียวสามารถพิสูจน์ได้ว่าไม่แตกหัก (ดู “ทฤษฎีการสื่อสารของระบบความลับ” ของ Claude Shannon) แม้แต่พลังการคำนวณที่ไม่สิ้นสุดและเวลาที่ไม่สิ้นสุดก็ไม่อาจทำลายการเข้ารหัสแพดแบบครั้งเดียวได้ เพียงเพราะมันเป็นไปไม่ได้ในทาง

คณิตศาสตร์ อย่างไรก็ตาม หากเพียงกฎข้อใดข้อหนึ่งถูกเพิกเฉย การเข้ารหัสก็จะไม่สามารถแตกได้อีกต่อไปคีย์มีความยาวอย่างน้อยเท่ากับข้อความหรือข้อมูลที่ต้องเข้ารหัสคีย์เป็นแบบสุ่มอย่างแท้จริง (ไม่ได้สร้างโดยฟังก์ชันคอมพิวเตอร์ทั่วไปหรืออื่นๆ)คีย์และข้อความธรรมดาคำนวณแบบโมดูโล 10 (หลัก), โมดูโล 26 (ตัวอักษร) หรือโมดูโล 2 (ไบนารี)แต่ละคีย์จะใช้เพียงครั้งเดียว และทั้งผู้ส่งและผู้รับต้องทำลายคีย์ของตนหลังการใช้ควรมีสำเนาของคีย์เพียงสองชุด: ชุดหนึ่งสำหรับผู้ส่งและอีกชุดหนึ่งสำหรับผู้รับ (มีข้อยกเว้นบางประการสำหรับผู้รับหลายคน) แผ่นกระดาษขนาดจิ๋วที่ใช้ครั้งเดียว


หมายเหตุสำคัญ: อย่าสับสนระหว่างแพดแบบใช้ครั้งเดียวหรือการเข้ารหัสแบบใช้ครั้งเดียวกับคีย์แบบใช้ครั้งเดียว (OTK) หรือรหัสผ่านแบบใช้ครั้งเดียว (บางครั้งใช้แทนรหัส OTP ด้วย) คีย์แบบใช้ครั้งเดียวดังกล่าวมีขนาดจำกัด ใช้ได้เฉพาะกับเซสชันการเข้ารหัสเดียวโดยอัลกอริทึมการเข้ารหัสบางอย่างภายใต้การควบคุมของคีย์นั้น คีย์แบบใช้ครั้งเดียวขนาดเล็กนั้นไม่สามารถแตกได้ เนื่องจากความปลอดภัยของการเข้ารหัสนั้นขึ้นอยู่กับอัลกอริทึมการเข้ารหัสที่ใช้


ต้นกำเนิดของ One-time pad

เรื่องราวของแพดแบบใช้ครั้งเดียวเริ่มต้นในปี 1882 เมื่อนายธนาคารชาวแคลิฟอร์เนีย แฟรงค์ มิลเลอร์ รวบรวม “รหัสโทรเลขเพื่อประกันความเป็นส่วนตัวและความลับในการส่งโทรเลข” สมุดรหัสดังกล่าวถูกใช้โดยทั่วไป เพื่อลดต้นทุนโทรเลขโดยการบีบอัดคำและวลีเป็นรหัสตัวเลขหรือรหัสตัวอักษรสั้นๆ สมุดรหัสเหล่านี้ให้การรักษาความปลอดภัยเพียงเล็กน้อยหรือไม่มีเลยอย่างไรก็ตาม สมุดรหัสของ Miller ยังให้คำแนะนำสำหรับการเข้ารหัสขั้นสูง (เลเยอร์การเข้ารหัสที่สองเหนือรหัส) โดยวิธีการที่ไม่เหมือนใคร: เขาเพิ่มสิ่งที่เรียกว่า shift-numbers (คีย์) ลงในรหัสธรรมดา (คำที่แปลงเป็นตัวเลข) และกำหนด shift-number

เป็นรายการของตัวเลขที่ไม่ปกติซึ่งควรลบทิ้งหลังจากใช้งานและห้ามใช้อีกสมุดรหัสของเขาประกอบด้วยคำ วลี และช่องว่าง 14,000 คำ (สำหรับการปรับแต่ง) และหากระหว่างการเข้ารหัสผลรวมของรหัสธรรมดาและรหัสเกิน 14,000 จะต้องลบ 14,000 ออกจากผลรวม หากระหว่างการถอดรหัสค่าข้อความไซเฟอร์มีค่าน้อยกว่าคีย์ เราจะต้องเพิ่ม 14,000 ให้กับข้อความไซเฟอร์แล้วลบคีย์ออก หากหมายเลขกะถูกสุ่มเลือก

และใช้เพียงครั้งเดียว ระบบเลขคณิตแบบโมดูลาร์จะให้การเข้ารหัสที่ไม่แตกหักมิลเลอร์ได้คิดค้นแผ่นรองแบบใช้ครั้งเดียวเป็นครั้งแรก น่าเสียดายที่การเข้ารหัสที่สมบูรณ์แบบของมิลเลอร์ไม่เป็นที่รู้จักโดยทั่วไป หลงทางในประวัติศาสตร์ของการเข้ารหัสและไม่เคยได้รับเครดิตที่สมควรได้รับ ทันทีที่มันถูกประดิษฐ์ขึ้น ในไม่ช้ามันก็หายไปอย่างลืมเลือน นักวิจัย Steven Bellovinถูกค้นพบอีกครั้งในปี 2011 ในเอกสารสำคัญจากนั้นในปี 1917 Gilbert Vernam วิศวกรวิจัยของ AT&T ได้พัฒนาระบบเพื่อเข้ารหัสการสื่อสารแบบเทเลไทป์ แม้ว่าสิ่งประดิษฐ์ของ Vernam ในทางคณิตศาสตร์จะคล้ายกับแนวคิดของ Miller แต่เขาก็คิดค้นระบบเครื่องกลไฟฟ้าโดยใช้เลขคณิตแบบโมดูลาร์แบบไบนารี ซึ่งแตกต่างอย่างสิ้นเชิงกับอัลกอริทึมปากกาและกระดาษของ Miller ดังนั้นจึงไม่น่าเป็นไปได้ที่เวอร์นัมจะยืมแนวคิดของมิลเลอร์Vernam ผสมเทป

กระดาษเจาะรหัส Baudot ห้าบิตซึ่งมีข้อความกับเทปกระดาษเจาะที่สองซึ่งเป็นคีย์ที่มีค่าห้าบิตแบบสุ่ม ในการผสมเทปเจาะรู การเพิ่มโมดูโล 2 (ภายหลังรู้จักกันในชื่อ Boolean XOR หรือ Exclusive OR) ได้ดำเนินการด้วยรีเลย์ และคีย์เทปจะทำงานพร้อมกันบนเครื่องส่งและรับ TELEX เป็นระบบเข้ารหัสออนไลน์ทันทีแบบอัตโนมัติระบบแรก

แผ่นงานครั้งเดียวของสำนักงานการต่างประเทศเยอรมัน


เอื้อเฟื้อรูปภาพNational Cryptologic Museumแผ่นรองแบบใช้ครั้งเดียวขนาดเล็กและตารางการแปลง
จากอดีตหน่วยข่าวกรองเยอรมันตะวันออก
HVA – Hauptverwaltung Aufklärung
© SAS Chiffrierdienstหนังสือแพดแบบใช้ครั้งเดียวและเครื่องอ่าน microdot
ซ่อนอยู่ในรถบรรทุกของเล่นและถูกใช้โดย
ตัวแทนผิดกฎหมายที่ดำเนินการในแคนาดา
© CSIS ของแคนาดาส่วนหนึ่งของ CIA one-time pad ที่
Aleksandr Ogorodnik (TRIGON) ใช้
ที่มา: KGB Archives

อย่างไรก็ตาม นักวิทยาการเข้ารหัสลับชาวเยอรมันสามคนได้ตระหนักถึงข้อดีของการเข้ารหัสแบบครั้งเดียวทันที ในช่วงต้นทศวรรษที่ 1920 นักวิทยาการเข้ารหัสลับชาวเยอรมัน Werner Kunze, Rudolf Schauffler และ Erich Langlotz ได้เข้ารหัสข้อมูลทางการทูตของฝรั่งเศสด้วยการเข้ารหัส รหัสตัวเลขดินสอและกระดาษเหล่านี้ใช้สมุดรหัสเพื่อแปลงคำและวลีเป็นตัวเลข ฝรั่งเศสเพิ่มคีย์ตัวเลขซ้ำสั้นๆ (โดยโมดูโล 10) เพื่อเข้ารหัสค่าสมุดรหัสนักวิทยาการเข้ารหัสลับชาวเยอรมันไม่มีปัญหาในการทำลายคีย์ลัดเหล่านี้ แต่ตระหนักว่าการเพิ่มรหัสหลักแบบสุ่มที่ไม่ซ้ำกันให้กับแต่ละกลุ่มรหัสจะทำให้ข้อความไม่สามารถแยกได้ พวกเขาคิดค้นระบบโดยใช้แผ่นกระดาษที่มีตัวเลขสุ่ม แต่ละหลักจะใช้เพียงครั้งเดียว และแผ่นกระดาษ

ซึ่งมีสำเนาเพียงสองชุด (ชุดหนึ่งสำหรับผู้ส่งและอีกชุดสำหรับผู้รับ) ควรถูกทำลายหลังการใช้งาน อันที่จริง พวกเขาคิดค้นระบบของแฟรงก์ มิลเลอร์ในปี 1882 ขึ้นมาใหม่ในปี 1923 ระบบนี้ถูกนำมาใช้ในสำนักงานต่างประเทศของเยอรมนีเพื่อปกป้องข้อความทางการทูต ทางด้านขวา คุณจะเห็นโฟลเดอร์ pad ที่ใช้ครั้งเดียวของเยอรมัน ซึ่งใช้สำหรับการสื่อสารอย่างเป็นทางการระหว่างไซง่อนและเบอร์ลิน ประกอบด้วย

โฟลเดอร์ที่ปิดสนิทซึ่งมีแผ่นงาน pad ที่ใช้ครั้งเดียวหนึ่งร้อยแผ่น ซึ่งมีหมายเลขตั้งแต่ 6500 ถึง 6599 แต่ละแผ่นมีตัวเลขสุ่มและพื้นที่เพียงพอสำหรับ จดข้อความและทำการคำนวณนับเป็นครั้งแรกในประวัติศาสตร์ที่นักการทูตสามารถมีการเข้ารหัสที่ไม่แตกหักได้อย่างแท้จริงในการกำจัด โชคไม่ดีที่พวกเขาตัดสินใจสร้างตัวเลขสุ่มสำหรับกุญแจด้วยเครื่องจักรง่ายๆ ด้วยการทำเช่นนั้น พวกเขาได้ลดระดับระบบแพด

แบบใช้ครั้งเดียวที่มีความปลอดภัยอย่างสมบูรณ์แบบเป็นรหัสสตรีมแบบสุ่มหลอกที่อ่อนแอในปี 2559 สตีเวน เบลโลวิน นักวิจัยค้นพบเอกสารของสำนักงานความมั่นคงกองทัพสหรัฐฯ ในปี 2490 เกี่ยวกับการเข้า

รหัสของข้อความแพดแบบใช้ครั้งเดียวทางการทูตของเยอรมัน ซึ่งมีชื่อรหัสว่า GEE Traffic การวิเคราะห์ข้อความเผยให้เห็นรูปแบบ ซึ่งแสดงว่าคีย์เสริมไม่ได้สุ่มอย่างแท้จริง ในที่สุด ASA ก็ดึงลำดับเดิมของหลักสำคัญและสร้างเครื่องใหม่เพื่อสร้างหลักสิ่งนี้ทำให้พวกเขาสามารถถอดรหัสการจราจรทางการทูตได้ สิ่งสำคัญคือต้องเข้าใจว่านี่ไม่ใช่ตัวอย่างของการทำให้แพดแบบใช้ครั้งเดียวพัง (แบบใช้ครั้งเดียว ไม่ สามารถ ทำให้แตกได้)

แต่เป็นตัวอย่างทางตำราที่มีนัยสำคัญทางประวัติศาสตร์ของการใช้งานที่ไม่ถูกต้อง ในกรณีของการใช้คีย์ที่ไม่ได้สุ่มอย่างแท้จริงมีการคิดค้นรูปแบบต่างๆ มากมายในระบบดินสอและกระดาษนี้ Name one-time pad (OTP) หมายถึง กระดาษโน้ตขนาดเล็กที่มีตัวเลขหรือตัวอักษรแบบสุ่ม โดยปกติจะพิมพ์เป็นกลุ่มละห้าตัว สำหรับแต่ละข้อความใหม่ แผ่นงานใหม่จะถูกฉีกออก มักจะพิมพ์เป็นรูปเล่มเล็ก ๆ หรือบนไมโครฟิล์มเพื่อการสื่อสารแบบแอบแฝงIn 1943, one-time pads became the main cipher of the Special Operations Executive (SOE) to replace insecure poem based transposition ciphers and

book ciphers. The system was used extensively during and after the Second World War by many intelligence organizations, sabotage and espionage units.การเข้ารหัสที่ไม่สามารถทำลายได้จะปกป้องผู้ปฏิบัติงานและผู้ติดต่อจากการถอดรหัสการสื่อสารและการเปิดเผยตัวตนของพวกเขา ไม่

สามารถรับประกันระดับความปลอดภัยดังกล่าวกับระบบเข้ารหัสอื่นๆ ในระหว่างการดำเนินการที่ใช้เวลานาน เนื่องจากฝ่ายตรงข้ามอาจมีเวลาเพียงพอในการถอดรหัสข้อความได้สำเร็จโซเวียตพึ่งพา OTP และ OTT อย่างมากในระหว่างและหลังสงครามโลกครั้งที่สองสำหรับกองกำลังติดอาวุธและองค์กรข่าวกรองของพวกเขา ทำให้การสื่อสารที่สำคัญส่วนใหญ่ไม่สามารถเข้าถึงได้ ระบบหนึ่งที่โซเวียตใช้สำหรับจดหมายจากและถึงสถานทูตของตนคือการลบเฉพาะคำ ชื่อ หรือวลีที่ละเอียดอ่อน และแทนที่ด้วย “No 1”, “No 2”

เป็นต้น ถัดไป ข้อความที่ละเอียดอ่อนและการกำหนดหมายเลขที่สอดคล้องกันจะถูกเข้ารหัสด้วยแป้นแบบใช้ครั้งเดียว และข้อความเข้ารหัสนี้จะมาพร้อมกับตัวอักษรการเข้ารหัสเฉพาะส่วนที่ละเอียดอ่อนเหล่านี้สามารถลดจำนวนข้อความเข้ารหัส การทำงาน และเวลาในการประมวลผลจดหมายขนาดยาวได้อย่างมาก การเปลี่ยนแปลงครั้งใหญ่ของการสื่อสารของโซเวียตเป็นแพดแบบใช้ครั้งเดียวในปี 1948 ทำให้ความพยายาม SIGINT ของ NSA เป็นง่อยมานานหลายปี เหตุการณ์ที่ NSA เรียกว่าBlack Friday (บทที่ 3 หน้า 19 )ทางด้านขวา คุณจะพบแพดแบบใช้ครั้งเดียวรุ่นต่างๆ มากมาย ซองพลาสติกที่มีแผ่นรองแบบใช้ครั้ง

เดียวและตารางสำหรับแปลงข้อความเป็นตัวเลขนั้นถูกใช้โดย HVA หน่วยข่าวกรองต่างประเทศของเยอรมันตะวันออก หน่วยสืบราชการลับของแคนาดายึดหนังสือเล่มเล็กแบบใช้ครั้งเดียวขนาดเล็ก เครื่องอ่าน microdot และเลนส์พิเศษ ซึ่งซ่อนไว้อย่างชาญฉลาดในรถบรรทุกของเล่นที่ลูกชายคนเล็กของหน่วยข่าวกรองต่างชาตินำเข้าประเทศเพื่อดำเนินการจารกรรมในแคนาดา อุปกรณ์สอดแนมที่ซ่อนอยู่เพิ่มเติมได้ที่เว็บไซต์CSISภาพสุดท้ายเป็นส่วนหนึ่งของแผ่นจารึกที่ใช้ครั้งเดียว ซึ่งถูกใช้โดย Aleksandr Dmitrievich Ogorodnik (TRIGON) พนักงานกระทรวงต่างประเทศของสหภาพโซเวียตที่กระทำการจารกรรมให้กับ CIA (คลิกเพื่อดูภาพขยาย)

 ข้อมูลเพิ่มเติมเกี่ยวกับTRIGON ได้ที่ SIGINT Chatterและที่หน้าเว็บของAndrei Sinelnikov (แปล) การใช้แผ่นอิเล็กโทรดแบบใช้ครั้งเดียวในช่วงแรกๆ แทบไม่มีการกล่าวถึงในเอกสารอย่างเป็นทางการ (ด้วยเหตุผลด้านความปลอดภัยที่ชัดเจน) อย่างไรก็ตาม ฉันพบเอกสารจาก India Office Records ในหอสมุดแห่งชาติอังกฤษ พวกเขาแสดงให้เห็นว่า Bahrain Petroleum Company (BAPCO) ซึ่งเป็นบริษัทในเครือของ American Standard Oil of California ซึ่งดำเนินการในอ่าวเปอร์เซียได้รับอนุญาตในปี 1943 ให้ใช้แผ่นอิเล็กโทรดแบบใช้ครั้งเดียวเพื่อสื่อสารกับสำนักงานในนิวยอร์กได้อย่างไรแผ่นดังกล่าวได้รับการจัดสรรโดยกรมกองทัพเรือสหรัฐฯ และได้รับการตรวจสอบโดยเจ้าหน้าที่รักษาความปลอดภัยรหัสอังกฤษของ PAIFORCE (กองกำลังเปอร์เซียและอิรัก ขบวนทหารอังกฤษและเครือจักรภพใน

ตะวันออกกลางตั้งแต่ปี 2485 ถึง 2486)พวกเขาแสดงการใช้แผ่นจดหมายแบบใช้ครั้งเดียวอย่างเป็นทางการโดยผู้อยู่อาศัยทางการเมืองของ British Imperial Civil Administration, British Army, the Ministry of War Transport in London และ US Navy อย่างน้อยที่สุดในปี 1943 และที่น่าประหลาดใจคือมีการแชร์กัน กับบริษัทการค้า. ดูข้อมูลเพิ่มเติมได้ในบล็อกโพสต์ของฉันBAPCO ‘s Use of One-time Pads during WW2


แผ่นกระดาษแบบใช้ครั้งเดียว
การใช้แผ่นรองดินสอและกระดาษแบบใช้ครั้งเดียวมีข้อจำกัดเนื่องจากปัญหาด้านการปฏิบัติและด้านลอจิสติกส์ และปริมาณข้อความต่ำที่สามารถดำเนินการได้ แผ่นอิเล็กโทรดแบบใช้ครั้งเดียวถูกใช้อย่างแพร่หลายโดยผู้สื่อสารต่างประเทศจนถึงปี 1980 โดยมักจะใช้ร่วมกับสมุดรหัส หนังสือรหัสเหล่านี้ประกอบด้วยคำหรือวลีทั้งหมดทุกประเภท ซึ่งแทนด้วยรหัสตัวเลขสามหรือสี่ตัว สำหรับชื่อหรือนิพจน์พิเศษที่ไม่ได้ระบุไว้ในสมุดรหัส มีรหัสรวมที่แสดงถึงตัวอักษรหนึ่งตัวที่อนุญาตให้สะกดคำได้ มีหนังสือเข้ารหัสเรียงตามตัวอักษรและ/หรือหมวดหมู่ และหนังสือถอดรหัสเรียงตามตัวเลข

เมื่อข้อความถูกแปลงเป็นตัวเลขแล้ว ผู้สื่อสารจะเข้ารหัสตัวเลขเหล่านี้ด้วยแป้นแบบใช้ครั้งเดียว โดยปกติจะมีชุดของแผ่นอิเล็กโทรดที่แตกต่างกันสองชุด แผ่นหนึ่งสำหรับข้อความเข้าและอีกแผ่นสำหรับข้อความขาออก แม้ว่าแพดแบบใช้ครั้งเดียวโดยปกติจะมีคีย์เพียงสองชุด หนึ่งชุดสำหรับผู้ส่งและอีกชุดหนึ่งสำหรับผู้รับ บางระบบใช้สำเนามากกว่าสองชุดเพื่อระบุที่อยู่ผู้รับหลายคน แผ่นอิเล็กโทรดเป็นเหมือนบล็อกโน้ตที่มีตัวเลขสุ่มในแต่ละหน้าเล็กๆ แต่ปิดขอบไว้ เราสามารถอ่านแผ่นถัดไปได้โดยการฉีกแผ่นก่อนหน้าออก แต่ละแผ่นถูกใช้เพียงครั้งเดียวและทำลายทันที ระบบนี้เปิดใช้งานการสื่อสารที่ปลอดภัยอย่างแท้จริง พบคำอธิบายที่ยอดเยี่ยมเกี่ยวกับแผ่นรองแบบใช้ครั้งเดียวของ Canadian Foreign Serviceเว็บไซต์ ของJerry Proc

Face-sso (By K&O) หากท่านสนใจ เครื่องสแกนใบหน้ารุ่นต่างๆ หลากหลายรุ่น หรือ ติดตั้งระบบสแกนใบหน้า สามารถติดต่อสอบถามได้โดยตรง เรามีแอดมินคอยคอบคำถาม 24 ชั้วโมงที่ Line OA เครื่องสแกนใบหน้า สามารถ ขอราคาพิเศษได้ ตามงบประมาณที่เหมาะสม สอบถามได้สบายใจทั้ง เรื่องค่าบริการ ราคา และ งบประมาณ มั่นใจเพราะเป็นราคาที่สุด คุ้มค่าที่สุด

หากท่านมีความสนใจ บทความ หรือ Technology สามารถติดต่อได้ตามเบอร์ที่ให้ไว้ด้านล่างนี้
Tel.086-594-5494
Tel.095-919-6699

การ ตรวจสอบความซ้ำซ้อนแบบวนซ้ำ (CRC) รหัสตรวจจับข้อผิดพลาด

ตรวจสอบความซ้ำซ้อนแบบวนซ้ำ CRC เป็นอัลกอริทึมการตรวจจับข้อผิดพลาดทั่วไปสำหรับการส่งข้อมูล ไม่เคยออกแบบมาสำหรับการเข้ารหัส อย่างไรก็ตาม บางครั้งก็ใช้ในโปรโตคอล เช่น WEP เมื่อใช้เพื่อจุดประสงค์ในการเข้ารหัส อาจนำไปสู่การประนีประนอมกับความปลอดภัยของการแลกเปลี่ยน ในบทความนี้จะมีรายละเอียดเกี่ยวกับการโจมตีที่เป็นไปได้ต่อการใช้ CRC ในการเข้ารหัส

รหัสทั้งหมดที่ใช้ในบทความนี้ (และอื่น ๆ ) สามารถพบได้ในGitHub ของฉัน หรือที่นี่

ซีอาร์ซีคืออะไร

การตรวจสอบความซ้ำซ้อนแบบวนซ้ำ (CRC) เป็นรหัสตรวจจับข้อผิดพลาดตามโมดูโลการหารพหุนามสอง CRC ใช้สำหรับตรวจหาข้อผิดพลาดในการส่งข้อมูล เช่น ในการส่งข้อมูลผ่านบลูทูธ แต่ไม่ควรใช้เพื่อวัตถุประสงค์ในการเข้ารหัส

CRC (มีโปรโตคอลขึ้นอยู่กับคำจำกัดความของ CRC มากมาย) ถูกกำหนดโดย:

  • พหุนามP (ซึ่งก็คือx8+x7+x6+x4+x2+ 1�8+�7+�6+�4+�2+1กรณีเป็น CRC-8-Bluetooth)
  • การดำเนินการก่อนและหลังการดำเนินการหารด้วยP

การคำนวณ CRC จะทำในพื้นที่พหุนาม ดังนั้นจึงถือว่าข้อมูลเป็นพหุนาม

ตัวอย่างเช่น,” ก” = 97 = 0 ข01100001 =x6+x5+ 1″ก”=97=0ข01100001=�6+�5+1.

เพื่อสรุปชุดของบิตb ( n ) b ( n − 1 ) . . . ข( 1 ) ข( 0 )ข(น)ข(น-1)…ข(1)ข(0)สามารถเทียบได้กับพหุนามข= ข( น)เอ็กซ์น+ ข( n − 1 )เอ็กซ์(n − 1 ) + _ . . + ข( 1 ) X+ ข( 0 )ข=ข(น)เอ็กซ์น+ข(น-1)เอ็กซ์(น-1)+…+ข(1)เอ็กซ์+ข(0)

และ CRC จะคำนวณเป็น:

  x = (op_start(B)) mod[P]
  CRC(B) = op_end(x)

ด้วยop_startและop_endสองการดำเนินการกับพหุนาม

การแสดงพหุนาม

ในเอกสารประกอบ CRC จะใช้การแทนชื่อพหุนามที่แตกต่างกัน การแสดงแบบปกติ การกลับกัน การกลับกัน และการกลับกัน การเป็นตัวแทนที่ใช้ขึ้นอยู่กับข้อกำหนด และจะส่งผลต่ออัลกอริทึมที่ใช้ในการคำนวณ CRC แต่จะไม่แก้ไขผลลัพธ์ รายละเอียดในการเป็นตัวแทนมีดังนี้

สำหรับ CRC8 ที่ใช้พหุนามx8+x7+x6+x4+x2+ 1�8+�7+�6+�4+�2+1การแสดงที่แตกต่างกันมีดังนี้:

พิมพ์เทียบเท่ากับค่าเลขฐานสิบหก
ปกติx8+ (x7+x6+x4+x2+ 1 )�8+(�7+�6+�4+�2+1)0xD5
กลับด้าน1 + (x2+x4+x4+x6+x7+x8)1+(�2+�4+�4+�6+�7+�8)0xAB
ซึ่งกันและกัน( 1 +x2+x4+x4+x6+x7) +x8(1+�2+�4+�4+�6+�7)+�80x57
กลับกัน(x8+x7+x6+x4+x2) + 1(�8+�7+�6+�4+�2)+10xEA

รายชื่อพหุนามสำหรับ CRCs ต่างๆ สามารถพบได้ที่นี่ ตรวจสอบความซ้ำซ้อนแบบวนซ้ำ

การคำนวณ CRC

ในส่วนนี้ฉันนำเสนอวิธีคำนวณใน python CRC ด้วยพหุนามของความยาวคูณด้วย 8 รหัสได้รับแรงบันดาลใจจากที่นำเสนอในRosettaCode

class CRC:
    '''
    This CRC class works to generate crc of length multiple of 8.
    :param polynome int: polynome in reciprocal form
    :param init_xor int: first data xoring to apply on the data
    :param end_xor int: final data xoring to apply on the data
    '''
    def __init__(self, polynome, init_xor, end_xor):
        self.polynome = polynome
        self.crc_len = (len(hex(polynome)[2:])-1)//2
        self.init_xor = init_xor
        self.end_xor = end_xor
        self.crc_table = self.create_table()
        self.inv_crc_table = self.create_inv_table()

    def create_table(self):
        table = []
        for i in range(256): # for all byte value
            k = i
            for j in range(8): # compute modulus
                if k & 1:
                    k ^= self.polynome
                k >>= 1
            table.append(k)
        return table

    def crc(self, bytestring, crc_val=0):
        crc_val ^= self.init_xor
        for byte in bytestring:
            # Compute crc recursively
            crc_val = (crc_val >> 8) ^ self.crc_table[(crc_val & 0xff) ^ byte]
        return crc_val ^ self.end_xor

ในการคำนวณ CRC32 แบบคลาสสิก พารามิเตอร์จะเป็นดังนี้:

polynome =  0x1db710640
init_xor = int('FF'*4, 16)
end_xor = int('FF'*4, 16)

คุณสมบัติบางอย่างของ CRC

CRCs มีคุณสมบัติที่น่าสนใจซึ่งจะใช้ในภายหลัง อย่างไรก็ตาม การสาธิตคุณสมบัตินี้ปล่อยให้ผู้อ่านสนใจ

  • CRC(A ^ B ^ C) = CRC(A) ^ CRC(B) ^ CRC(C), for len(A) = len(B) = len(C)
  • สามารถคำนวณ CRC แบบเรียกซ้ำได้ (ดูรหัสในส่วนก่อนหน้า):
    • CRC(0) = c0
    • CRC(i+1) = (CRC(i) >> 8) ^ T[(CRC(i) & 0xFF) ^ M[i]]ด้วย T ตารางค่าคงที่ (ดูcreate_table)
  • การเกิดซ้ำของ CRC เพิ่มคุณสมบัติบางอย่าง:
    • CRC('', val) = val
    • CRC(M, val) = CRC(M[1:], CRC(M[0], val))
    • CRC(M) = CRC(M, 0)

การกลับ CRC

CRC ไม่มีจุดประสงค์ในการเข้ารหัส และเป็นเรื่องง่ายที่จะค้นหาข้อมูลสองชุดที่มี CRC เหมือนกัน ในส่วนนี้จะอธิบายวิธีการต่างๆ ในการสร้างข้อมูลที่แตกต่างกันด้วย CRC เดียวกัน

แนวทางกำลังด้อย

วิธีแรกคือการใช้กำลังดุร้าย สำหรับ CRC ที่มีความยาวlและข้อความM=M[0]M[1]…M[n-1]จำนวนnบิต จะพบข้อความอื่นที่มี CRC เดียวกันได้โดยการทดสอบชุดค่าที่เป็นไปได้ทั้งหมดสำหรับ M[nl ]..M[n-1] .

วิธีนี้ใช้ง่ายแต่ช้ามาก หากเวลาในการคำนวณเป็นที่ยอมรับสำหรับ CRC32 จะกลายเป็นเรื่องที่น่ารำคาญมากสำหรับ CRC64 หรือเมื่อคุณจำเป็นต้องคำนวณหลายรายการพร้อมกัน

วิธีการที่ไม่ไร้เดียงสา

เป็นไปได้ที่จะทำได้ดีกว่าวิธีการไร้เดียงสา ในการทำเช่นนั้น อัลกอริทึมการคำนวณ CRC จำเป็นต้องย้อนกลับ

เพื่อลดความซับซ้อน เนื่องจาก CRC ของ 32 บิตจะได้รับการพิจารณา แต่สามารถใช้วิธีการเดียวกันนี้กับความยาวเท่าใดก็ได้

ตามที่เห็นก่อนหน้านี้ CRC สามารถคำนวณซ้ำได้ด้วยเงื่อนไขนี้ * CRC(0) = c0 *CRC(i+1) = (CRC(i) >> 8) ^ T[(CRC(i) & 0xFF) ^ M[i]]

ในกรณีของการแทนสี่ไบต์:

องค์ประกอบบิตข0ข0ข1ข1ข2ข2ข3ข3
(CRC(i) >> 8) = Bข0ข0ข1ข1ข2ข2
T[(CRC(i) & 0xFF) ^ M[i]] = Tที0ที0ที1ที1ที2ที2ที3ที3
CRC(i+1) = กก0ก0ก1ก1ก2ก2ก3ก3
ซีอาร์ซี(i+1)ที0ที0ที1ที1^ข0ข0ที2x โออาร์ข1ที2�โอรข1ที3x โออาร์ข2ที3�โอรข2

สิ่งแรกที่ต้องตระหนักคือถ้าเรารู้ว่าCRC(i+1)เรารู้ 8 บิตทางด้านซ้ายของT[(CRC(i) & 0xFF) ^ M[i]].

ค่า T ทั้งหมดมีค่าเฉพาะสำหรับ 8 บิตทางด้านซ้าย ( T[i] >> (crc_len - 8หรือที0ที0บนโต๊ะ). T_invสามารถสร้างตารางย้อนกลับ ได้

มีคุณสมบัติดังต่อไปนี้ * T[T_inv[i]] = i *T_inv[T[i] >> (crc_len - 8)] = i

จากนั้นค่าของ CRC(i) ยกเว้น 8 บิตแรกทางขวา (ข0ข1ข2ข0ข1ข2) สามารถทราบได้โดย:

(CRC(i) >> 8) = CRC(i+1) ^ T[T_inv[CRC(i+1) >> (crc_len - 8)]]

การดำเนินการนี้สามารถทำได้CRC(i)ทั้งหมด

ตอนนี้ต้องหาค่า M

แต่เรายังรู้ค่ากลางอีกค่าหนึ่งด้วย (เช่น CRC(0) ซึ่งเป็น 0 หรือ -1 (0xFF..FF) หรืออาจเป็น CRC ของบิต N-4) จากนั้นเราก็สามารถคำนวณค่า M[i] ได้ เนื่องจากเราทราบ CRC และ T Recursively ที่สอดคล้องกัน เราจึงสามารถสร้างค่าข้อความใหม่ได้จากจุดนี้

สำหรับกรณีของ CRC32:

CRC(i+1) = T[(CRC(i) & 0xFF) ^ M[i]] ^
           (
            (T[(CRC(i-1) & 0xFF) ^ M[i-1]] ^
             (
              (T[(CRC(i-2) & 0xFF) ^ M[i-2]] ^
               (
                (T[(CRC(i-3) & 0xFF) ^ M[i-3]] ^
                 (
                  (T[(CRC(i-4) & 0xFF) ^ M[i-3]] ^
                  (CRC(i-4) >> 8)
                  ) >> 8
                 )
                ) >> 8
               )
              ) >> 8
             )
            ) >> 8
           )
         = T[(CRC(i) & 0xFF) ^ M[i]] ^
           (T[(CRC(i-1) & 0xFF) ^ M[i-1]] >> 8) ^
           (T[(CRC(i-2) & 0xFF) ^ M[i-2]] >> 16) ^
           (T[(CRC(i-3) & 0xFF) ^ M[i-3]] >> 24) ^
           (T[(CRC(i-4) & 0xFF) ^ M[i-3]] >> 32) ^
           (CRC(i-4) >> 40)
        = T[(CRC(i) & 0xFF) ^ M[i]] ^
           (T[(CRC(i-1) & 0xFF) ^ M[i-1]] >> 8) ^
           (T[(CRC(i-2) & 0xFF) ^ M[i-2]] >> 16) ^
           (T[(CRC(i-3) & 0xFF) ^ M[i-3]] >> 24) ^
           (T[(CRC(i-4) & 0xFF) ^ M[i-3]] >> 32)

และเรายังสามารถพิสูจน์ CRC ของความยาวได้อย่างง่ายดายn*8

CRC(i+1) = T[(CRC(i) & 0xFF) ^ M[i]] ^
           (T[(CRC(i-1) & 0xFF) ^ M[i-1]] >> 8) ^
           (T[(CRC(i-2) & 0xFF) ^ M[i-2]] >> 16) ^
           ...
           (T[(CRC(i-(n-1)) & 0xFF) ^ M[i-(n-1)]] >> (n*8))

ค่า CRCs ที่ขั้นตอนi+1ขึ้นอยู่กับค่า CRC เริ่มต้นที่ขั้นตอนi-(n-1) เท่านั้น (ซึ่งเรียกว่าเป็น crc ของส่วนของข้อความM[i-(n-1): i+1]ที่จะไม่ถูกแก้ไข)

ในการแก้ไขข้อความให้มี CRC เฉพาะ ฉันเขียนโค้ดต่อไปนี้:

    def create_inv_table(self):
        inv_table = [0] * 256
        l = self.crc_len*8 - 8
        for i, elem in enumerate(self.crc_table):
            val = elem >> l
            inv_table[val] = i
        return inv_table

    def crc_inv(self, data, crc_target):
        original_crc = self.crc(data, 0)
        prev_crc = crc_target ^ self.end_xor
        index_table = []
        crc_list = [prev_crc]
        new_data = []
        l = self.crc_len*8 - 8
        for i in range(self.crc_len):
            crc_head = prev_crc >> l
            index = self.inv_crc_table[crc_head]
            index_table = [index] + index_table
            prev_crc = (prev_crc ^ self.crc_table[index]) << 8
            crc_list = [prev_crc] + crc_list
        crc_list = [original_crc ^ self.init_xor] + crc_list
        for i in range(self.crc_len):
            new_data.append((crc_list[i] ^ index_table[i]) & 0xFF)
            crc_list[i+1] = (crc_list[i] >> 8) ^ (self.crc_table[index_table[i]])
        return data + bytes(new_data)

โดยใช้รหัส:

>>> import crc
>>> crc = crc.CRC(0x1db710640, int('FF'*4, 16), int('FF'*4, 16))
>>> crc.crc_inv(b'', 0xDEADBEEF)
b'\xc3\xd8$\x06'
>>>> hex(crc.crc(b'\xc3\xd8$\x06'))
'0xdeadbeef'

CRC และการเข้ารหัส

แม้ว่า CRC จะไม่เคยถูกสร้างขึ้นเพื่อวัตถุประสงค์ในการเข้ารหัส แต่บางครั้งก็ถูกใช้ในการเข้ารหัสแบบกำหนดเอง (ซึ่งไม่ควรทำ) ฉันเห็นไม่กี่ครั้งในระบบฝังตัวที่ฉันตรวจสอบ ในส่วนนี้ฉันจะอธิบายผ่านตัวอย่างหนึ่งว่าทำไมไม่ควรใช้ในระบบ crypto

รหัสสตรีม

การเข้ารหัสของสตรีมทำงานในลักษณะที่คล้ายกับแป้นแบบใช้ครั้งเดียว แป้นแบบใช้ครั้งเดียวถูกสร้างขึ้นผ่านอัลกอริทึมการเข้ารหัส และคีย์นี้จะถูก xored ลงในข้อมูลเพื่อเข้ารหัส ตรวจสอบความซ้ำซ้อนแบบวนซ้ำ

กุญแจแบบนั้น:Key = E(IV, K)|E(IV, K+1)|....|E(IV, K+N)|...

และ XOR คีย์นี้พร้อมข้อความ:C = E(M, K1|K2|...|KN) = E(M, K1)|E(C, K2)...|E(C, KN)

ซึ่งสามารถสังเกตได้ว่าC = E(M, K) = M ^ K

ไม่ควรใช้ CRC เพื่อความสมบูรณ์

ตอนนี้ เรามาดูตัวอย่างหนึ่งว่าทำไมจึงไม่ควรใช้ CRC สำหรับการตรวจสอบความสมบูรณ์ในบริบทการเข้ารหัสลับ ในกรณีของการใช้ CRC เป็นอัลกอริทึมความสมบูรณ์เมื่อใช้การเข้ารหัสสตรีม เป็นไปได้ที่จะแก้ไขข้อความที่เข้ารหัสโดยไม่ต้องแก้ไข CRC ดังนั้นจึงไม่ถูกตรวจพบ

จากตอนที่แล้วCRC(A ^ B ^ C) = CRC(A) ^ CRC(B) ^ CRC(C), for len(A) = len(B) = len(C) ดังนั้นสำหรับแผ่นครั้งเดียว :C = M ^ K with len(C) = len(M) = len(K)

โดยการคำนวณ CRC ของรหัสและใช้ความสัมพันธ์ก่อนหน้า: CRC(C) = CRC(M ^ K ^ 0) = CRC(M) ^ CRC(K) ^ CRC(0), for len(A) = len(B) = len(C)

เป้าหมาย:แก้ไข C ใน C2 เช่นนั้นCRC(C2 ^ K) = CRC(M2) = CRC(M)

C2ได้มาจากการดัดแปลงC xoring ด้วยK2

CRC(C2 ^ K) = CRC(C ^ K2 ^ K)
            = CRC(C) ^ CRC(K2) ^ CRC(K)

เป้าหมายคือการมี:

CRC(C2 ^ K) = CRC(M2) = CRC(M)

ดังนั้น

    CRC(M) = CRC(C) ^ CRC(K2) ^ CRC(K)
    CRC(K2) = CRC(M) ^ CRC(K) ^ CRC(C)
            = CRC(M) ^ CRC(K) ^ CRC(0) ^ CRC(0) ^ CRC(C)
            = CRC(M ^ K ^ 0) ^ CRC(0) ^ CRC(C)
            = CRC(C) ^ CRC(0) ^ CRC(C)
            = CRC(0)

หากต้องการแก้ไขรหัสโดยไม่ต้องแก้ไข CRC ของข้อความที่ชัดเจน สามารถสร้าง คีย์K2 ได้ และควรตรวจสอบ CRC(K2) = CRC(0)ซึ่งสามารถคำนวณได้ด้วยอัลกอริทึมที่อธิบายไว้ในส่วนก่อนหน้า

คุณสามารถตรวจสอบได้จากตัวอย่างนี้ (โดยเพิ่มรหัสก่อนหน้า):

cipher = lambda x,k:bytes([a^b for a,b in zip(x, k)])

crc = crc.CRC(0x1db710640, int('FF'*4, 16), int('FF'*4, 16))

message = b'CRC is so fun to break'
key     = b'Sha1 is better for crypto'
c = cipher(message, key)
#out: b'\x10:"\x12I\x1aSS\rE\x12\x01\x0bRT\tO\x10R\x06\x13\x12'
crc_m = crc.crc(message)
# '0x601784a9'
key_2 = b'\x42' * (len(message) - 4)
key_2 = crc.crc_inv(key_2, crc.crc(b'\x00'*len(message)))
# b'BBBBBBBBBBBBBBBBBB\xe9P\xc0x'
modified_c = cipher(c, key_2)
# b'Rx`P\x0bX\x11\x11O\x07PCI\x10\x16K\rR\xbbV\xd3j'
modified_m = cipher(modified_c, key)
# b'\x01\x10\x01b+1b1-b$7,b6-b \x9b5\xa1\x13'
crc.crc(modified_m)
# 0x601784a9 same as crc_m = crc.crc(message)
# We achieved our goal

ในส่วนนี้ได้รับการพิสูจน์แล้วว่า CRC ไม่ได้ให้ความสมบูรณ์ใด ๆ ในกรณีของการเข้ารหัสข้อมูลด้วยการเข้ารหัสสตรีม การใช้ CRC กับรหัสประเภทอื่นไม่มีรายละเอียด แต่ก็ไม่ควรใช้

บทสรุป

CRC เป็นวิธีที่ง่ายในการตรวจจับการเปลี่ยนแปลงในข้อมูล อย่างไรก็ตาม เป็นเรื่องง่ายมากที่จะสร้างข้อมูลอื่นด้วย CRC เดียวกัน แม้ว่าข้อมูลนั้นจะถูกเข้ารหัสและไม่ทราบข้อมูล CRC ดั้งเดิมก็ตาม ไม่ควรใช้ CRC เพื่อให้แน่ใจว่าข้อมูลมีความสมบูรณ์ในบริบทการเข้ารหัส

ขอบคุณที่อ่านบทความนี้ หวังว่าจะได้พบคุณเร็ว ๆ นี้

Face-sso (By K&O) หากท่านสนใจ เครื่องสแกนใบหน้ารุ่นต่างๆ หลากหลายรุ่น หรือ ติดตั้งระบบสแกนใบหน้า สามารถติดต่อสอบถามได้โดยตรง เรามีแอดมินคอยคอบคำถาม 24 ชั้วโมงที่ Line OA เครื่องสแกนใบหน้า สามารถ ขอราคาพิเศษได้ ตามงบประมาณที่เหมาะสม สอบถามได้สบายใจทั้ง เรื่องค่าบริการ ราคา และ งบประมาณ มั่นใจเพราะเป็นราคาที่สุด คุ้มค่าที่สุด

หากท่านมีความสนใจ บทความ หรือ Technology สามารถติดต่อได้ตามเบอร์ที่ให้ไว้ด้านล่างนี้
Tel.086-594-5494
Tel.095-919-6699

ตัวเข้ารหัสที่กำหนดเอง – แพดแบบใช้ครั้งเดียว (OTP)

ตัวเข้ารหัสที่กำหนดเอง – แผ่นเวลาเดียวลิงก์ถาวร รูทีนการเข้ารหัสที่ฉันเลือกสำหรับการมอบหมายนี้คือOne-time pad (OTP)ซึ่งจำเป็นต้องมีคีย์ ที่แบ่งปันล่วงหน้าเพื่อให้ทำงานได้ ความจำเป็นในการใช้คีย์ที่แบ่งปันล่วงหน้าเพื่อถอดรหัสเพย์โหลด เป็นหนึ่งในปัญหาที่เกิดขึ้นเมื่อพูดถึง OTP หากการแชร์คีย์ไม่เสร็จสิ้นอย่างปลอดภัย ก็ไม่มีประโยชน์ ที่จะใช้แพดแบบใช้ครั้งเดียวตั้งแต่แรก เนื่องจากบทความนี้จะไม่แตะหัวข้อของการแชร์คีย์เลยสักนิด ฉันจึงถือว่าใครก็ตาม ควรมีความคิดที่จะแชร์อย่างปลอดภัยนอกขอบเขตของบทความเล็กๆ นี้

แนวคิดง่ายๆ เบื้องหลังการใช้แผ่นแบบใช้ครั้งเดียวสามารถอธิบายได้ด้วยตัวอย่างเล็กๆ น้อยๆ ถ้าเรามีข้อความธรรมดาaและเราได้แบ่งปันรหัสลับล่วงหน้าอย่างปลอดภัยb แล้ว เพื่อให้ ได้ข้อความที่เข้ารหัส เราจะ xor aและในการถอดรหัสข้อความ เราจะใช้คีย์ที่แบ่งปันล่วงหน้าbอีกครั้งเพื่อ xor ด้วยข้อความที่เข้ารหัสแทน ด้วยวิธีนี้เราจะลงเอยด้วยข้อความต้นฉบับa . รูปแบบต่อไปนี้อธิบายถึงขั้นตอนเดียวกันทุกประการ:

การสร้างคีย์สุ่มลิงก์ถาวร

คุณจะสร้างคีย์ที่สุ่มได้อย่างไร นี่เป็นปัญหาอื่น นอกเหนือจากการแบ่งปันรหัส นี่คือช่วงเวลาที่ถ้าคุณเริ่มค้นหาในอินเทอร์เน็ต คุณจะสะดุดกับตัวสร้างตัวเลขสุ่มหลอก และตัวสร้างตัวเลขสุ่มจริง เนื่องจากฉันตัดสินใจแล้วว่าจะใช้ Python สำหรับงานชิ้นนี้ ฉันจึงตัดสินใจดูว่า ภาษานี้มีอะไรให้ฉันใช้นอกกรอบและลงเอยด้วยการใช้urandom()ฟังก์ชันจากosโมดูล ฉันเลือกตัวเลือกนี้ตามคำแนะนำของ Python ในการสร้างหน้าตัวเลขสุ่มหลอก1ซึ่งระบุ:

“คำเตือน ไม่ควรใช้ตัวสร้างสุ่มหลอกของโมดูลนี้เพื่อจุดประสงค์ด้านความปลอดภัย ใช้ os.urandom() หรือ SystemRandom หากคุณต้องการตัวสร้างตัวเลขสุ่มหลอกที่ปลอดภัยด้วยการเข้ารหัส”

อีกสิ่งหนึ่งสำหรับแพดแบบใช้ครั้งเดียวคือคีย์สามารถมีความยาวเท่ากับเพย์โหลดหรือนานกว่านั้น ฉันตัดสินใจที่จะให้มันยาวเท่ากันกับเพย์โหลดเอง

การเข้ารหัสลิงก์ถาวร

ในที่สุดขั้นตอนการเข้ารหัสก็จบลงแบบสั้นๆ และเรียบง่าย แต่เมื่อฉันตัดสินใจใช้ Python 3 แทน 2 (เป็นประสบการณ์ที่ดีในอนาคต) ฉันใช้เวลาสักครู่ เนื่องจาก os.urandom สร้างสตริงสุ่มตามความยาวที่ระบุและคีย์ [i] จะให้การแสดงทศนิยม ฉันสามารถใช้มันโดยตรงใน xor ในทางกลับกัน ข้อความธรรมดา[i] ยังคงต้องใช้ฟังก์ชัน ord() เพื่อส่งคืนจำนวนเต็มแทนที่จะเป็นถ่าน ASCII ผลลัพธ์ของการดำเนินการ xor ยังคงต้องการการจัดรูปแบบบางอย่าง เนื่องจากผลลัพธ์0bตามค่าเริ่มต้นจะแสดงbในสตริงที่เข้ารหัสสุดท้ายเท่านั้น การจัดรูปแบบที่นี่มีความสำคัญเนื่องจากฉันต้องการให้เพย์โหลดที่เข้ารหัสมีความยาวเท่ากันทุกประการกับเพย์โหลดดั้งเดิม ในกรณีนี้ 43 ไบต์

import os, codecs

def encrypt(plaintext, key):
	print ("[+] -------- Encryption --------")
	print ("[+] Key: "+str(codecs.encode(key, 'hex')))
	encrypted = ""

	for i in range(len(plaintext)):
		c = ord(plaintext[i]) ^ key[i]
		d = "{:02x}".format(c)
		#print ("i:"+str(i)+" P: "+str(plaintext[i])+" K: "+str(key[i])+" C:"+str(c)+" D:"+str(d))
		encrypted += d

	print ("[+] Encrypted string: "+encrypted)
	return encrypted

plaintext = """\x48\x31\xd2\x48\xbb\x2f\x2f\x62\x69\x6e\x2f\x73\x68\x48\xc1\xeb\x08
\x48\x89\xd9\x51\x48\x89\xe7\x52\x48\x83\xec\x08\x48\x89\x3c\x24\x48
\x89\xe6\x48\x31\xc0\xb0\x3b\x0f\x05"""
key = os.urandom(len(plaintext))
encrypted = encrypt(plaintext,key)

ผลลัพธ์สุดท้ายจะมีลักษณะดังนี้ (python3 ./program.py เข้ารหัสเพย์โหลด) ตัวเข้ารหัสที่กำหนดเอง

$ python3 encrypt.py
[+] -------- Encryption --------
[+] Key: b'81a6b9cc11b37a5ce9d32ed80bdd18393eb275088b5bff05befe12ccff9d58613b597a5e5d002401d0ee73'
[+] Encrypted string: c9976b84aa9c553e80bd01ab6395d9d236fafcd1da1376e2ecb69120f7d5d15d1f11f3b81531e4b1ebe176

ถอดรหัสลิงก์ถาวร

สำหรับการถอดรหัส ฉันต้องใช้รหัสของฉันเพื่อดำเนินการ xor เดิมอีกครั้ง แต่ต้องใช้เพย์โหลดที่เข้ารหัสด้วยคีย์ที่ใช้ร่วมกัน

import codecs

def decrypt(encrypted, key):
	print ("[+] -------- Decryption --------")
	decrypted = ""
	msg = codecs.decode(encrypted, 'hex')

	for i in range(len(msg)):
		c =  msg[i] ^ key[i]
		d = "{:02x}".format(c)
		decrypted += d

	print ("[+] Decrypted string (XX): \n"+decrypted)
	print("[+] Decrypted string (\\xXX):\n" + r"\x" + r"\x".join(decrypted[n : n+2] for n in range(0, len(decrypted), 2)))

encrypted = "ad15b360f30576bb4a0a75476da68ad1d287c22c078ad2b71929cb3de177e13fdea4a0ff4441e94195222e"
key = "e5246128482a59d923645a3405ee4b3adacf4bf556c25b504b6148d1e93f6803faec29190c7029f1ae2d2b"

decrypt(encrypted, codecs.decode(key, 'hex'))

ผลลัพธ์สุดท้ายจะมีลักษณะดังนี้ ดังนั้นเราจะลงเอยด้วยเพย์โหลดข้อความธรรมดาเริ่มต้นของเรา:

$ python3 decrypt.py
[+] -------- Decryption --------
[+] Decrypted string (XX):
4831d248bb2f2f62696e2f736848c1eb084889d9514889e7524883ec0848893c244889e64831c0b03b0f05
[+] Decrypted string (\xXX):
\x48\x31\xd2\x48\xbb\x2f\x2f\x62\x69\x6e\x2f\x73\x68\x48\xc1\xeb\x08\x48\x89\xd9\x51\x48
\x89\xe7\x52\x48\x83\xec\x08\x48\x89\x3c\x24\x48\x89\xe6\x48\x31\xc0\xb0\x3b\x0f\x05

Face-sso (By K&O) หากท่านสนใจ เครื่องสแกนใบหน้ารุ่นต่างๆ หลากหลายรุ่น หรือ ติดตั้งระบบสแกนใบหน้า สามารถติดต่อสอบถามได้โดยตรง เรามีแอดมินคอยคอบคำถาม 24 ชั้วโมงที่ Line OA เครื่องสแกนใบหน้า สามารถ ขอราคาพิเศษได้ ตามงบประมาณที่เหมาะสม สอบถามได้สบายใจทั้ง เรื่องค่าบริการ ราคา และ งบประมาณ มั่นใจเพราะเป็นราคาที่สุด คุ้มค่าที่สุด

หากท่านมีความสนใจ บทความ หรือ Technology สามารถติดต่อได้ตามเบอร์ที่ให้ไว้ด้านล่างนี้
Tel.086-594-5494
Tel.095-919-6699

One Time Pad การเข้ารหัสที่สมบูรณ์แบบ

การเข้ารหัสที่สมบูรณ์แบบ One time pad (OTP) เป็นการเข้ารหัสที่ง่ายมาก อัลกอริทึมมันเป็นแบบนี้ และเป็นการเข้ารหัสเดียวที่ได้รับการพิสูจน์แล้วว่าปลอดภัยอย่างสมบูรณ์แบบ

  • แปลงข้อมูลที่คุณต้องการเข้ารหัสเป็นไบนารี (เราเรียกว่าข้อความธรรมดา)
  • สร้างอาร์เรย์ไบนารีแบบสุ่มที่แท้จริงโดยมีความยาวเท่ากับข้อความธรรมดาของคุณ (เราเรียกสิ่งนี้ว่าแพด)
  • ดำเนินการ XOR ระดับบิตระหว่างข้อความธรรมดาและแพด ผลลัพธ์คือรหัสของเรา
  • ในการรับข้อความธรรมดาจากรหัส เราเพียงแค่ต้อง XOR รหัสด้วยแพด

OTP เป็นการเข้ารหัสเดียวที่ได้รับการพิสูจน์แล้วว่าปลอดภัยอย่างสมบูรณ์แบบ หากใช้อย่างถูกต้อง การเข้ารหัสจะไม่เปิดเผยข้อมูลเพิ่มเติมใดๆ ที่เราไม่ทราบเกี่ยวกับข้อความธรรมดา สำหรับตัวอย่างข้างต้น จากรหัสตัวเลข0011 1010 1101 1101เราทราบว่าข้อความธรรมดามีความยาวไม่เกิน 2 ไบต์ อย่างไรก็ตาม สำหรับข้อมูลที่มีความยาว 2 ไบต์ใดๆ ระหว่าง0000 0000 0000 0000และ1111 1111 1111 1111มีแพดที่เมื่อ XOR พร้อมรหัสจะให้ข้อมูลที่แน่นอนแก่เรา และเนื่องจากแพดของเราเป็นแบบสุ่มจริงๆ หากไม่มี ทางออกที่ดีที่สุดสำหรับฝ่ายตรงข้ามในการถอดรหัสรหัสคือการเดาแบบสุ่ม

แพ็ดครั้งเดียว การเข้ารหัสที่ไม่มีประโยชน์มากนัก

หาก OTP นั้นเรียบง่ายแต่มีความปลอดภัยอย่างสมบูรณ์แบบ เหตุใดเราจึงยังต้องการ AES, RSA หรือการเข้ารหัสอื่นๆ อีก คำตอบคือ เนื่องจากเพื่อความปลอดภัยอย่างสมบูรณ์ OTP จึงจำเป็นต้องใช้ในลักษณะที่เฉพาะเจาะจงมาก จะต้องเป็นไปตามข้อกำหนดดังต่อไปนี้

  • แผ่นต้องสุ่มอย่างแท้จริงและมีความยาวอย่างน้อยเท่ากับข้อความธรรมดา
  • ทั้งผู้ส่งและผู้รับต้องมีแผ่นรองและเก็บเป็นความลับ
  • ห้ามใช้แผ่นรองซ้ำ

มาดูแต่ละจุดด้านบนกัน

แผ่นต้องสุ่มอย่างแท้จริงและมีความยาวอย่างน้อยเท่ากับข้อความธรรมดา

การสร้างข้อมูลแบบสุ่มอย่างแท้จริงนั้นไม่ง่ายอย่างที่คิด โดยเฉพาะอย่างยิ่งเมื่อเราต้องการให้แผ่นมีความยาวเท่ากับข้อมูลที่เราพยายามปกป้อง ในกรณีส่วนใหญ่ คอมพิวเตอร์สามารถสร้างข้อมูลสุ่มเทียมได้เท่านั้น มันใช้อัลกอริทึมในการรับข้อมูลที่ดูเหมือนสุ่มจากเมล็ดพืช ผู้ใช้อาจเลือกเมล็ดพันธุ์นั้น หรือนำมาจากข้อมูลบางอย่างที่คาดเดาได้ยาก เช่น เวลาปัจจุบันที่แน่นอน

ตัวสร้างตัวเลขสุ่มเทียมบางตัว เช่นCryptGenRandom , YarrowหรือFortunaถูกเรียกว่าcryptographically -secure ซึ่งหมายความว่าค่าที่ให้นั้นแทบจะแยกไม่ออกจากการสุ่มจริงและเหมาะสมที่จะใช้ในการเข้ารหัส

หมายความว่าเราสามารถใช้ตัวสร้างหมายเลขสุ่มเทียมที่ปลอดภัยในการเข้ารหัส เพื่อสร้างแพดของเราได้หรือไม่ น่าเสียดาย เพราะโซ่มีความแข็งแรงพอๆ กับข้อต่อที่อ่อนแอที่สุดเท่านั้น การเข้ารหัสของเราจะปลอดภัยในการเข้ารหัสเท่านั้น ค่อนข้างดี แต่ไม่มีที่ใดใกล้เคียงสมบูรณ์แบบ

ไม่ได้หมายความว่าเราไม่สามารถมีข้อมูลแบบสุ่มอย่างแท้จริง มีวิธีการวัดเสียงรบกวนในชั้นบรรยากาศ เสียงความร้อน หรือปรากฏการณ์ควอนตัมบางอย่าง และแปลงเป็นข้อมูลแบบสุ่ม แต่วิธีนี้ซับซ้อนและช้า เราจำเป็นต้องเก็บเกี่ยวการสุ่มจากแหล่งภายนอกให้เพียงพอก่อนที่เราจะสามารถสร้างข้อมูลสุ่มได้ และยังจำเป็นต้องชดเชยอคติใดๆ ในกระบวนการวัดของเราด้วย การเข้ารหัสที่สมบูรณ์แบบ

ทั้งผู้ส่งและผู้รับต้องมีแผ่นรองและเก็บเป็นความลับ

เงื่อนไขนี้ฟังดูง่ายในตอนแรก แต่ลองคิดดูสิ หากเรามีช่องทางที่ปลอดภัยในการขนส่งแพดซึ่งมีความยาวเท่ากับข้อความธรรมดา แล้วทำไมต้องกังวลกับ OTP? เพียงใช้ช่องนั้นเพื่อแบ่งปันข้อความธรรมดาโดยตรง นี่เป็นข้อเสียเปรียบที่ใหญ่ที่สุดของ OTP และจำกัดการใช้งานอย่างมาก

บางท่านอาจสงสัยว่าทำไมเราไม่ใช้เพียงอัลกอริทึมการแลกเปลี่ยนคีย์ เป็นความจริงที่การแลกเปลี่ยนข้อมูลลับในช่องทางที่ไม่ปลอดภัยนั้นไม่ใช่ปัญหาใหม่ การเข้ารหัสคีย์สาธารณะได้แก้ไขมันได้ค่อนข้างดีด้วยอัลกอริทึมอย่าง Diffie–Hellman หรือ ECDH เป็นต้น แต่เมื่อพยายามนำไปใช้กับ OTP เราเผชิญกับอุปสรรคสำคัญสองประการ อันแรกคืออัลกอริธึมการแลกเปลี่ยนคีย์แบบดั้งเดิมได้รับการออกแบบมาสำหรับคีย์ลัดและไม่มีประสิทธิภาพเมื่อใช้แพดขนาดใหญ่ (โปรดจำไว้ว่าแพดต้องมีความยาวอย่างน้อยเท่ากับข้อความธรรมดา) และเหตุผลที่สองก็คือเรื่องของห่วงโซ่และการเชื่อมโยงที่อ่อนแออีกครั้ง ท้ายที่สุด ไม่มีอัลกอริธึมการแลกเปลี่ยนคีย์ใดที่สมบูรณ์แบบ

ห้ามใช้แผ่นรองซ้ำ

เราจะแสดงประสบการณ์เล็ก ๆ น้อย ๆ เพื่อดูว่าเหตุใดการใช้แผ่นรองซ้ำจึงเป็นความคิดที่ไม่ดี สมมติว่าฉันมีภาพนี้

ฉัน XOR ด้วยแผ่นรองและรับสิ่งนี้ซึ่งดูสุ่มพอ

ตอนนี้ฉันมีภาพอื่นที่นี่

ฉัน XOR ด้วยแผ่นเดียวกันด้านบนและรับภาพสุ่มอีกภาพ

ทุกอย่างดูโอเคใช่มั้ย? ลองเดาดูว่าผลลัพธ์คืออะไรเมื่อเรา XOR ทั้งสองรหัสด้านบน

ทันใดนั้นเราก็มีความคิดที่ดีว่าข้อความธรรมดาทั้งสองมีลักษณะอย่างไร คุณสามารถลองใช้สคริปต์ที่ฉันอัปโหลดไว้ที่นี่ได้ด้วยตัวเอง เนื่องจากฉันเคยurandomสร้างแผ่นนี้ในทางเทคนิคจึงไม่ใช่ OTP แต่ก็ดีพอสำหรับการสาธิต

OTP มีประโยชน์หรือไม่?

น่าเสียดายที่การเข้ารหัสที่เรียบง่ายแต่ปลอดภัยอย่าง OTP ไม่มีประโยชน์มากนักในทางปฏิบัติ มีกรณีใดบ้างที่เหมาะสม? ที่จริงมันเป็น OTP ช่วยให้เราสามารถประชุมล่วงหน้าได้อย่าง ปลอดภัย สมมติว่าคุณพบเพื่อนด้วยตนเองและแลกเปลี่ยนไดรฟ์ USB ที่เต็มไปด้วยข้อมูลแบบสุ่มอย่างแท้จริง ตอนนี้คุณและเพื่อนของคุณสามารถแลกเปลี่ยนข้อมูลระหว่างกันได้อย่างปลอดภัยในภายหลัง เป็นที่ชัดเจนว่าสถานการณ์ดังกล่าวมักเกิดขึ้นในหน่วยสืบราชการลับ

แอปพลิเคชัน OTP ที่มีชื่อเสียงที่สุดที่ฉันนึกถึงคือสายด่วนมอสโก-วอชิงตัน เพื่ออ้างอิงพิพิธภัณฑ์ Crypto

แทนที่จะใช้เครื่องเข้ารหัสของอเมริกาหรือรัสเซียในการเข้ารหัสข้อความ เครื่อง ETCRRM ถูกสร้างขึ้นในนอร์เวย์โดย STK 1 ซึ่งถือว่าเป็นกลางและเป็นกลาง

เนื่องจาก ETCRRM เป็น One-Time Tape machine (OTT) จึงใช้หลักการของ One-Time Pad (OTP) เมื่อใช้ร่วมกับเทปคีย์สุ่มอย่างแท้จริง เครื่อง OTT จะปลอดภัยและไม่แตกหักอย่างแน่นอน ขณะที่รัสเซียยืนกรานที่จะผลิตกุญแจของตนเอง จึงมีการตัดสินใจว่าแต่ละฝ่ายจะสร้างเทปกุญแจของตนเอง

เทปสำคัญเหล่านี้ถูกส่งโดยผู้ให้บริการขนส่งพิเศษไปยังสถานทูตที่ปลายทางอีกฝั่งหนึ่ง ซึ่งส่งเทปดังกล่าวที่ปลายทางของอีกฝ่ายหนึ่ง [9] ดังนั้น สถานทูตอเมริกันในมอสโกจึงส่งเทปสำคัญที่สถานีสายด่วนมอสโก

บทสรุป

ปัจจุบันการจัดเก็บมีราคาถูกมากจนการจัดเก็บข้อมูลหลายเทราไบต์ไม่ใช่ปัญหา และแม้ว่าจะไม่ใช่เรื่องเล็กน้อย แต่การสร้างข้อมูลแบบสุ่มอย่างแท้จริงนั้นไม่ใช่เรื่องยากเกินไป โดยเฉพาะอย่างยิ่งหากเรามีเวลาเตรียมตัวนาน ทั้งหมดนี้หมายความว่าตราบใดที่พวกเขาเข้าใจวิธีใช้อย่างถูกต้อง ทุกคนก็สามารถใช้ประโยชน์จาก OTP ได้ แล้วคุณล่ะ คุณเคยต้องการมีการประชุมที่ปลอดภัยล่วงหน้าหรือไม่ ?

Face-sso (By K&O) หากท่านสนใจ เครื่องสแกนใบหน้ารุ่นต่างๆ หลากหลายรุ่น หรือ ติดตั้งระบบสแกนใบหน้า สามารถติดต่อสอบถามได้โดยตรง เรามีแอดมินคอยคอบคำถาม 24 ชั้วโมงที่ Line OA เครื่องสแกนใบหน้า สามารถ ขอราคาพิเศษได้ ตามงบประมาณที่เหมาะสม สอบถามได้สบายใจทั้ง เรื่องค่าบริการ ราคา และ งบประมาณ มั่นใจเพราะเป็นราคาที่สุด คุ้มค่าที่สุด

หากท่านมีความสนใจ บทความ หรือ Technology สามารถติดต่อได้ตามเบอร์ที่ให้ไว้ด้านล่างนี้
Tel.086-594-5494
Tel.095-919-6699

ข้อมูลเบื้องต้นเกี่ยวกับ รหัส Pad แบบใช้ครั้งเดียว

รหัส Pad แบบใช้ครั้งเดียว ในการเข้ารหัสแผ่นแบบใช้ครั้งเดียวหรือ OTP เป็นวิธีการเข้ารหัสข้อมูลอย่างปลอดภัยจนไม่สามารถถอดรหัสได้ ที่กล่าวว่า OTP มีข้อเสียเปรียบหลักตรงที่กำหนดให้ทั้งสองฝ่ายสามารถเข้าถึง คีย์ เดียวกันได้ก่อนที่จะเข้ารหัสข้อความ

รหัสแพดแบบใช้ครั้งเดียวทำงานอย่างไร 

เมื่อใช้แป้นแบบใช้ครั้งเดียว ข้อความและรหัสลับจะต้องเริ่มทำงาน ข้อความต้นฉบับแต่ละบิต สมมติว่าเราสามารถใช้ข้อมูลไบนารีได้ จะถูกเข้ารหัสโดยใช้การXORดำเนินการกับข้อความนั้นและบิตที่สอดคล้องกันจากรหัสลับ

ทบทวน XOR 

XOR หรือ “exclusive or” เป็นตัวดำเนินการไบนารีที่ทำงานกับข้อมูลไบนารี มันจะส่งกลับtrueหากอินพุตทั้งสองตรงกันข้าม (หนึ่งเท็จและหนึ่งจริง) มิฉะนั้นจะส่งfalseกลับ

true XOR false = true
false XOR true = true
true XOR true = false
false XOR false = false

ลองดูบทความอื่นของฉันทำไมถึงเป็นเอกสิทธิ์หรือมีความสำคัญในการเข้ารหัสถ้าคุณต้องการข้อมูลเพิ่มเติม

ลงชื่อเข้าใช้ด้วยรหัสผ่านสำหรับแอป
เคล็ดลับ: รหัสผ่านสำหรับแอปไม่จำเป็นในกรณีส่วนใหญ่และเราไม่แนะนำให้ใช้ วิธีที่จะช่วยรักษาบัญชีให้ปลอดภัยอยู่เสมอคือใช้ “ลงชื่อเข้าใช้ด้วย Google” เพื่อเชื่อมต่อแอปกับบัญชี Google

รหัสผ่านสำหรับแอปคือรหัสผ่าน 16 หลักที่ให้สิทธิ์แอปหรืออุปกรณ์ที่มีความปลอดภัยน้อยในการเข้าถึงบัญชี Google รหัสผ่านสำหรับแอปใช้ได้กับบัญชีที่เปิดการยืนยันแบบ 2 ขั้นตอนไว้เท่านั้น

เมื่อใดที่ควรใช้รหัสผ่านสำหรับแอป
เคล็ดลับ: iPhone และ iPad ที่ใช้ iOS 11 ขึ้นไปไม่ต้องใช้รหัสผ่านสำหรับแอป ให้ใช้ “ลงชื่อเข้าใช้ด้วย Google” แทน

หากแอปไม่เสนอให้ “ลงชื่อเข้าใช้ด้วย Google” ให้ทำดังนี้

ใช้รหัสผ่านสำหรับแอป
เปลี่ยนไปใช้แอปหรืออุปกรณ์ที่มีความปลอดภัยมากขึ้น
สร้างและใช้รหัสผ่านสำหรับแอป
หากคุณใช้การยืนยันแบบ 2 ขั้นตอนและได้รับข้อผิดพลาด “รหัสผ่านไม่ถูกต้อง” เมื่อลงชื่อเข้าใช้ ให้ลองใช้รหัสผ่านสำหรับแอป

ไปที่บัญชี Google
เลือกความปลอดภัย
ในส่วน “การลงชื่อเข้าใช้ Google” ให้เลือกรหัสผ่านสำหรับแอป คุณอาจต้องลงชื่อเข้าใช้ หากคุณไม่มีตัวเลือกนี้แสดงว่าอาจเกิดจากสาเหตุต่อไปนี้
ไม่ได้ตั้งค่าการยืนยันแบบ 2 ขั้นตอนสำหรับบัญชี
ตั้งค่าการยืนยันแบบ 2 ขั้นตอนไว้สำหรับคีย์ความปลอดภัยเท่านั้น
บัญชีเป็นบัญชีของที่ทำงาน โรงเรียน หรือองค์กรอื่น
คุณเปิดการปกป้องขั้นสูงแล้ว
ที่ด้านล่าง ให้เลือกเลือกแอป แล้วเลือกแอปที่ใช้อยู่ จากนั้น เลือกอุปกรณ์แล้วเลือกอุปกรณ์ที่ใช้อยู่ จากนั้น สร้าง
ทำตามวิธีการเพื่อป้อนรหัสผ่านสำหรับแอป ซึ่งก็คือรหัสที่มีอักขระ 16 ตัวในแถบสีเหลืองในอุปกรณ์
แตะเสร็จ
เคล็ดลับ: โดยทั่วไปคุณจะต้องป้อนรหัสผ่านสำหรับแอปเพียงครั้งเดียวต่อแอปหรืออุปกรณ์ จึงไม่ต้องกังวลเรื่องการจำรหัสผ่าน

รหัส Pad แบบใช้ครั้งเดียว แผ่นเดียวทีละขั้นตอน 

ตัวอย่างเช่น หากเราเริ่มต้นด้วยข้อความ “คำสวัสดี” และคีย์ “ฉันไม่รู้” อันดับแรก เราจะแปลงข้อความเป็นข้อมูลไบนารี

hello world = 01101000 01100101 01101100 01101100 01101111 00100000 01110111 01101111 01110010 01100100
I not know = 01001001 00100000 01101110 01101111 01110100 00100000 01101011 01101110 01101111 01110111

ต่อไป เราจะดำเนินXORการกับข้อมูลทั้งหมด

01101000 01100101 01101100 01101100 01101111 00100000 01110111 01101111 01110010 01100100

XOR

01001001 00100000 01101110 01101111 01110100 00100000 01101011 01101110 01101111 01110111

=

00100001 01000101 00000010 00000011 00011011 00000000 00011100 00000001 00011101 00010011

ข้อมูลไบนารีที่ได้คือ “ข้อความรหัส” ในการแปลงกลับ สิ่งที่เราต้องทำคือXORข้อความเข้ารหัสที่มีคีย์ และเราจะได้รับข้อความต้นฉบับกลับมา

00100001 01000101 00000010 00000011 00011011 00000000 00011100 00000001 00011101 00010011

XOR

01001001 00100000 01101110 01101111 01110100 00100000 01101011 01101110 01101111 01110111

=

01101000 01100101 01101100 01101100 01101111 00100000 01110111 01101111 01110010 01100100

แปลงผลลัพธ์กลับเป็นข้อความและเราได้ถอดรหัสข้อความต้นฉบับแล้ว

01101000 01100101 01101100 01101100 01101111 00100000 01110111 01101111 01110010 01100100

=

hello world

รหัส Pad แบบใช้ครั้งเดียว ความลับที่สมบูรณ์แบบในแผ่น 

การเข้ารหัสได้รับการกล่าวขานว่ามีความปลอดภัยที่สมบูรณ์แบบหากผู้โจมตีที่เข้าถึงเฉพาะข้อความเข้ารหัสไม่สามารถอนุมานถึงสิ่งที่น่าสนใจเกี่ยวกับข้อความธรรมดาได้ แผ่นรองแบบใช้ครั้งเดียวมีความปลอดภัยที่สมบูรณ์แบบ ที่กล่าวว่าจะมีความปลอดภัยที่สมบูรณ์แบบก็ต่อเมื่อสามารถปฏิบัติตามเงื่อนไขต่อไปนี้ :

  1. คีย์ต้องมี ความยาว อย่างน้อยเท่ากับข้อความธรรมดา
  2. กุญแจจะต้องไม่ถูกนำมาใช้ซ้ำ
  3. กุญแจจะต้องถูกเก็บเป็นความลับอย่างสมบูรณ์ต่อโลกภายนอก แต่ทั้งสองฝ่ายแบ่งปันกัน
  4. คีย์ต้องมีการแจกแจงแบบสม่ำเสมอที่ไม่ขึ้นกับข้อความธรรมดา

รหัสซีซาร์เป็นตัวอย่างที่ดีของรหัสที่ไม่ปลอดภัยอย่างสมบูรณ์หรือ ไม่ปลอดภัย จริง ดังที่เราแสดงให้เห็นก่อนหน้านี้ เมื่อได้รับสิทธิ์เข้าถึงข้อความเข้ารหัสของรหัสซีซาร์ ผู้โจมตีสามารถเห็นตำแหน่งและรูปแบบของอักขระในข้อความธรรมดา

ปัญหาการใช้แผ่นแบบครั้งเดียวในการผลิต 

รหัสการผลิตส่วนใหญ่ไม่ปลอดภัยอย่างสมบูรณ์ แต่ “ใกล้พอ” กล่าวโดยย่อคือการแลกเปลี่ยนเกิดขึ้นเพื่อเพิ่ม ความปลอดภัยใน ทางปฏิบัติของระบบในขณะที่เสียสละ ความปลอดภัย ทางทฤษฎี ที่สมบูรณ์แบบ ของตัวเข้ารหัสเอง

ตามข้อกำหนดที่ระบุไว้ข้างต้น เป็นเรื่องยากมากที่จะติดตั้งแพดแบบใช้ครั้งเดียวที่ปลอดภัยในระบบโลกแห่งความจริง มาดูข้อกำหนดข้อแรกกัน ว่าคีย์ต้องมีความยาวอย่างน้อยเท่ากับข้อความธรรมดาที่เข้ารหัส ซึ่งหมายความว่าหากฉันต้องการเข้ารหัสเนื้อหาในฮาร์ดไดรฟ์ของคอมพิวเตอร์ ฉันต้องใช้คีย์ที่มีความยาวหลายร้อยกิกะไบต์ ไม่มีทางที่ฉันจะจำกุญแจนั่นได้ นับประสาอะไรกับการจดมันลงไป

ข้อกำหนดที่สอง กุญแจไม่สามารถใช้ซ้ำได้ เป็นเรื่องที่น่าปวดหัวมาก! ซึ่งหมายความว่าการจำคีย์จะไม่เป็นปัญหา เพราะฉันต้องการคีย์ใหม่เสมอ ไม่เพียงเท่านั้น ช่องโหว่ด้านความปลอดภัยใดก็ตามที่ถูกนำมาใช้โดยต้องสื่อสารคีย์ที่ใช้ร่วมกันกับผู้รับที่ฉันตั้งใจไว้จะถูกทำซ้ำทุกครั้งที่มีการส่งข้อความใหม่

ประการสุดท้าย ข้อกำหนดข้อสุดท้ายที่จะต้องเก็บเป็นความลับ แต่ไม่ว่าจะด้วยวิธีใดก็แจ้งไปยังผู้รับที่ตั้งใจไว้ เป็นคำสั่ง ที่ สูงส่ง ในความเป็นจริง อัลกอริธึมการเข้ารหัสแบบสมมาตรทั้งหมดประสบปัญหานี้ ดังนั้น ถ้าคุณต้องการสื่อสารกับเอนทิตีอื่น คุณอาจต้องใช้โครงร่างการเข้ารหัสแบบอสมมาตร แยกต่างหาก

ตัวอย่างรหัสแพ็ดแบบใช้ครั้งเดียวใน Go 

func encrypt(plaintext, key []byte) []byte {
	final := []byte{}
	for i := range plaintext {
		final = append(final, plaintext[i]^key[i])
	}
	return final
}

func decrypt(ciphertext, key []byte) []byte {
	final := []byte{}
	for i := range ciphertext {
		final = append(final, ciphertext[i]^key[i])
	}
	return final
}

Face-sso (By K&O) หากท่านสนใจ เครื่องสแกนใบหน้ารุ่นต่างๆ หลากหลายรุ่น หรือ ติดตั้งระบบสแกนใบหน้า สามารถติดต่อสอบถามได้โดยตรง เรามีแอดมินคอยคอบคำถาม 24 ชั้วโมงที่ Line OA เครื่องสแกนใบหน้า สามารถ ขอราคาพิเศษได้ ตามงบประมาณที่เหมาะสม สอบถามได้สบายใจทั้ง เรื่องค่าบริการ ราคา และ งบประมาณ มั่นใจเพราะเป็นราคาที่สุด คุ้มค่าที่สุด

หากท่านมีความสนใจ บทความ หรือ Technology สามารถติดต่อได้ตามเบอร์ที่ให้ไว้ด้านล่างนี้
Tel.086-594-5494
Tel.095-919-6699

การเข้ารหัส 101One Time Pad การเข้ารหัสเพียงครั้งเดียว

การเข้ารหัสเพียงครั้งเดียว นี่เป็นบทความที่สองในชุดเกี่ยวกับพื้นฐานของการเข้ารหัส : การปฏิเสธความ รับผิด : บทความเหล่านี้มีวัตถุประสงค์เพื่อการศึกษาเท่านั้น วิธีการที่อธิบายในที่นี้มีไว้เพื่อแสดงแนวคิดพื้นฐานของการเข้ารหัสเท่านั้น และอาจเหมาะสมหรือไม่เหมาะกับการใช้งานในโลกแห่งความเป็นจริง สำหรับการใช้งานที่จริงจัง เช่น การทำธุรกรรมทางการเงิน ฉันแนะนำให้จ้างผู้เชี่ยวชาญด้านความปลอดภัยและจ้างทนายความที่เกี่ยวข้องด้วย ใช้ข้อมูลและรหัสนี้ด้วยความเสี่ยงของคุณเอง ฉันไม่ขอรับผิดชอบ!

หากคุณต้องการข้อมูลเชิงลึกเกี่ยวกับการเข้ารหัสมากกว่าที่บทความแนะนำเหล่านี้มีให้ เราขอแนะนำหนังสือที่ชื่อว่าApplied Cryptographyโดย Bruce Schneier หนังสือเล่มนั้นเกือบจะไม่ได้รับการตีพิมพ์เพราะ NSA ไม่ต้องการให้ข้อมูลนี้ออกสู่สาธารณะ ใช่สำหรับการแก้ไขครั้งที่ 1!

ข้อความธรรมดา ข้อความไซเฟอร์เท็กซ์ และคีย์

เมื่อพูดถึงการเข้ารหัส คุณมักจะได้ยินคำสองคำ: ข้อความธรรมดาและข้อความเข้ารหัส

ข้อความธรรมดาคือข้อมูลที่ไม่ได้เข้ารหัสและอาจเป็นข้อความหรือข้อมูลไบนารีก็ได้

Ciphertext เป็นข้อมูลที่เข้ารหัส

ตามหลักการแล้ว ไซเฟอร์เท็กซ์จะไม่ให้ข้อมูลเกี่ยวกับธรรมชาติของข้อความธรรมดาที่สร้างมันขึ้นมา นอกเสียจากขนาดของข้อความธรรมดาเอง ไซเฟอร์เท็กซ์ที่ดีจะดูแยกไม่ออกจากตัวเลขสุ่ม ทั้งด้วยสายตามนุษย์และในทางคณิตศาสตร์

เนื่องจากจุดประสงค์ของการเข้ารหัสคือการซ่อนรูปแบบใดๆ ในข้อมูล และการเข้ารหัสที่ดีจะซ่อนรูปแบบที่มองเห็นได้ทั้งหมด ข้อยกเว้นเดียวที่เป็นไปได้สำหรับสิ่งนี้คือหากกระบวนการเข้ารหัสสร้างข้อความเข้ารหัสด้วยรูปแบบที่ทำให้เข้าใจผิดซึ่งไม่ได้ให้ข้อมูลใด ๆ เกี่ยวกับข้อความธรรมดา ฉันไม่แน่ใจว่าสิ่งนี้เกิดขึ้นจริงหรือไม่ แต่สามารถทำได้อย่างแน่นอน

อีกคำหนึ่งที่คุณจะได้ยินบ่อยๆ ก็คือ “คีย์” คีย์เป็นเพียงข้อมูลที่คุณเข้ารหัสหรือยกเลิกการเข้ารหัสข้อมูลด้วย คุณสามารถคิดว่ามันเป็นรหัสผ่าน

แผ่นเวลาเดียว

แผ่นบันทึกเวลาแบบครั้งเดียวเป็นวิธีการเข้ารหัสข้อมูลที่เรียบง่ายแต่ปลอดภัย

มันง่ายมากที่จะใช้เพียงการดำเนินการ xor และปลอดภัยมากที่ ciphertext ไม่สามารถถอดรหัสได้อย่างแท้จริงหากทำอย่างถูกต้อง

ข้อเสียคือต้องใช้ข้อมูลที่แชร์ล่วงหน้าจำนวนมาก ซึ่งจะถูกใช้หมดเมื่อคุณเข้ารหัสข้อมูล เมื่อคุณหมด คุณต้องแบ่งปันข้อมูลนี้มากขึ้นหากคุณต้องการสื่อสารกับบุคคลนั้นต่อไป

ข้อมูลที่แชร์ล่วงหน้านี้เป็นคีย์ที่ใช้สำหรับการเข้ารหัสและยกเลิกการเข้ารหัส

กำลังดำเนินการ

หากต้องการใช้แผ่นบันทึกเวลาแบบครั้งเดียว ขั้นแรกคุณต้องรวบรวมข้อมูลสุ่มจำนวนมากและแบ่งปันข้อมูลนั้นกับบุคคลที่คุณต้องการสื่อสารด้วยอย่างปลอดภัย นี่คือแพดแบบครั้งเดียว และคุณจะต้องการข้อมูลแบบสุ่มหนึ่งไบต์สำหรับข้อมูลแต่ละไบต์ที่คุณต้องการส่งไปยังบุคคลนั้น ขั้นตอนนี้ยังเป็นปมของการรักษาความปลอดภัย คุณต้องแน่ใจว่าไม่มีใครสามารถรับ one time pad ยกเว้นเป้าหมายที่คุณต้องการ และคุณต้องแน่ใจว่าคุณมีข้อมูลสุ่มคุณภาพสูง (รายละเอียดเพิ่มเติมในภายหลัง)

ในการเข้ารหัสข้อมูล คุณต้องใช้หนึ่งไบต์จากแป้นเวลาหนึ่งไบต์สำหรับข้อมูลแต่ละไบต์ที่คุณต้องการเข้ารหัสและ XOR พร้อมกัน เมื่อคุณทำเสร็จแล้ว คุณจะทิ้งไบต์ที่ใช้แล้วของไทม์แพดครั้งเดียวทิ้งไปและไม่ใช้มันอีก การเข้ารหัสเพียงครั้งเดียว

จากนั้น คุณส่งข้อความไซเฟอร์ไปยังบุคคลที่คุณแบ่งปันข้อมูลไทม์แพดล่วงหน้าด้วย

ในการถอดรหัสข้อมูล บุคคลนั้น xor แต่ละไบต์ของข้อมูลที่เข้ารหัสด้วยหนึ่งไบต์ของแป้นเวลาหนึ่งไบต์ และพวกเขายังทิ้งแต่ละไบต์ที่ใช้ของแป้นเวลาเดียวทิ้งไปเหมือนกับที่คุณทำ

เมื่อเสร็จสิ้นการถอดรหัส พวกเขาจะมีข้อมูลข้อความล้วน และแป้นเวลาเดียวจะอยู่ในสถานะเดียวกับที่คุณอยู่ (เช่น หมายเลขถัดไปจะเป็นหมายเลขถัดไปของคุณ)

จากที่นี่คุณสามารถล้างและทำซ้ำได้จนกว่าข้อมูลแผ่นเวลาจะหมด

ง่ายมาก และตราบใดที่ไม่มีใครมีข้อมูลไทม์แพดของคุณ และข้อมูลไทม์แพดของคุณนั้นสุ่มอย่างแท้จริง จะไม่มีใครสามารถถอดรหัสไซเฟอร์เท็กซ์ของคุณและรับเพลนเท็กซ์ได้

ความสำคัญของการสุ่ม

นอกจากการส่งข้อมูลแบบสุ่มอย่างปลอดภัยแล้ว ประเด็นสำคัญอื่น ๆ ของการรักษาความปลอดภัยที่ฉันกล่าวถึงคือคุณภาพของตัวเลขสุ่มในแป้นเวลาของคุณ

เหตุผลนี้สำคัญเพราะหากตัวเลขไม่สุ่มจริง ๆ ข้อมูลจะมีรูปแบบ หากมีรูปแบบในข้อมูล ผู้คนอาจค้นพบรูปแบบเหล่านั้นได้ ดังนั้นจึงสามารถแยกข้อความธรรมดาออกจากคีย์และยกเลิกการเข้ารหัสข้อมูลบางส่วนหรือทั้งหมดของคุณได้

ความสุ่มเกิดขึ้นได้ทุกที่ในการเข้ารหัส ทั้งในอินพุตและเอาต์พุตไปยังอัลกอริทึมการเข้ารหัส ด้วยเหตุนี้ ข้อมูลแบบสุ่มอย่างแท้จริงจึงค่อนข้างเป็นสินค้าสำหรับนักเข้ารหัส เนื่องจากการใช้ข้อมูลสุ่มซ้ำหมายความว่าข้อมูลนี้มีความปลอดภัยน้อยกว่าเล็กน้อย (ผู้โจมตีจะมีรูปแบบในการหาความรู้หากคุณใช้ข้อมูลสุ่มซ้ำ!) ข้อมูลดังกล่าวจึงเป็นสินค้าโภคภัณฑ์ที่บริโภคได้!

อันที่จริง มีหนังสือที่มีชื่อเสียงมากมายที่ไม่มีอะไรนอกจากตัวเลขสุ่มหลายร้อยหน้าที่สร้างขึ้นจากแหล่งต่างๆ ในโลกแห่งความเป็นจริง เช่น การนำความเร็วลมเมื่อเวลาผ่านไปในจูโน อลาสกา และคูณด้วยไฟฟ้าสถิตที่รวบรวมจากเสาอากาศวิทยุซึ่งก็คือ ปรับเป็นเดดแอร์ เมื่อใช้ข้อมูลในโลกแห่งความจริงเช่นนั้น ผู้คนจะค่อนข้างแน่ใจว่าข้อมูลนั้นไม่มีรูปแบบที่มองเห็นได้ พวกเขาเพียงแค่ต้องระวังนักฟิสิกส์ที่น่ารำคาญเหล่านั้นที่ปลดล็อกธรรมชาติของจักรวาลและค้นหารูปแบบในการแผ่รังสีพื้นหลัง

ฉันไม่ได้ล้อเล่นเกี่ยวกับหนังสือพวกนี้นะ ลองดูสิ นี่คือหนังสือประเภทนั้นเล่มหนึ่ง!
ตัวเลขสุ่มหลักล้านที่มีค่าเบี่ยงเบนปกติ 100,000 ค่า

การใช้ตัวเลขสุ่มจากหนังสือที่ตีพิมพ์ทำให้ตัวเลขสุ่มของคุณสุ่มน้อยลงเล็กน้อย (เนื่องจากคนอื่นมีหนังสือด้วย และผู้โจมตีอาจสังเกตเห็นมันบนชั้นหนังสือของคุณหรือบางอย่าง) แต่ตราบใดที่คุณไม่ใช้แค่ตัวเลขของหนังสือตัวแรก หรือหน้าสุดท้าย (หรืออย่างอื่นที่สามารถคาดเดาได้) และหนังสือมีตัวเลขสุ่มคุณภาพสูงจริง ๆ ก็น่าจะใช้ได้

คุณยังสามารถซื้อข้อมูลสุ่มคุณภาพสูงจำนวนมากทางออนไลน์ได้จากที่ต่างๆเช่นRandom.org

ผู้อ่านที่ชาญฉลาดอาจถามว่า “ทำไมฉันไม่ใช้ตัวสร้างตัวเลขสุ่มหลอกในแต่ละด้านและไม่เคยใช้ข้อมูลแผ่นเวลาเดียวหมด”

ถ้ามีคนรู้ PRNG ที่คุณกำลังใช้และ seed ของคุณ พวกเขาจะสามารถถอดรหัสข้อมูลของคุณได้เหมือนกับที่เป้าหมายของคุณสามารถทำได้

อย่างไรก็ตาม การตั้งค่าประเภทนี้อาจเหมาะสมในบางครั้งหากคุณทราบความเสี่ยงและยอมรับได้ ตรวจสอบหน้าวิกิพีเดียนี้สำหรับข้อมูลเพิ่มเติม: เครื่องสร้าง
หมายเลขหลอกเทียมที่ปลอดภัยด้วยการเข้ารหัส

การโจมตีเฉพาะต่อการสุ่ม

ตัวอย่างเช่น สมมติว่าแทนที่จะใช้ตัวเลขสุ่ม ข้อมูลแป้นเวลาเดียวของคุณจะเป็น 0xFFFFFFFF ทั้งหมด และคุณกำลังใช้ข้อมูลนี้เพื่อเข้ารหัสไฟล์ข้อความ (เช่น บทความนี้)

เมื่อคุณเข้ารหัสข้อมูลของคุณโดย XORing แต่ละไบต์เทียบกับ 255 (0xFF) บิตทั้งหมดของแต่ละไบต์จะถูกพลิกจาก 0 เป็น 1 หรือ 1 เป็น 0

แม้ว่าจะเป็นเรื่องจริงที่จะทำให้ข้อมูลไม่สามารถอ่านได้ และดูเหมือนเป็นการสุ่ม ข้อมูลขยะในสายตามนุษย์ แต่ในทางคณิตศาสตร์แล้ว มันเป็นเรื่องที่แตกต่างออกไปมาก

หากมีคนวิเคราะห์ข้อความไซเฟอร์ของคุณ ก่อนอื่นพวกเขาจะสังเกตเห็นว่าค่าไบต์ 154 (ซึ่งดูเหมือน Ü และมีค่าเลขฐานสองเท่ากับ 10011010) เกิดขึ้นในข้อความไซเฟอร์เท็กซ์ในปริมาณเดียวกับที่ตัวอักษร ‘e’ ปรากฏในข้อความภาษาอังกฤษทั่วไป เอกสาร. นี่อาจเป็นเรื่องฉลาดเพราะค่า 154 นั้นเป็นเพียงบิตพลิกของ ‘e’ ซึ่งมีค่าไบต์ 105 และค่าไบนารี 1100101 (บิตไบนารีถูกพลิกเนื่องจาก XOR เทียบกับ 0xFF)

จากนั้น พวกเขาอาจสังเกตเห็นเช่นเดียวกันกับตัวอักษรอื่นๆ… ค่าอื่นๆ บางอย่างเกิดขึ้นบ่อยเท่าที่คุณคาดหวังให้ ‘o’ ปรากฏในภาษาอังกฤษ หรือ ‘m’ เป็นต้น

ในไม่ช้าพวกเขาก็เห็นภาพที่ชัดเจนว่านี่คือข้อความธรรมดาภาษาอังกฤษ และพวกเขาสามารถเริ่มแทนที่ตัวอักษรด้วยสิ่งที่ดูเหมือนว่าควรจะเป็นในเชิงสถิติ (สำหรับตัวอักษรที่มีนัยสำคัญทางสถิติ)

หลังจากนั้น พวกเขาจะมีข้อความธรรมดาบางส่วนของคุณ และการค้นหาส่วนที่เหลือก็คล้ายกับการเล่นซูโดกุ… การหาว่าตัวอักษรใดพอดีกับตำแหน่ง โดยพิจารณาจากวิธีการสะกดคำ จากนั้นทำการค้นหา / แทนที่ในเอกสารทั้งหมดสำหรับแต่ละตัวอักษร คุณคิดออก

ในท้ายที่สุด พวกเขามีข้อความธรรมดาของคุณและการเข้ารหัสของคุณล้มเหลว

นี่เป็นกรณีที่รุนแรงซึ่งง่ายต่อการทำลาย แต่หวังว่าคุณจะเห็นว่าถ้าคุณใช้ตัวเลขสุ่มที่มีคุณภาพต่ำกว่าเล็กน้อย (เช่น ฟังก์ชัน rand() ในตัวของ C++ ไม่ว่าคุณจะใช้ srand(time(0) หรือไม่ก็ตาม )) หรือไม่!) ที่คุณเปิดตัวเองเพื่อโจมตี และมันสามารถประนีประนอมกระแสการสื่อสารทั้งหมดของคุณได้

ต้องการข้อมูลที่แชร์ล่วงหน้าน้อยลง

คุณสามารถแก้ไขอัลกอริทึม one time pad เพื่อใช้ข้อมูลที่แบ่งปันล่วงหน้าน้อยลง หากคุณตกลงกับการเปลี่ยนแปลงในโปรไฟล์ความปลอดภัยของคุณ (ข้อมูลของคุณอาจอ่อนแอลงเมื่อถูกโจมตีบ้าง

มีหลายวิธีในการถลกหนังแมว แต่ฉันจะพูดถึงสองสามวิธี

วิธีหนึ่งคือสร้างข้อมูลสุ่มเพิ่มเติมจากข้อมูลสุ่มที่คุณมี ตัวอย่างเช่น หากคุณและบุคคลที่คุณแบ่งปันข้อมูลล่วงหน้าด้วยตกลงร่วมกันในโปรโตคอลของ MD5 ที่แฮชทุกๆ 100 ไบต์ของข้อมูลไทม์แพดหนึ่งครั้งเพื่อสร้างไบต์สุ่มมากขึ้น ซึ่งคุณสามารถสอดแทรกข้อมูลไทม์แพดของคุณ คุณจะต้อง วิธีสร้างข้อมูลแพดครั้งเดียวมากกว่าที่คุณรวบรวมหรือแชร์กับบุคคลอื่นถึง 16% (เพิ่มขึ้น 16% เนื่องจากแฮช MD5 ของบล็อก 100 ไบต์แยกแฮช 16 ไบต์ของตัวเลขที่ดูเหมือนเป็นตัวเลขสุ่ม – ดูบทความก่อนหน้าเกี่ยวกับการแฮชสำหรับข้อมูลเพิ่มเติม!)

อย่างไรก็ตาม การทำเช่นนี้ทำให้ข้อมูล “สุ่ม” *ค่อนข้าง* มีคุณภาพต่ำลงอย่างเห็นได้ชัด เนื่องจากมีรูปแบบสำหรับข้อมูลสุ่มบางส่วน แม้ว่ารูปแบบนั้นจะไม่ชัดเจน หากมีใครทำการวิเคราะห์ข้อมูลทางคณิตศาสตร์แบบแฟนซี เทคนิคประเภทนี้อาจทำให้รูปแบบครอบตัดซึ่งนำไปสู่ ข้อความธรรมดาบางส่วน

อีกวิธีหนึ่งในการทำให้แป้นเวลาของคุณไปได้ไกลกว่านั้นก็คือ แทนที่จะ XORing ข้อมูลแป้นเวลาเดียวกับข้อความธรรมดาและข้อความเข้ารหัสเพื่อเข้ารหัสและยกเลิกการเข้ารหัส คุณสามารถใช้แป้นเวลาเดียวเพื่อให้คีย์ (รหัสผ่าน) แก่คุณเพื่อเข้ารหัส / ถอดรหัสการสื่อสารแต่ละครั้ง .

ตัวอย่างเช่น หากคุณและบุคคลที่คุณกำลังสื่อสารด้วยตกลงล่วงหน้าเกี่ยวกับอัลกอริธึมการเข้ารหัสคีย์แบบสมมาตร (เพิ่มเติมเกี่ยวกับหัวข้อนี้ในบทความถัดไป!) ที่ใช้คีย์การเข้ารหัสขนาด 16 ไบต์ คุณสามารถใช้บล็อกขนาด 16 ไบต์ทุกๆ บล็อกได้หนึ่งครั้ง แพดข้อมูลสำหรับข้อความเดียวทั้งหมดไม่ว่าข้อความนั้นจะใหญ่แค่ไหนก็ตาม

ตัวอย่างเช่น คุณสามารถเข้ารหัสข้อมูล 2GB โดยใช้ 16 ไบต์แรกของไทม์แพด จากนั้นส่งไปยังบุคคลนั้น จากนั้นคุณเข้ารหัส 500MB ด้วย 16 ไบต์ถัดไปและส่งไปยังบุคคลนั้น

คุณใช้ 32 ไบต์ของ one time pad ของคุณอย่างมีประสิทธิภาพเพื่อเข้ารหัสข้อมูล 2.5GB ซึ่งเป็นอัตราส่วนที่ดีอย่างเหลือเชื่อเมื่อเทียบกับโปรโตคอล one time pad แบบเดิมซึ่งต้องใช้ข้อมูลแบบสุ่มของ one time pad ที่แชร์ล่วงหน้า 2.5GB

หากคุณใช้เส้นทางนี้ ข้อความเข้ารหัสของคุณจะเสี่ยงต่อการโจมตีอะไรก็ตามที่อัลกอริทึมการเข้ารหัสคีย์สมมาตรของคุณมีความเสี่ยง หากอัลกอริทึมที่คุณใช้อยู่มีข้อบกพร่องร้ายแรงที่นักคณิตศาสตร์ค้นพบ (เช่น มีวิธีง่ายๆ ในการกู้คืนข้อความธรรมดา – สิ่งนี้เกิดขึ้นค่อนข้างบ่อย เชื่อหรือไม่!) ช่องทางการสื่อสารทั้งหมดของคุณเสียหาย ในขณะที่ ด้วยแป้นเวลาเพียงครั้งเดียว คุณภาพของตัวเลขสุ่มของคุณ และความปลอดภัยของข้อมูลที่แชร์ล่วงหน้าเท่านั้นที่กำหนดความปลอดภัย ดังนั้นจึงมีข้อดีและข้อเสียที่ต้องชั่งน้ำหนัก

จุดอ่อนอื่น ๆ

มีหลายวิธีในการโจมตีเทคนิคการเข้ารหัสแต่ละแบบ และหากคุณจริงจังกับการเข้ารหัส คุณต้องอ่านข้อมูลหลาย ๆ อย่างและฉลาดอย่างยิ่ง โดยคำนึงถึงทุกสถานการณ์ที่เป็นไปได้ที่คนอื่นอาจนึกถึง

การรักษาความปลอดภัยเป็นเรื่องยาก เพราะบ่อยครั้งคุณมีเวลาจำกัดในการติดตั้งระบบรักษาความปลอดภัย (เนื่องจากคุณต้องจัดส่งซอฟต์แวร์หรือเปิดบริการสู่สาธารณะในสักวันหนึ่ง) และแน่นอนว่ามีผู้โจมตีมากกว่าที่มีผู้เชี่ยวชาญด้านความปลอดภัยอยู่ในตัวคุณ ทีม และพวกเขามีเวลาทั้งหมดในโลกเพื่อค้นหาสิ่งที่คุณพลาดไป! เช่นเดียวกับที่ไม่มีการพักผ่อนสำหรับคนชั่ว อาชีพรักษาความปลอดภัยก็เช่นกัน

ฉันได้กล่าวถึงคุณภาพของตัวเลขสุ่มของคุณและความปลอดภัยของข้อมูลที่แบ่งปันล่วงหน้าของคุณเป็นแกนหลักในการป้องกันผู้ที่รับข้อความธรรมดาของคุณจากข้อความไซเฟอร์ของคุณ แต่ก็มีอีกวิธีในการโจมตีช่องทางการสื่อสารเช่นกัน

กล่าวคือ หากมีคนดักฟังข้อความระหว่างคุณและบุคคลเป้าหมายของคุณ พวกเขาอาจไม่สามารถดึงข้อความธรรมดาของคุณออกมาได้ แต่ถ้าพวกเขาสามารถป้องกันไม่ให้ข้อความนั้นไปถึงเป้าหมายของคุณได้ และทำในลักษณะที่เป็นคุณ’ หากไม่ทราบสิ่งนี้ พวกเขาสามารถทำลายช่องทางการสื่อสารของคุณได้อย่างสมบูรณ์

เหตุผลของเรื่องนี้คือการทำเช่นนี้ทำให้ one time pad ของคุณและบุคคลเป้าหมายไม่ซิงค์กัน เมื่อคุณทิ้งข้อมูล one time pad ที่บุคคลเป้าหมายไม่ได้ทิ้งไป ซึ่งหมายความว่าตัวเลขสุ่มที่คุณใช้ในการเข้ารหัสข้อมูลไม่ใช่ตัวเลขเดียวกับที่บุคคลเป้าหมายของคุณกำลังถอดรหัสข้อมูลด้วย ดังนั้นพวกเขาจะได้รับขยะ ข้อมูลสุ่มเป็นเอาต์พุตและไม่สามารถกู้คืนข้อความธรรมดาได้

ผู้ประสงค์ร้ายที่อยู่ตรงกลางสามารถขัดขวางความสามารถในการสื่อสารของคุณอย่างปลอดภัย!

นอกจากนี้ หากบุคคลสามารถแก้ไข ORDER ที่บุคคลเป้าหมายได้รับข้อความที่เข้ารหัสได้ พวกเขาจะสามารถทำลายช่องทางดังกล่าวได้เช่นกัน (อย่างน้อยก็ชั่วคราว) เนื่องจากจะทำให้ผู้รับไม่ได้เข้ารหัสข้อความด้วย ข้อมูลผิดชิ้น ข้อความถัดไปที่บุคคลนั้นได้รับจะไม่สามารถเข้ารหัสได้ในกรณีนี้ เนื่องจากจำนวนไบต์ที่เท่ากันถูกใช้โดยข้อความที่ไม่เรียงลำดับ ราวกับว่าพวกเขามาในลำดับที่ถูกต้อง

นี่ไม่ใช่ชายดั้งเดิมในการโจมตีตรงกลางแต่เป็น *A* ชายในการโจมตีตรงกลางอย่างแน่นอน

เช่นเดียวกับหลายสิ่งหลายอย่าง มักจะมีความเชื่อมโยงที่แปลกและไม่ชัดเจนระหว่างเรื่องต่างๆ ในกรณีนี้ วิธีหนึ่งในการป้องกันการโจมตีประเภทนี้สำหรับข้อความที่สูญหายหรือสั่งซื้อใหม่คือการใช้อัลกอริทึมประเภทต่างๆ ที่ใช้ในการเขียนโปรแกรมเครือข่าย (เช่นที่ใช้ใน TCP/IP) เพื่อให้แน่ใจว่า “รับประกัน” และ “ตามลำดับ” ” การสื่อสารระหว่างคอมพิวเตอร์สองเครื่องหรือบุคคล

ไปตามเส้นทางนี้ เช่นเดียวกับที่คอมพิวเตอร์บนอินเทอร์เน็ตสามารถรู้ได้เมื่อมีข้อความ B แต่ยังไม่ได้รับข้อความ A หรือเมื่อพวกเขาส่งข้อความถึงบุคคลอื่นที่ไม่เคยได้รับ คุณก็สามารถทราบได้เช่นกัน หากข้อความไปถึงเป้าหมาย และพวกเขาจะสามารถทราบได้ว่าได้รับข้อความผิดปกติหรือไม่

จนกว่าจะถึงครั้งต่อไป!

นั่นคือสาระสำคัญของแผ่นเวลาและฉันหวังว่าคุณจะพบว่ามันน่าสนใจ!

ต่อไป ฉันจะพูดถึงอัลกอริทึมคีย์สมมาตรซึ่งเป็นวิธีการเข้ารหัสแบบดั้งเดิมที่คุณใช้รหัสผ่านเพื่อปกป้องข้อมูล

สำหรับผู้ที่สนใจในการแคร็กข้อมูลที่เข้ารหัส (ซึ่งในทางเทคนิคแล้วขัดต่อDMCA ใน ทุกวันนี้ แต่เคยเป็นกิจกรรมทางวิชาการทั่วไป และเป็นวิธีกำจัดอัลกอริทึมที่ไม่ปลอดภัยออก) นี่คืออาหารอันโอชะสำหรับคุณ เป็นข้อมูลที่เข้ารหัสด้วยรหัสเลขฐานสิบหก ทุกๆ 2 อักขระฐานสิบหกเท่ากับหนึ่งไบต์ของข้อมูลที่เข้ารหัส หากคุณใช้ข้อมูลจากบทความ คุณควรจะสามารถถอดรหัสได้ (มีทั้งวิธีที่ง่ายและยาก)

Face-sso (By K&O) หากท่านสนใจ เครื่องสแกนใบหน้ารุ่นต่างๆ หลากหลายรุ่น หรือ ติดตั้งระบบสแกนใบหน้า สามารถติดต่อสอบถามได้โดยตรง เรามีแอดมินคอยคอบคำถาม 24 ชั้วโมงที่ Line OA เครื่องสแกนใบหน้า สามารถ ขอราคาพิเศษได้ ตามงบประมาณที่เหมาะสม สอบถามได้สบายใจทั้ง เรื่องค่าบริการ ราคา และ งบประมาณ มั่นใจเพราะเป็นราคาที่สุด คุ้มค่าที่สุด

หากท่านมีความสนใจ บทความ หรือ Technology สามารถติดต่อได้ตามเบอร์ที่ให้ไว้ด้านล่างนี้
Tel.086-594-5494
Tel.095-919-6699

กระแส Chatbots แชทบอทเริ่มตอนนี้จะทันกระแสหรือไม่?

กระแส Chatbots ให้คำมั่นสัญญามากมายในฐานะเครื่องมือซอฟต์แวร์ แต่ความก้าวหน้าของ NLP ในอนาคตอันใกล้จะทำให้พวกเขาสอดคล้องกับโฆษณามากขึ้น

แม้จะมีกระแสโฆษณาอยู่หลายปี—และความก้าวหน้าทางเทคโนโลยีที่น่าทึ่งบางอย่าง—หลายคนคิดว่าแชทบอทเป็นสิ่ง ทดแทนที่ น่าหงุดหงิดยิ่งกว่าสำหรับศูนย์บริการนอกชายฝั่ง ฉันเป็น CEO ของบริษัทแช ทบอ ท และแม้แต่ฉันก็ยังบอกชื่อแชทบอทที่ยอดเยี่ยมไม่ได้เลย

ฉันไม่คิดว่านั่นเป็นแผนการเล่นแชทบอทของใคร มันไม่ใช่ แผนการเล่น ของฉัน อย่างแน่นอน เมื่อฉันสร้าง Botpress เวอร์ชันแรกในปี 2558

แล้วเรามาอยู่ที่นี่ได้อย่างไร? และแชทบอทจะทันกับโฆษณาหรือไม่? ฉันจะไม่เขียนสิ่งนี้ถ้าฉันไม่เชื่อว่าคำตอบคือใช่ แต่อย่าเชื่อคำพูดของฉัน มาสำรวจสิ่งที่เกิดขึ้นกับเทคโนโลยีร่วมกันและดูว่าคุณเห็นด้วยหรือไม่

ทำไมแชทบอทถึงห่วย?

แม้จะมีความก้าวหน้าในการประมวลผลภาษาธรรมชาติ (NLP) แต่แชทบอทส่วนใหญ่ใช้รูปแบบพื้นฐานที่สุดเท่านั้น พวกเขาแยกวิเคราะห์การสนทนาผ่านการจัดประเภทเจตนา —พยายามจัดระเบียบทุกสิ่งที่ลูกค้าอาจพูดลงในถังอุปาทานตามความตั้งใจในการสอบถามของพวกเขา

ตัวอย่างเช่น “สวัสดี ฉันต้องการเปลี่ยนที่อยู่สำหรับการเรียกเก็บเงินของฉัน” อาจจัดอยู่ในกลุ่มการเปลี่ยนแปลงที่อยู่สำหรับการเรียกเก็บเงิน —และแชทบอทจะตอบกลับตามนั้น

แม้ว่าสิ่งนี้จะสามารถรองรับคำขอทั่วไปบางข้อได้ แต่ก็ยากที่จะให้และรักษาประสบการณ์ที่น่าพึงพอใจของลูกค้า ในการจัดประเภทการสนทนาของลูกค้า ผู้ออกแบบการสนทนาต้องคาดการณ์ถึงเจตนาที่ถูกต้องและเพิ่มทริกเกอร์การสนทนาที่เป็นไปได้ทั้งหมดสำหรับเจตนาเหล่านั้น  

แม้ว่าเจตจำนงเหล่านั้นจะได้รับการคาดหมายอย่างดีด้วยวลีทริกเกอร์ที่ดี แต่แชทบ็อตก็สามารถส่งมอบได้ด้วยเจตนาเดียวเท่านั้น การสนทนากับคนจริงๆ อาจเป็นเรื่องยุ่งเหยิงและเต็มไปด้วยเรื่องเล็กน้อย และผู้คนมักต้องการหลายสิ่งพร้อมกัน การจัดประเภทตามเจตนาจะค้นหาเจตนาที่การสนทนาคล้ายกันและผลักดันการตอบกลับสำเร็จรูปสำหรับบัคเก็ตนั้น แชทบอทอาจทราบคำตอบสำหรับคำถามที่ว่า “ฉันสามารถเปลี่ยนที่อยู่สำหรับการเรียกเก็บเงินเพื่อให้ตรงกับโปรไฟล์อื่นในบัญชีของฉันได้หรือไม่” แต่มีข้อมูลอยู่ในการตั้งค่าบัญชีไม่ใช่การเปลี่ยนแปลงที่อยู่

ในมุมมองของฉัน สิ่งนี้แทบไม่มีคุณสมบัติเป็น AI เลย—มันใกล้เคียงกับฟังก์ชันการค้นหามากกว่า คุณไม่มีการสนทนา คุณกำลังโต้ตอบกับเครื่องสนทนา เล่นข้อความการผจญภัยเช่นZork ฟังก์ชันนี้เกิดข้อผิดพลาดได้ง่ายและต้องสร้างงานจำนวนมาก แต่ที่สำคัญกว่านั้น ฟังก์ชันนี้ผิดโดยพื้นฐาน นี่คือตัวอย่างว่าทำไม:

ลองนึกภาพโปรแกรมจำแนกภาพที่ระบุสัตว์และเครื่องเรือน คุณป้อนรูปภาพที่ติดป้ายไว้กองโต—นี่คือสัตว์ นี่คือเฟอร์นิเจอร์—และมันจะเรียนรู้ที่จะจดจำพวกมัน สมมติว่า ณ จุดหนึ่งคุณต้องแยกความแตกต่างระหว่างหมีกับสุนัขและโซฟาออกจากเก้าอี้ ตอนนี้คุณต้องติดป้ายกำกับทุกอย่างใหม่เพื่อให้เฉพาะเจาะจงมากขึ้น ตอนนี้ สมมติว่าโปรแกรมพบหนังหมีบนโซฟา—นั่นคือการแข่งขันหลายรายการ ดังนั้นตอนนี้คุณมีข้อขัดแย้ง กระแส Chatbots

ตามหลักการแล้ว แชทบอทควรสามารถรับข้อความค้นหาของผู้ใช้ เข้าใจสิ่งที่ผู้ใช้พยายามบรรลุ และจากนั้นช่วยให้ผู้ใช้บรรลุวัตถุประสงค์ ไม่ว่าจะด้วยการดำเนินการหรือสร้างคำตอบที่เป็นประโยชน์และฟังดูเป็นธรรมชาติ

นี่ไม่ใช่สิ่งที่แชทบอทนำเสนอในปัจจุบัน แต่พวกเขายกย่องบอทถามตอบที่จัดประเภทข้อความค้นหาและออกคำตอบสำเร็จรูป อย่างไรก็ตาม ความก้าวหน้าล่าสุดในหลาย ๆ ด้านของ AI เปิดโอกาสให้สร้างสิ่งที่ดีกว่า 

แชทบอทสามารถทำอะไรได้บ้าง และทำไมเราถึงยังทำไม่ได้?

ทุกวันนี้ มีวิธีการออกแบบแชทบอทที่ดีกว่าและ “ไม่ตั้งใจ” พวกเขาอาศัยความก้าวหน้าในด้าน AI, การเรียนรู้ของเครื่อง (ML) และ NLP เช่นการดึงข้อมูล การตอบคำถาม การเข้าใจภาษาธรรมชาติ (NLU) และการสร้างภาษาธรรมชาติ (NLG)

ในไม่ช้า แชทบอทจะใช้ประโยชน์จากความก้าวหน้าเหล่านี้เพื่อมอบประสบการณ์ลูกค้าที่เหนือกว่าบอทถามตอบที่เป็นพื้นฐานในปัจจุบัน ลองนึกภาพแชทบอทที่สามารถ:

  • ทำความเข้าใจคำถามที่ซับซ้อนด้วยความแตกต่างเล็กน้อยของคำพูดของมนุษย์
  • สร้างคำตอบที่เหมือนมนุษย์สำหรับคำถามที่ซับซ้อนโดยดึงจากฐานความรู้
  • ใช้ภาษาธรรมชาติเพื่อสืบค้นตารางที่มีโครงสร้าง เช่น ฐานข้อมูลเที่ยวบิน
  • สร้างวลีที่ฟังดูเป็นธรรมชาติซึ่งตรงกับภาษาถิ่นหรือน้ำเสียงของแบรนด์

แม้ว่าแชทบอทที่มีคุณสมบัติเหล่านี้จะมอบประสบการณ์ที่ยอดเยี่ยมแก่ผู้ใช้ แต่การอัปเกรดจากเวอร์ชันที่มีอยู่นั้นต้องใช้ความพยายามมากกว่าที่องค์กรส่วนใหญ่เต็มใจรับ พวกเขาได้ลงทุนหลายปีในการสร้างแชทบอทตามความตั้งใจ รวมถึงชุดข้อมูลการฝึกอบรมและการเขียนคำตอบสำเร็จรูป 

ตามหลักการแล้ว นักพัฒนาจะดึงข้อมูลออกจากแชทบอทเหล่านี้และสร้างเป็นบอทที่ใหม่กว่าและซับซ้อนกว่า ขออภัย เป็นไปไม่ได้ ชุดข้อมูล Chatbot ถูกสร้างขึ้นและดูแลให้ตรงกับวิธีการทำงานของบอทโดยเฉพาะ ชุดข้อมูลที่ได้รับการฝึกฝนเทียบกับชุดการจัดประเภทความตั้งใจเฉพาะนั้นไม่มีประโยชน์สำหรับแชทบอทรุ่นใหม่ที่ไม่มีความตั้งใจซึ่งใช้แนวคิด NLP ขั้นสูงกว่า ด้วยเหตุนี้ องค์กรที่ต้องการใช้แชทบอทขั้นสูงจะต้องสร้างมันขึ้นมาใหม่และชุดข้อมูลตั้งแต่ต้น

ทำไมมันถึงคุ้มค่าที่จะสร้างใหม่? NLP เป็นสาขาที่มีการพัฒนาอย่างรวดเร็ว และการเปลี่ยนแปลงกำลังจะเกิดขึ้นซึ่งจะช่วยให้แชทบอททำตามคำสัญญาได้ ผมขอยกตัวอย่างที่เป็นรูปธรรม

ความก้าวหน้าของ NLP สี่ประการที่จะช่วยให้แชทบอทดำเนินชีวิตตามโฆษณา

แบบจำลอง NLP เป็น “สมอง” ของแชทบอทโดยพื้นฐานแล้ว

แชทบอทตามความตั้งใจใช้โมเดล NLP พื้นฐานที่จับคู่อินพุตของผู้ใช้กับชุดข้อมูลของตัวอย่างที่มีป้ายกำกับ และพยายามจัดหมวดหมู่พวกมัน อย่างไรก็ตาม ในช่วงไม่กี่ปีที่ผ่านมา เราได้เห็นความก้าวหน้าอย่างมากในโมเดล NLP และเทคโนโลยีที่เกี่ยวข้อง ซึ่งจะส่งผลกระทบอย่างมากต่อความสามารถของแชทบอทในการตีความและทำความเข้าใจข้อความค้นหาของผู้ใช้ เหล่านี้รวมถึง:

รองรับ NLP รุ่นใหญ่

ตั้งแต่ปี 2018 เป็นต้นมา โมเดล NLP ได้เติบโตขึ้นแบบทวีคูณ กราฟด้านล่างแสดงให้เห็นว่าจำนวนพารามิเตอร์ในโมเดล NLP สมัยใหม่เพิ่มขึ้น อย่างรวดเร็วเพียงใด

คุณสามารถนึกถึงพารามิเตอร์ที่เปรียบได้กับไซแนปส์เดียวภายในสมองของมนุษย์ Nvidia ประมาณการว่าภายในปี 2023 จะพัฒนาโมเดลที่ตรงกับค่า Parameter-for-synapse ของสมองมนุษย์โดยเฉลี่ยที่ 100 ล้านล้านพารามิเตอร์ เพื่อรองรับโมเดลขนาดใหญ่เหล่านี้ Nvidia เพิ่งเปิดตัวHopper engineซึ่งสามารถเทรนโมเดลขนาดใหญ่เหล่านี้ได้เร็วขึ้นถึงหกเท่า 

แม้ว่าขนาดโมเดลจะไม่ใช่ปัจจัยเดียวในการวัดความฉลาดของโมเดล NLP (ดูข้อโต้แย้งรอบโมเดลพารามิเตอร์หลายล้านล้านบวกที่มีอยู่หลายโมเดล ) แต่ก็มีความสำคัญอย่างไม่ต้องสงสัย ยิ่งโมเดล NLP สามารถเข้าใจพารามิเตอร์ได้มากเท่าไร โอกาสที่โมเดลจะสามารถถอดรหัสและตีความข้อความค้นหาของผู้ใช้ก็ยิ่งมีมากขึ้นเท่านั้น โดยเฉพาะอย่างยิ่งเมื่อพารามิเตอร์มีความซับซ้อนหรือมีจุดประสงค์มากกว่าหนึ่งข้อ

เครื่องมือ

วิวัฒนาการของเฟรมเวิร์กและไลบรารี เช่นPyTorch , TensorFlowและอื่นๆ ช่วยให้สร้างโมเดลการเรียนรู้ที่ทรงพลังได้เร็วและง่ายขึ้น เวอร์ชันล่าสุด ทำให้การสร้างโมเดลที่ซับซ้อนและเรียกใช้การฝึกโมเดลเชิงกำหนดได้ง่ายขึ้น 

เริ่มแรกชุดเครื่องมือเหล่านี้ได้รับการพัฒนาโดยผู้นำระดับโลกด้าน AI/ML—Pytorch ถูกสร้างขึ้นโดย AI Research Lab (FAIR) ของ Facebook และ TensorFlow โดยทีม Google Brain และต่อมาได้ถูกสร้างเป็นโอเพ่นซอร์ส โครงการเหล่านี้ได้รับการบำรุงรักษาอย่างต่อเนื่องและจัดเตรียมทรัพยากรที่ได้รับการพิสูจน์แล้วซึ่งสามารถประหยัดเวลาในการพัฒนาหลายปี ทำให้ทีมสามารถสร้างแชทบอทที่ซับซ้อนได้โดยไม่ต้องใช้ทักษะ AI, ML และ NLP ขั้นสูง กระแส Chatbots

ตั้งแต่นั้นเป็นต้นมา เครื่องมือใหม่ๆ ได้เร่งประสิทธิภาพของโมเดล NLP ให้เร็วขึ้นไปอีก สำหรับผู้ที่ต้องการพลังของเครื่องมือเหล่านี้โดยไม่มีภาระในการกำหนดค่า แพลตฟอร์ม MLOps เช่นWeights & Biasesเป็นแพลตฟอร์มบริการเต็มรูปแบบสำหรับการเพิ่มประสิทธิภาพโมเดล การฝึกอบรม และการติดตามการทดสอบ เมื่อฟิลด์ ML มีความซับซ้อนมากขึ้น เครื่องมือที่มีประสิทธิภาพมากขึ้นก็จะตามมาด้วย 

ฮาร์ดแวร์คอมพิวเตอร์แบบขนาน

ในขณะที่ CPU ให้การประมวลผลตามวัตถุประสงค์ทั่วไปสำหรับฟังก์ชันที่กำหนด GPU ได้รับการพัฒนาเพื่อประมวลผลการแปลงทางคณิตศาสตร์อย่างง่ายจำนวนมากพร้อมกัน ความสามารถในการคำนวณแบบขนานขนาดใหญ่นี้ทำให้เหมาะสำหรับ NLP ฮาร์ดแวร์เฉพาะทาง เช่นTPUและNPUs/AI acceleratorได้ใช้ความสามารถเหล่านี้และสร้างฮาร์ดแวร์พิเศษสำหรับแอปพลิเคชัน ML และ AI 

เมื่อฮาร์ดแวร์มีกำลังเพิ่มขึ้น การสร้างและใช้งานโมเดล NLP ขนาดใหญ่ก็จะเร็วขึ้นและถูกลง สำหรับพวกเราที่ไม่ได้จ่ายเงินสำหรับชิปเซ็ตอันทรงพลังเหล่านี้ ผู้ให้บริการระบบคลาวด์หลายรายเสนอเวลาในการคำนวณบนเซิร์ฟเวอร์เฉพาะของตนเอง 

ชุดข้อมูล

ชุดข้อมูล NLP เติบโตขึ้นอย่างทวีคูณ ส่วนหนึ่งเป็นผลมาจากการเปิดซอร์สชุดข้อมูลที่สร้างขึ้นในเชิงพาณิชย์และฝึกอบรมโดยบริษัทต่างๆ เช่น Microsoft, Google และ Facebook ชุดข้อมูลเหล่านี้เป็นสินทรัพย์ขนาดใหญ่เมื่อสร้างโมเดล NLP เนื่องจากประกอบด้วยการสืบค้นของผู้ใช้ในปริมาณมากที่สุดเท่าที่เคยมีมา ชุมชนใหม่เช่น HuggingFace ได้เกิดขึ้นเพื่อแบ่งปันรูปแบบที่มีประสิทธิภาพกับชุมชนขนาดใหญ่ 

หากต้องการดูผลกระทบของชุดข้อมูลเหล่านี้ ไม่ต้องมองหาที่อื่นนอกจากSQuADซึ่งเป็นฐานข้อมูลการตอบคำถามของ Stanford เมื่อ SQuAD เปิดตัวครั้งแรกในปี 2559 ดูเหมือนว่าจะเป็นไปไม่ได้ที่จะสร้างโมเดล NLP ที่สามารถทำคะแนนได้ดีเมื่อเทียบกับ SQuAD วันนี้งานนี้ถือว่าง่ายและหลายรุ่นมีความแม่นยำสูงมาก 

ด้วยเหตุนี้ ชุดข้อมูลทดสอบใหม่จึงท้าทายผู้สร้างโมเดล NLP มีSQuAD 2.0ซึ่งควรจะเป็นเวอร์ชันที่ยากขึ้นจากเวอร์ชันดั้งเดิม แต่ถึงกระนั้นก็กลายเป็นเรื่องง่ายสำหรับเวอร์ชันปัจจุบัน ชุดข้อมูลใหม่เช่นGLUE และ SuperGLUEนำเสนอความท้าทายแบบหลายประโยคเพื่อให้โมเดล NLP ที่ล้ำสมัยเป็นสิ่งที่ท้าทาย  

คุณควรสร้างหรือซื้อ?

เมื่อได้ยินเกี่ยวกับความก้าวหน้าทั้งหมดนี้ใน AI, ML, NLP และเทคโนโลยีที่เกี่ยวข้อง คุณอาจคิดว่าถึงเวลาแล้วที่จะต้องทิ้งแชทบอทของคุณและสร้างแชทบอทใหม่ คุณน่าจะใช่นะ แต่โดยพื้นฐานแล้วมีสองวิธีแก้ปัญหาสำหรับทีมพัฒนา:

  1. สร้างแชทบอทตั้งแต่เริ่มต้นเพื่อรวมเทคโนโลยีที่เหนือกว่าในปัจจุบัน
  2. ซื้อชุดเครื่องมือที่สรุปด้าน NLP ที่ยากๆ ของสิ่งต่างๆ โดยเฉพาะอย่างยิ่งด้วยคุณสมบัติเพิ่มเติมบางอย่าง และสร้างจากที่นั่น

นี่เป็นภาวะที่กลืนไม่เข้าคายไม่ออกแบบคลาสสิก “สร้างหรือซื้อ” แต่ในกรณีนี้ คำตอบนั้นง่ายกว่าที่คุณคิด 

สำหรับทีมพัฒนาขนาดเล็กที่มีทรัพยากรจำกัด การสร้างแชทบอทตั้งแต่เริ่มต้นเพื่อรวมแนวคิด AI, ML และ NLP ล่าสุดต้องใช้ความสามารถที่ยอดเยี่ยมและการทำงานอย่างมาก ทักษะในด้านเหล่านี้เป็นเรื่องยาก (และมีราคาแพง) และนักพัฒนาส่วนใหญ่ไม่ต้องการใช้เวลาหลายปีในการแสวงหาทักษะเหล่านี้

แล้วทีมพัฒนาในองค์กรขนาดใหญ่ที่มีทรัพยากรให้จ้างนักวิทยาศาสตร์ข้อมูลและผู้เชี่ยวชาญด้าน AI/ML/NLP ล่ะ ฉันเชื่อว่ามันยังไม่คุ้มค่าที่จะสร้างใหม่ตั้งแต่ต้น

ลองนึกภาพธนาคารขนาดใหญ่ที่มีทีมงานเฉพาะที่ทำงานเกี่ยวกับแชทบ็อตล่าสุด รวมถึงนักวิทยาศาสตร์ด้านข้อมูล 5 คนที่ทำงานเกี่ยวกับไปป์ไลน์ NLP แบบกำหนดเอง โครงการอาจใช้เวลา 18 เดือนในการสร้างแชทบอทที่ใช้งานได้ แต่เมื่อถึงเวลานั้น ความก้าวหน้าของเครื่องมือโอเพ่นซอร์สและทรัพยากรได้ทันกับสิ่งใหม่ๆ ที่ทีมสร้างขึ้น ด้วยเหตุนี้ จึงไม่มี ROI ที่มองเห็นได้จากโครงการเมื่อเทียบกับการทำงานกับชุดเครื่องมือที่มีจำหน่ายทั่วไป

ที่แย่กว่านั้น เนื่องจากแชทบอทอาศัยไปป์ไลน์ NLP แบบกำหนดเอง จึงไม่มีวิธีง่ายๆ ในการรวมความก้าวหน้าเพิ่มเติมของ NLP หรือเทคโนโลยีที่เกี่ยวข้อง การทำเช่นนั้นจะต้องใช้ความพยายามอย่างมาก ซึ่งจะลด ROI ของโครงการลงไปอีก

ฉันยอมรับว่าฉันลำเอียง แต่ฉันเชื่อโดยสัตย์จริงว่าการสร้าง การบำรุงรักษา และการอัปเดตโมเดล NLP นั้นยากเกินไป ใช้ทรัพยากรมากเกินไป และช้าเกินไปที่จะคุ้มค่าสำหรับทีมส่วนใหญ่ มันจะเหมือนกับการสร้างโครงสร้างพื้นฐานระบบคลาวด์ของคุณเองเมื่อเริ่มต้นใช้งาน แทนที่จะต้องแบกรับผู้ให้บริการรายใหญ่ด้วยเครื่องมือที่ทันสมัยและขนาดที่ใกล้เคียงกับขนาดที่ไม่มีที่สิ้นสุด

ทางเลือกคืออะไร?

ชุดเครื่องมือเช่น Botpress สามารถสรุปด้าน NLP ของสิ่งต่าง ๆ และจัดเตรียม IDE สำหรับนักพัฒนาเพื่อสร้างแชทบอทโดยไม่ต้องจ้างหรือเรียนรู้ทักษะใหม่ ๆ หรือสร้างเครื่องมือที่พวกเขาต้องการตั้งแต่เริ่มต้น สิ่งนี้สามารถให้ประโยชน์หลายประการสำหรับโครงการแชทบอท:

  • ลดเวลาในการพัฒนาลงอย่างมาก
  • อัปเกรดเป็นเทคโนโลยี NLP ล่าสุดได้ง่ายโดยไม่ต้องทำใหม่ครั้งใหญ่
  • ความพยายามน้อยลงในการดูแลแชทบอทเนื่องจากการอัปเดตเป็นไปโดยอัตโนมัติ กระแส Chatbots

เหนือสิ่งอื่นใด นักพัฒนาสามารถมุ่งเน้นไปที่การสร้างและปรับปรุงประสบการณ์และฟังก์ชันการทำงานของซอฟต์แวร์ของตนเอง โดยไม่ต้องเรียนรู้ AI/ML/NLP

เริ่มสร้างแชทบอทวันนี้

หากฉันทำให้คุณสนใจในการสร้างแชทบอท คุณสามารถเริ่มได้ทันที ที่ Botpress เรามีแพลตฟอร์มสำหรับนักพัฒนาแบบโอเพ่นซอร์สที่คุณสามารถดาวน์โหลดและเรียกใช้ภายในเครื่องได้ภายในไม่กี่นาที

ในการเริ่มต้น ให้ไปที่หน้าผู้พัฒนาแช ทบอ ท ของเรา สำหรับแนวทางปฏิบัติเกี่ยวกับวิธีการติดตั้งแพลตฟอร์มและสร้างแชทบอทตัวแรกของคุณ โปรดดูคู่มือเริ่มต้นใช้งาน Botpress ของเรา

คุณยังสามารถทดสอบการสาธิตสดของผลิตภัณฑ์ล่าสุดของเรา ซึ่งเป็นวิธีการใหม่ในการสร้างแชทบอทที่อิงตามความรู้ “ไม่ตั้งใจ” ซึ่งเรียกว่าOpenBookซึ่งประกาศในสัปดาห์นี้ 

Face-sso (By K&O) หากท่านสนใจ เครื่องสแกนใบหน้ารุ่นต่างๆ หลากหลายรุ่น หรือ ติดตั้งระบบสแกนใบหน้า สามารถติดต่อสอบถามได้โดยตรง เรามีแอดมินคอยคอบคำถาม 24 ชั้วโมงที่ Line OA เครื่องสแกนใบหน้า สามารถ ขอราคาพิเศษได้ ตามงบประมาณที่เหมาะสม สอบถามได้สบายใจทั้ง เรื่องค่าบริการ ราคา และ งบประมาณ มั่นใจเพราะเป็นราคาที่สุด คุ้มค่าที่สุด

หากท่านมีความสนใจ บทความ หรือ Technology สามารถติดต่อได้ตามเบอร์ที่ให้ไว้ด้านล่างนี้
Tel.086-594-5494
Tel.095-919-6699