โบลว์ฟิช

thumb|250px|Diagram of Blowfish
thumb|250px|Diagram of Blowfish's F function

**โบลว์ฟิช** () ในวิทยาการเข้ารหัสลับนั้น เป็นการเข้ารหัสวิธีหนึ่งซึ่งใช้วิธีการเข้ารหัสแบบบล็อก (Block Cipher) และคีย์แบบสมมาตร (Symmetric Key) ซึ่งได้รับการออกแบบในปี ค.ศ. 1993 โดยนายบรูค ชไนย์เออร์ (Bruce Schneier) ซึ่งเป็นเจ้าพ่อแห่งวิทยาการเข้ารหัสลับ และการเข้ารหัสแบบ Blowfish นี้ได้รับความนิยมเป็นอย่างยิ่งในการนำมาใช้ทางด้านการเข้ารหัสกับผลิตภัณฑ์ของซอฟต์แวร์ต่าง ๆ ทั้งยังยากต่อการโจมตีและถูกเจาะวิเคราะห์จาก Cryptanalysis อีกด้วย ยิ่งไปกว่านั้นในปัจจุบัน ขั้นตอนวิธี Blowfish นี้ก็ยังเป็นที่นิยมในบรรดาวิธีการเข้ารหัสแบบ Block Cipher เช่นเดียวกับ ขั้นตอนวิธีอื่น ๆ เช่น AES และ Twofish

ต้นกำเนิดของขั้นตอนวิธี Blowfish เกิดขึ้นจากการนำออกมาเผยแพร่ในการแสดงผลงานทางด้านวิทยาการเข้ารหัสลับในงาน First Fast Software Encryption Workshop ที่เมือง Cambridge ประเทศอังกฤษในปี ค.ศ. 1994 และในเดือนเมษายนในปีเดียวกัน Blowfish ก็ได้รับการตีพิมพ์ในวารสารของ Dr. Dobb จนเมื่อ 1 ปีต่อมา Blowfish ก็ได้ปรากฏอีกครั้งในวารสารฉบับเดือนกันยายนของปี 1995 ของ Dr. Dobb

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

ขั้นตอนวิธี Blowfish เป็นการใช้คีย์แบบ Variable-Length Key โดยมีขนาดความยาวของคีย์ตั้งแต่ขนาด 32 Bit จนถึง 448 Bit ซึ่งจะทำให้เกิดความยืดหยุ่นในการเลือกใช้คีย์กับการเข้ารหัสแบบ Block Cipher มากยิ่งขึ้นซึ่งจะดีกว่าวิธีการแบบ DES หรือ IDEA ซึ่งมีการ Fixed-Length Key โดยใช้คีย์ขนาด 32 Bit เท่านั้น

## นาย Bruce Schneier: ผู้คิดค้นขั้นตอนวิธี Blowfish
นาย Bruce Schneier ผู้คิดออกแบบวิธีการเข้ารหัสลับแบบ Blowfish เกิดเมื่อวันที่ 15 เดือนมกราคม ปี ค.ศ. 1963 ในประเทศสหรัฐอเมริกา เขาทำงานเป็นนัก Cryptographer เป็นผู้ดูแลความปลอดภัยทางคอมพิวเตอร์ (Computer Security Specialist) และยังเป็นนักเขียนอีกด้วย, Bruce ยังได้เขียนหนังสือหลาย ๆ เล่มในเรื่องของ Computer Security และ Cryptography และเขายังเป็นผู้ก่อตั้งและเป็นผู้บริหารของสำนักงานเทคโนโลยี Counterpane Internet Security อีกด้วย

ปัจจุบันนาย Bruce Schneier อาศัยอยู่ในเมือง Minneapolis, Minnesota กับภรรยาของเขาคือ นาง Karen Cooper, นาย Bruce Schneier จบการศึกษาระดับปริญญาตรีทางด้านฟิสิกส์จากมหาวิทยาลัยโรเชสเตอร์ (University of Rochester) และจบการศึกษาในระดับปริญญาโททางด้านวิทยาการคอมพิวเตอร์จากมหาวิทยาลัยชาวอเมริกัน (American University) โดยก่อนหน้าที่เขาจะมาเป็นผู้ก่อตั้งสำนักงานเทคโนโลยี Counterpane Internet Security นั้น เข้าได้ทำงานในหน่วยงานกระทรวงกลาโหมสหรัฐอเมริกา (United States Department of Defense) และในหน่วยงานของ Bell Labs มาก่อน

