แทบทุกภาษาโปรแกรมมิ่งจะมีคำสั่ง "Rand" เอาไว้ใช้ในการ "สุ่มตัวเลข" แต่การ "สุ่ม" ค่าในคอมพิวเตอร์เป็นงานที่ซับซ้อนกว่าที่คุณคิด หากคุณเข้าใจวิธีการทำงานของคอมพิวเตอร์ คุณก็น่าจะรู้อยู่แล้วว่าขั้นตอนการทำงานของมันคือ "ป้อนข้อมูลเข้าไป → ประมวลผล → ได้คำตอบ"
คำถามคือ ถ้าเราสั่งให้คอมพิวเตอร์สุ่มค่า เราจะต้องป้อนคำสั่งเข้าไปอย่างไร ? เพราะคอมพิวเตอร์สุ่มไม่ได้ ถ้าเราไม่ได้คิดอะไรมาก เราก็อาจสร้าง อัลกอริทึม ง่าย ๆ ขึ้นมาเช่น เอาค่าอะไรสักอย่างที่ไม่ตายตัว เช่น ค่าวินาทีในระบบไปบวกลบคูณหารจากสูตรที่เตรียมไว้ ตัวอย่างเช่น "สุ่ม = (ค่าวินาที x 2) + 17"
แต่วิธีการที่ว่ามานี้ จะเรียกว่าเป็นการสุ่มก็ไม่ถูกต้องสักทีเดียว เพราะว่าหากเรารู้หลักการคำนวณ ก็สามารถทำนายผลลัพธ์ได้ล่วงหน้า ว่าการกดสุ่มแต่ละครั้ง จะได้ผลลัพธ์ออกมาเป็นเลขอะไร ?
ข้อมูลเพิ่มเติม : บริการสุ่มตัวเลข สุ่มสี สุ่มวันที่ สุ่มอาหาร สุ่มสถานที่ จาก Thaiware.com
การสุ่มบนคอมพิวเตอร์ก็จะถูกแบ่งออกเป็น 2 รูปแบบ แบบแรกเรียกว่า Pseudo-Random Number Generator (PRNG) ที่ใช้หลักการเหมือนกับที่เราอธิบายไปในย่อหน้าที่แล้ว ส่วนแบบที่สองเรียกว่า True Random Number Generator (TRNG)
สองรูปแบบนี้มีความแตกต่างกันอย่างไร ? มาเรียนรู้เบื้องหลังการสุ่มในคอมพิวเตอร์กัน ...
การสุ่มมีมาหลายพันปี ไม่ว่าจะการโยนเหรียญ หรือทอยลูกเต๋า เป้าหมายก็เหมือนกันตรงที่ คือ การหาผลลัพธ์แบบสุ่ม การสุ่มด้วยคอมพิวเตอร์ก็เฉกเช่นเดียวกัน มีซอฟต์แวร์หลายอย่างที่ใช้ประโยชน์จากการสุ่ม เช่น เกมคอมพิวเตอร์ การสุ่มเพื่อวิทยาการเข้ารหัส (Cryptography) การสุ่มเพื่อการเสี่ยงโชค การสุ่มผลลัพธ์ในฐานข้อมูล ฯลฯ แม้แต่เรื่องใกล้ตัวง่ายๆ อย่างการเล่นเพลงแบบ Shuffle ก็เป็นการสุ่มเช่นกันนะ
ในด้าน Cryptography มีความสำคัญมากต่อการเข้ารหัสข้อมูลเพื่อความปลอดภัย เราไม่สามารถใช้รูปแบบเดิมซ้ำไปซ้ำมาได้ เพราะผู้โจมตีอาจจะวิเคราะห์วิธีการสร้างรหัสได้ในท้ายที่สุด
หรือหากมีเว็บให้เล่นเกมแลกของรางวัลโดยการสุ่ม หากเราสามารถแกะรอยหาวิธีที่เขาใช้ในการสุ่มได้สำเร็จ เราก็จะสามารถชนะเกมนั้นได้ตลอดเวลาที่ต้องการเลยล่ะ
บางคนอาจจะคิดว่าแค่การสุ่ม ทำไมต้องจริงจังขนาดนี้ แต่ในความเป็นจริงการสุ่มมีความสำคัญต่อคอมพิวเตอร์มาก มีกิจกรรมหลายอย่างที่ในการทำงานต้องอาศัยการสุ่มด้วย ตัวอย่างที่น่าสนใจก็อย่างเช่น
ในการรับส่งข้อมูลบนคอมพิวเตอร์มีหลายส่วนที่ต้องมีการเข้ารหัสข้อมูล เพื่อเพิ่มความปลอดภัยในการแลกเปลี่ยนข้อมูล เพื่อป้องกันการดักข้อมูลจากบุคคลที่สามารถ กุญแจที่ต้องใช้ในการเข้า และถอดรหัสจึงต้องมีการสุ่มใหม่ตลอดเวลา
งานในรูปแบบนี้ แน่นอนว่า PRNG ไม่ตอบโจทย์ จึงมีการพัฒนาเทคนิคที่เรียกว่า Cryptographically-Secure Pseudorandom Number Generation (CSPRNG) ขึ้นมา มันเป็น PRNG ที่มีการดึงข้อมูลที่เกิดขึ้นแบบสุ่มภายในระบบคอมพิวเตอร์มาใช้ในการคำนวณร่วมด้วย เช่น อุณหภูมิของ หน่วยประมวลผลกลาง (CPU) ในขณะนั้น, ค่าบิตจากอะไรสักอย่างในระบบ ฯลฯ
การสุ่มถือเป็นระบบหนึ่งที่นิยมใช้ในเกมคอมพิวเตอร์ การกระทำต่าง ๆ ภายในเกมหากโปรแกรมล่วงหน้าเอาไว้ตายตัวมันย่อมน่าเบื่อ เพราะผู้เล่นจะคาดเดาได้ง่าย ผู้พัฒนาจึงมีการนำระบบสุ่มมาใช้ในการปรากฏตัวของศัตรู, การกระทำของ NPC ฯลฯ หรือเกมแนวคาสิโน ที่มีทั้งการสุ่มไพ่, การทอยเต๋า, สลอตแมชชีน หรือแม้แต่การหมุนกาชา ก็ต้องใช้ระบบสุ่มเช่นกัน
ภาพจาก : https://codemyui.com/nixie-tube-cold-cathode-display-random-number-generator/
การสุ่มแบบ TRNG หรือที่ย่อมาจากคำว่า "True Random Number Generator" เป็นการสุ่มค่าด้วยการใช้กระบวนการที่เรียกว่า "Harvesting Entropy" โดยมันเป็นการเก็บรวบรวมข้อมูลจากสภาพแวดล้อมที่ไม่สามารถคาดเดาเหตุการณ์ล่วงหน้าได้ ซึ่งก็มีทางเลือกอยู่หลายอย่างที่ถูกนำมาใช้ อย่างเช่น การเคลื่อนที่ของอะตอม, ความแปรปรวนในแรงดันไฟฟ้า, การสลายตัวของสารกัมมันตรังสี และ Atmospheric Noise
ในการเปลี่ยนค่าจากปรากฏการณ์ตามธรรมชาติให้เป็นรูปแบบที่คอมพิวเตอร์สามารถเข้าใจ เพื่อนำไปใช้คำนวณหาค่าสุ่มได้นั้น จำเป็นต้องอาศัยฮาร์ดแวร์หลายอย่าง โดยแบ่งหน้าที่ได้ดังนี้
อย่างที่เราได้อธิบายไปข้างต้นว่าการสุ่มแบบ TRNG จะเก็บเกี่ยวข้อมูลจากสภาพแวดล้อมภายนอกมาใช้ในการสุ่ม ซึ่งเทคนิคที่นิยมใช้ก็อย่างเช่น
เทคนิคนี้ใช้การจับความเปลี่ยนแปลงที่เกิดขึ้นในชั้นบรรยากาศมาคำนวณการสุ่ม ส่วนใหญ่จะใช้การจับค่าแสงของสายฟ้า ซึ่งเกิดขึ้นประมาณ 40 ครั้งต่อวินาที ซึ่งวิธีการนี้ค่อนข้างยากต่อการคาดเดาผลลัพธ์ เว็บไซต์ Random.org ก็ใช้เทคนิคนี้ในการสุ่ม
สำหรับ TRNG บางระบบเลือกที่จะนำค่าเวลาในระดับนาโนเซคอนด์ (1/1,000,000,000 วินาที) มาใช้ในการสุ่ม ตัวอย่างเช่น หากต้องการสุ่มค่าระหว่าง 1-10 แล้วเรากดคีย์บอร์ดในช่วงเวลาที่ "4:50:52.287503482" คอมพิวเตอร์ก็อาจจะเลือกค่า 2 ซึ่งเป็นหลักสุดท้ายมาเป็นค่าสุ่ม หรือจะเอาไปเข้าสมการคณิตศาสตร์เพื่อเพิ่มความแปรผันเพิ่มอีกก็ได้ เช่น เอาหลักที่ 7 และหลักสุดท้ายไปคำนวณ แล้วนำผลลัพธ์ที่ได้ 2 ค่า มารวมกันแล้วเข้าสมการอีกครั้ง ก่อนจะได้ผลลัพธ์สุดท้ายออกมาเป็นค่าสุ่ม
สารกัมมันตรังสีนั้นไม่มีความเสถียรภาพ ไม่สามารถคาดเดาได้ว่ามันจะเสื่อมสภาพตอนไหน ทำให้มันตอบโจทย์ต่อการใช้เป็นแหล่งข้อมูลสำหรับทำการสุ่มเป็นอย่างดี
เครื่อง True Random Number Generator ที่ทำมาจากกล้วย
ภาพจาก : https://www.valerionappi.it/brng-en/
อันที่จริง Pseudo-Random Number Generator นั้นไม่ใช่การสุ่มที่แท้จริง มันแค่จำลองการสุ่มขึ้นมาเท่านั้น ตามบริบท "Pseudo" ที่แปลว่า "ปลอม" นั่นเอง
โดยโครงสร้างการทำงานของ PRNG จะประกอบด้วย "Seed" และ "อัลกอริทึมที่ถูกเตรียมไว้ล่วงหน้า" ขั้นตอนในการสุ่มจะมีลำดับดังนี้
จะเห็นได้ว่าเลขที่เกิดจาก Pseudo-Random Number Generator นั้นเกิดจากการวนลูปสมการซ้ำไปซ้ำมาในรูปแบบเดิม ๆ เพราะค่า Seed เริ่มต้น และหลักอัลกอริทึมที่ใช้คำนวณนั้นถูกกำหนดตายตัว ทำให้ค่าสุ่มสามารถคาดการณ์ได้ หากเรารู้ว่ามันใช้หลักอัลกอริทึมแบบไหนในการคำนวณ ดังนั้น PRNG ที่ดี จะต้องมีการคำนวณซ้ำหลายครั้ง เพื่อให้ยากต่อการถูก Reverse-Engineering
PRNG มีหลายรูปแบบ ที่นิยมใช้ก็อย่างเช่น "Linear Congruential" และ "Middle-Square Generator"
Linear Congruential Generator (LGC) ถูกคิดค้นขึ้นมาในปี ค.ศ. 1958 (พ.ศ. 2501) ซึ่งมันยังได้รับความนิยมใช้ในการทำ PRNG มาจนถึงปัจจุบัน
Xn+1 = (aXn + c) mod m
โดย
สมมติให้ X₀ = 235, a = 2,398, c = 8,738 และ m = 1,000,000
ขั้นตอน 1 : เมื่อเรารู้แล้วว่า X₀ = 235 ดังนั้นก็ดำเนินไปยังขั้นตอนถัดไปได้เลย
ขั้นตอน 2 : แทนค่า a, c และ m ลงในสมการ
X1 = (aX0 + c) mod m, ดังนั้น
= (2,398(235) + 8,738) mod 1,000,000
= 572,268 mod 1,000,000
แทนค่า 1,000,000 เข้าไปใน 572,268 จำนวน 0 ครั้ง ก็จะได้ค่า 572,268 ดังนั้น
X1 = 572,268
ขั้นตอน 3 : นำค่าที่ได้มาใช้เป็นค่า Seed สำหรับการวนซ้ำในการคำนวณครั้งถัดไป
X1 = 572,268 ดังนั้น ในการหาค่า X2 เราจะคำนวณโดยใช้สูตรเดิมอีกครั้ง
X2 = (aX1 + c) mod m, ดังนั้น
= (2,398(572,268) + 8,738) mod 1,000,000
= 1,372,307 mod 1,000,000
แทนค่า 1,000,000 เข้าไปใน 1,372,307,402 จำนวน 1,372 ครั้ง ก็จะได้ค่า 307,402
ขั้นตอน 4 : ทำแบบนี้วนซ้ำไปเรื่อย ๆ จนกว่าจะครบจำนวนที่ต้องการ ผลลัพธ์ที่ได้ก็จะออกมาดังนี้ 572268, 307402, 158734, 652870, 590998... ค่าที่ได้มันก็เหมือนกับการสุ่มใช่ไหมครับ
เทคนิค Middle-Square Generator ถูกคิดค้นขึ้นมาในปี ค.ศ. 1949 (พ.ศ. 2492) โดย Jon von Neumann หลักการทำงานของวิธีนี้ค่อนข้างเรียบง่าย ด้วยการนำค่า Seed มาใส่สูตรอะไรสักอย่าง แล้วนำเฉพาะค่าตรงกลางมาใช้คำนวณในการสร้างค่า Seed ใหม่
อย่างไรก็ตาม เทคนิคนี้เป็นอัลกอริทึมที่ไม่ค่อยมีประสิทธิภาพเท่าไหร่นัก เนื่องจากเมื่อวนซ้ำไปสักระยะ ค่าตรงกลางมักจะจบที่เลข 0 จำนวนมาก
ภาพจาก : https://privacycanada.net/mathematics/pseudo-random-number-generation/
คำตอบนั้นก็ขึ้นอยู่กับ เราจะเอาการสุ่มนี้ไปใช้ทำอะไร ?
ถ้าเป็นด้านความสะดวกในการใช้งาน Pseudo-Random Number Generator (PRNG) จะได้เปรียบกว่ามาก เพราะ True Random Number Generator (TRNG) มีต้นทุนทั้งเครื่องมือ และทรัพยากรที่ค่อนข้างสูง นอกจากนี้ ยังต้องมีการบำรุงรักษาอย่างสม่ำเสมอ
แต่ถ้าเป็นด้านความปลอดภัย TRNG จะเป็นผู้ชนะไป เพราะมันเป็นการสุ่มที่แท้จริง ทำให้แทบจะเป็นไปได้เลยที่จะทำนายผลลัพธ์ล่วงหน้า ต่างจาก PRNG ที่ผลลัพธ์เกิดจากการนำค่าเดิมมาคำนวณใหม่ หากมีข้อมูลมากพอ ก็อาจจะสามารถนำมาวิเคราะห์เพื่อหาสูตรที่ใช้ในการสุ่มออกมาได้
TRNG | PRNG | |
นิยาม | สุ่มค่าโดยอาศัยปัจจัยภายนอก | สุ่มค่าจากอัลกอริทึมที่เตรียมไว้ล่วงหน้า |
ส่วนประกอบ |
|
|
คุณลักษณะ |
|
|
ตัวอย่าง |
|
|
ไม่ว่าจะเป็นการสุ่มด้วย TRNG หรือ PRNG ก็จะมีข้อจำกัดในการใช้งานกันคนละแบบ ไม่ได้พัฒนาขึ้นมาง่าย ๆ เพื่อให้นักพัฒนาซอฟต์แวร์ทั่วไปสามารถใช้ระบบสุ่มได้ ทาง Intel ผู้พัฒนาชิปชื่อดังจึงพัฒนาระบบสุ่มแบบฮาร์ดแวร์ขึ้นมา เรียกว่า RdRand โดยในชิปเซตจะมีฐานข้อมูลสำหรับสุ่มตัวอย่างเก็บเอาไว้อยู่ (Entropy source) เมื่อซอฟต์แวร์ต้องการสุ่มก็จะดึงค่า Seed จาก RdRand มาใช้งานได้ทันที
ภาพจาก https://software.intel.com/content/www/us/en/develop/articles/intel-digital-random-number-generator-drng-software-implementation-guide.html
แต่ระบบนี้มีปัญหาอยู่ตรงที่ระบบการสุ่ม Seed ของ RdRand เป็นเหมือนกล่องดำที่ไม่เปิดเผยวิธีการทำงาน ทำให้เราไม่รู้เลยว่ามันทำงานอย่างไร ? มีอะไรอยู่ในกล่องแพนโดราอันนี้บ้าง ทำให้เกิดกระแสความวิตกกังวลไม่ไว้วางใจ RdRand ขึ้นมา เพราะหากในนั้นมีประตูหลัง (Backdoors) ให้ NSA ใช้ รัฐบาลจะสามารถใช้ประโยชน์จาก RdRand ในการถอดรหัสที่ถูกสุ่มด้วยระบบนี้ได้
National Security Agency หรือย่อว่า NSA เป็นองค์กรข่าวกรองของรัฐบาลกลางสหรัฐ มีหน้าที่สังเกตการณ์ รวบรวม และประมวลผลข้อมูลเพื่อหาข่าวกรองต่างประเทศและหน้าที่การต่อต้านการข่าวกรองของประเทศอื่น
ตกเป็นประเด็นใหญ่เมื่อ เอ็ดเวิร์ด สโนว์เดน อดีตเจ้าหน้าที่ของ CIA ได้ออกมาเปิดโปงเรื่อง “พริซึมเกต” โครงการลับที่เจาะเข้าไปในเซิร์ฟเวอร์ของบริษัทไอทีชื่อดังต่างๆ และมีการกล่าวอ้างว่าบางบริษัทได้ให้ความร่วมมือด้วยการสร้างประตูหลังให้ FBI และ CIA ได้ใช้ในการเข้าไปสอดส่องข้อมูลได้
ความหวาดระแวงนี้ได้ทำให้ในเดือนธันวาคม ปี ค.ศ. 2013 (พ.ศ. 2556) ที่ทางผู้พัฒนา FreeBSD ได้หยุดสนับสนุนการสร้างผลลัพธ์โดยใช้ RdRand โดยให้เหตุผลว่าไม่อาจไว้วางใจระบบนี้ได้ อย่างไรก็ตาม ก็มีการแก้ไขปัญหาด้วยการนำข้อมูลที่ถูกสุ่มด้วย Entropy Source ของ RdRand มาใช้เป็น Seed ของอัลกอริทึมอีกชุดเพื่อคำนวณค่าสุ่มซ้ำอีกครั้งหนึ่ง เพื่อให้มั่นใจว่าผลลัพธ์จะไม่ถูกนำไปใช้หากมีการ Backdoors เกิดขึ้น
|
แอดมินสายเปื่อย ชอบลองอะไรใหม่ไปเรื่อยๆ รักแมว และเสียงเพลงเป็นพิเศษ |