การศึกษาทางด้าน Applied Cryptography เป็นสิ่งที่ได้รับความนิยมและทำให้เขามีชื่อเสียงทางด้านวิทยาการเข้ารหัสลับ หรือ Cryptography เป็นอย่างมาก, Schneier ได้ออกแบบ และร่วมออกแบบในเทคนิควิธีการเข้ารหัสในหลาย ๆ ขั้นตอนวิธีซึ่งได้แก่ Blowfish, Twofish และ MacGuffin ทั้งยังออกแบบเทคนิคการสุ่มและสร้างตัวเลขในการเข้ารหัสแบบ Yarrow และ Fortuna อีกด้วย

## ขั้นตอนวิธี Blowfish
Blowfish จะเป็นการเข้ารหัสแบบ 64 Bit Block Cipher โดยข้อมูลในการเข้ารหัสจะถูกแบ่งออกเป็นบล็อก บล็อกละ 64 Bit และใช้คีย์แบบ Variable-Length Key โดยจะมีขนาดตั้งแต่ 32 Bit ไปจนถึง 448 Bit โดยขั้นตอนการทำงานนั้นจะมีการทำเป็นรอบทั้งหมด 16 รอบ ซึ่งเรียกว่าวิธีการแบบ Feistel Network และเลือกใช้คีย์ที่เหมาะสมกับ S-boxes ในการเข้ารหัส โดยจะมีโครงสร้างคล้ายกับการทำงานของขั้นตอนวิธี CAST-128 ที่เป็นแบบ Fixed S-boxes

ตาม Diagram ทางขวามือนั้นจะเป็นการแสดงการทำงานของขั้นตอนวิธี Blowfish ซึ่ง 1 เส้นจะแทนด้วยข้อมูลขนาด 32 Bit ที่เรียกว่า P-entries โดย ขั้นตอนวิธี ในการเลือก Key หรือ Subkey นั้นจะประกอบด้วย 2 ส่วนคือ 18-entry P-array และ 4 ของ 256-entry S-boxes โดยที่ S-boxes นั้นจะเป็นการรับข้อมูลเข้า (Input) ขนาด 8 Bit เข้าไปเพื่อทำงานในกระบวนการต่าง ๆ และจะให้ข้อมูลขนาด 32 Bit ออกมา (Output) โดยในแต่ละ P-array จะนำมาใช้ในแต่ระรอบตั้งแต่ P1 จนถึง P16 และหลังจากที่มีการเสร็จสิ้นการทำงาน 16 รอบ แล้วในแต่ละ 32 Bit ของ Data Block จะถูกทำการ XORed (Exclusive OR) กับ P-array อีก 2 ตัว คือ P17 และ P18

ตาม Diagram ทางขวามือจะเป็นการแสดงการทำงานภายในของฟังก์ชัน F (F-function) ซึ่งปรากฏอยู่จาก Diagram ด้านบน โดยการทำงานของฟังก์ชัน F นั้นจะเริ่มต้นโดยจะแบ่งข้อมูลขนาด 32 Bit เป็น 4 ส่วน ส่วนละ 8 Bit เพื่อเป็น Input ในการเข้าไปทำงานของ 4 S-boxes ที่อยู่ภายในฟังก์ชัน F นั้น และเมื่อทำการผ่าน S-box ไปแล้วจะได้ Output ออกมาเป็นข้อมูลที่มีขนาด 32 Bit ในทุก ๆ S-box โดยจะนำมาทำการบวก แล้วหารเอาเศษด้วย 232 และการ XOR จนได้ข้อมูลสุดท้ายที่มีขนาด 32 Bit เช่นเดิม

ตารางคีย์ของขั้นตอนวิธี Blowfish จะเริ่มทำการกำหนดค่าเป็น Subkey ที่เรียกว่า P-array และ S-box ซึ่งประกอบไปด้วยค่าของตัวเลขฐานสิบหกของค่า Pi ซึ่งเป็นค่าที่ไม่เป็นระเบียบและยากต่อการจัดเรียง โดยที่คีย์ลับนี้จะทำการ XORed กับ P-entries หรือข้อมูลที่เป็น 32 bit ทางซ้ายมือในทุก ๆ รอบตั้งแต่ P1 จนถึง P16 และในทุก ๆ รอบจะมีการ Generate Subkey ขึ้นมาใหม่ทุกครั้ง เมื่อทำการ XORed ในรอบนั้น ๆ แล้วก็จะเข้าสู่การทำงานในฟังก์ชัน F ซึ่งประกอบไปด้วย 4 S-box จากนั้นก็จะทำการ XORed อีกครั้งกับ P-entries หรือ Data Block ที่มีขนาด 32 Bit ที่อยู่ทางฝั่งขวามือ จากนั้นจะมีการสลับข้อมูลโดยที่ 32 Bit P-entries ทางขวามือจะถูกสลับไปทางซ้ายมือ และ 32 Bit P-entries ทางซ้ายมือจะถึงสลับไปทางขวามือ ก็เป็นการสิ้นสุดการทำงานในแต่ละรอบ โดยจะทำงานแบบนี้ไปเรื่อย ๆ จนครบ 16 รอบ และเมื่อครบ 16 รอบแล้วก็จะทำการ XORed อีกครั้งกับ P-array ตัวที่ 17 และ 18 ซึ่งเป็น Subkey 2 ตัวสุดท้าย ก็จะสิ้นสุดขั้นตอนการเข้ารหัส และจะมีขั้นตอนการรวมกันของ 32 Bit Block Cipher ทั้ง 2 ฝั่งเข้าด้วยกันเป็น Cipher text ขนาด 64 Bit เช่นเดิม ซึ่งการเข้ารหัสแบบ Blowfish นี้จะมีการทำงาน (Run) ทั้งหมด 521 ครั้งเพื่อทำการ Generate ค่าของทุก ๆ Subkey ที่เกิดขึ้น ซึ่งจะใช้เนื้อของ CPU ที่มีขนาดเป็น 4 KB ในการ Process เท่านั้นซึ่งถือว่าน้อยมาก

## การวิเคราะห์และตรวจสอบขั้นตอนวิธี Blowfish
เมื่อขั้นตอนวิธี Blowfish ซึ่งไม่มีการกำหนดลิขสิทธิ์ใด ๆ เกิดขึ้นมาได้ 1 ปี ก็ได้มีผู้สนับสนุนของวารสาร *Dr. Dobb's Journal* ที่เป็น Cryptanalysis ได้ให้ข้อมูลเอาไว้ 5 ส่วนด้วยกันโดยทั้ง 5 ส่วนนั้นได้ข้อสรุปออกมาดังนี้คือ

นาย John Kelsey ได้ทำการโจมตีโดยเข้าไปขัดขวางการทำงานในรอบที่ 3 ในการทำงานของ Blowfish แต่ปรากฏว่าไม่สามรถหยุดการทำงานลงได้ การโจมตีในการทำงานของฟังก์ชัน F และการทำงานแบบ Addition mod 232 and XOR ยากต่อการแปรค่าออกไปจากเดิม นาย Vikramjit Singh Chhabra พบว่าการสร้าง Key ของ Blowfish จะใช้เครื่องในการทำงานซึ่งเป็นการทำงานที่มีประสิทธิภาพเป็นอย่างมาก 

นาย Serge Vaudenay ได้ตรวจสอบถึงการแปรผันของขั้นตอนวิธี Blowfish โดยใช้ S-boxes ที่ไม่ขึ้นอยู่กับค่า key เพื่อนำมาเป็นตัวแปรผัน ซึ่งค่าความแตกต่างจากการโจมตีสามารถแสดงให้เห็นว่าค่า P-array ที่เป็น 28r+1 จะมีค่าใกล้เคียงกับ ข้อความธรรมดา (โดยที่ r คือจำนวนรอบ) ซึ่งการโจมตีนี้เป็นไปได้ในรอบที่ 8 ของ Blowfish หรือสูงกว่านั้น 

สำหรับค่าคีย์ที่เป็น Weak Key และ Weak S-box จะถูกทำการสร้างขึ้นมาได้โดยการกำหนดเลขคี่เพื่อมาสุ่มตัวเลข 1 ตัวใน 214 ตัว และการโจมตีต้องการเพียง 24r+1 ของ plaintext เพื่อจะทำการหาค่าของ P-array ออกมากได้และทำให้รู้ถึงค่าของ S-box ด้วย เมื่อรู้ค่าของ S-box แล้วก็จะสามารถย้อนรอยไปจนถึงข้อมูลต้นตอได้ และการทำงานโดยการโจมตีแบบนี้สามารถที่จะลดรอบการทำงานลงได้ และก็จะได้ค่าข้อมูลที่เหมือน 16 รอบ

ในปีค.ศ. 2005 นาย Dieter Schmidt ได้ตรวจสอบถึงตารางคีย์ของขั้นตอนวิธี Blowfish และพบว่า Subkeys ที่ใช้ในรอบที่ 3 และ 4 นั้นจะไม่ขึ้นกับ 64 bits แรกของ key เดิม

## การทำงานกับ Blowfish
Blowfish เป็นหนึ่งในการเข้ารหัสแบบ Block Cipher ที่ทำงานได้รวดเร็วและปลอดภัยสูง โดยมีการกำหนดค่าของ Subkey ใหม่อยู่ตลอดเวลา และใช้เนื้อที่ในการสร้าง Key ขึ้นมาโดยใช้เนื้อที่ของ CPU เพียง 4 KB เท่านั้นซึ่งน้อยมากเมื่อเทียบกับการเข้ารหัสของขั้นตอนวิธีตัวอื่น ๆ ดังนั้นจึงได้นำมาใช้ในด้านการทำงานของ Application โปรแกรมต่าง ๆ มากมายเช่น การทำ Password-hashing ใน OpenBSD ก็จะใช้ขั้นตอนวิธีของ Blowfish ในการสร้างตาราง Key ขึ้นมาเป็นต้น

ในการเขียนโปรแกรมหรือ Implement โปรแกรมต่าง ๆ นั้นก็จะใช้การทำงานของ Blowfish เข้ามาเกี่ยวข้องอีกด้วยโดยเฉพาะการนำมาใช้กับโปรแกรมที่ใช้ในอุปกรณ์ขนาดเล็กอย่างเช่น PlamOS หรือ เครื่อง PDAs เป็นต้น และยังนำมาใช้ในเครื่องคอมพิวเตอร์แบบ Laptop มากมาย แต่ก็ยังใช้งานไม่ได้กับอุปกรณ์ที่มีขนาดเล็กมาก ๆ ไปกว่านี้ ยกตัวอย่างเช่นบัตร Smartcards เป็นต้น

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

## ผลิตภัณฑ์ที่ใช้ขั้นตอนวิธี Blowfish
* **Blowfish Advanced CS by Markus Hahn**: เป็นการเข้ารหัสของ File encryption โดยจะเป็น Win32 systems ซึ่งประกอบไปด้วยการแสดง File browser, การทำ job automation, การกำหนด auto password, การรักษาความปลอกภัยกับ key setup ด้วย SHA-1, และการทำ data compression ด้วย LZSS
* **96Crypt by fever.link**: เป็นการเข้ารหัสและถอดรหัสของ file และ folder
* **Access Manager by Citi-Software Ltd**: เป็นการจัดการ password สำหรับระบบ Windows และมีให้ใช้ฟรี
* **AEdit**: เป็นฟรีโปรแกรม word processorในระบบ Windows ที่มีการเข้ารหัส
* **Coolfish**: เป็นการ encrypting ข้อมูลหรือข้อความใน editor สำหรับระบบ Windows
* **Foopchat**: เป็นโปรแกรม Encrypted chat และโปรแกรมแชร์ไฟล์แบบ client/server
* **JFile by Land-J Technologies**: เป็นโปรแกรมทำงานเกี่ยวกับฐานข้อมูลในระบบของ PalmOS
* **Freedom by Zero-Knowledge**: เป็นโปรแกรมใช้ทางด้าน web browsing, การส่งอีเมล, การ chat, คำสั่ง telnet, และการทำ newsgroups

หมวดหมู่:การเข้ารหัส