ผู้อื่นไม่ควรที่จะเข้าถึงข้อมูลนั้นได้ การเข้ารหัส Encrypt จึงเป็นสิ่งสำคัญในการส่งข้อมูลผ่านเครือข่ายอินเทอร์เน็ตและช่องทางอื่น ๆ เมื่อได้รับข้อมูลแล้วต้องมีการถอดรหัสโดยใช้คีย์ที่ใช้ในการเข้ารหัส (Decryption) เพื่อเข้าถึงข้อมูลนั้นได้ ในบทความนี้ผมจะพาผู้อ่านไปวิธีการแนะนำเข้าเข้ารหัส (Encrypt) และถอดรหัส (Decryption) ในภาษา Python ครับ
pycrypto
ในการเข้ารหัส (Encrypt) และถอดรหัส (Decryption) ใน Python ผมได้ไปเจอโมดูลหนึ่งที่มีชื่อว่า "pycrypto" เป็นโมดูลสำหรับงานวิทยาการเข้ารหัสลับ (Cryptographic) โดยเฉพาะ รองรับเข้ารหัสและถอดรหัส เช่น SHA256 , RIPEMD160 ,AES, DES, RSA, ElGamal, และอื่น ๆ เป็นต้น รองรับทั้ง Python 2 และ Python 3 และยังเป็น License: Public domain อีกด้วยครับ
ในการติดตั้งโมดูลนี้ โปรดตรวจสอบการตั้งค่า Python กับ C++ compiler ที่ท่านใช้ให้เรียบร้อยแล้ว สามารถติดตั้งโดยใช้คำสั่ง :
pip install pycrypto
หรือโหลดโค้ดมาติดตั้งเองจาก pypi https://pypi.python.org/pypi/pycrypto
แต่ปัจจุบันนี้ pycrypto มีการพัฒนาที่ล่าช้าและปรับปรุงช้า จึงมีนักพัฒนาได้ fork โครงการ pycrypto แตกออกเป็น pycryptodome
โดย pycryptodome มีการใช้งานเหมือนกับ pycrypto และรองรับทั้ง Python 2 , Python 3 , PyPy อีกทั้งยังคงใช้ License: Public domain
สามารถติดตั้งได้โดยใช้คำสั่ง pip:
pip install pycryptodome
ส่วนตัวผมแนะนำให้ใช้ pycryptodome แทน pycrypto ครับ
หน้าเว็บ pycryptodome http://www.pycryptodome.org
ตัวอย่างการเข้ารหัสและถอดรหัสใน Python ด้วยโมดูล pycrypto
AES
from Crypto.Cipher import AES
obj = AES.new('This is a key123', AES.MODE_CBC, 'This is an IV456')
message = "The answer is no"
ciphertext = obj.encrypt(message) # ผลลัพธ์'\xd6\x83\x8dd!VT\x92\xaa`A\x05\xe0\x9b\x8b\xf1'
obj2 = AES.new('This is a key123', AES.MODE_CBC, 'This is an IV456')
print(obj2.decrypt(ciphertext)) # ผลลัพธ์'The answer is no'
ดูรายละเอียดการเข้ารหัสและถอดรหัสด้วยโมดูล pycrypto ได้ที่ http://pythonhosted.org//pycrypto/
โมดูลที่นำความสามารถของ pycrypto เช่น โมดูล simple-crypt เป็นโมดูลสำหรับใช้เข้ารหัสและถอดรหัส (ใช้การเข้ารหัสเป็น AES256) โดยมีจุดเด่น สามารถใช้เข้ารหัสได้ง่าย ๆ ไม่ซับซ้อน สามารถติดตั้งได้โดยใช้ pip ด้วยคำสั่ง
pip install simple-crypt
หรือโหลดโค้ดมาติดตั้งเองจาก pypi https://pypi.python.org/pypi/simple-crypt
ตัวอย่างการเข้ารหัสจากโมดูล simple-crypt
from simplecrypt import encrypt, decrypt
b = "สวัสดี"
c = b.encode('utf-8') #เข้ารหัสตัวอักษรเป็น utf-8
ciphertext = encrypt("password",c) #เข้าสู่กระบวนการเข้ารหัสนำตัวแปร c มาใช้รหัส คีย์เข้ารหัสคือ password
print(ciphertext) #แสดงผลการเข้ารหัส จะพบว่าอ่านไม่ออก
plaintext = decrypt("password", ciphertext) #ถอดรหัสโดยใช้คีย์เดียวกัน คือ password
print(plaintext.decode('utf-8')) #ถอดรหัสตัวอักษรจาก utf-8 'สวัสดี'
ผลลัพธ์
b'sc\x00\x01\xda\x08\x17]S\xcb\xfe\x8eE\xe2\xba\x1e\xde\xa6\xef\x91\x05\xdb\xf07\x1b\x10\x9b\xbe\x8a\x1f15\xef\xcf%\xd4\xfa\x06\xd03\xa2U+_K\x8b\xfe|\xce\x1cy3\xea\xa0\xa8!O\xf2\x91\x89H<A\xba\x8e\xa4\x07\xef\x89\xc0k\xaa\xb8\xe9\x04\x86Z\xa4\x8a\xaaA\xbe\xb7\xb7Qu'
สวัสดี
ดูรายละเอียดเพิ่มเติมได้ที่ https://github.com/andrewcooke/simple-crypt
cryptography
โมดูลถัดมาที่ผมขอแนะนำ มีชื่อว่า "cryptography" เป็นโมดูลที่นำ OpenSSL มาใช้งานร่วมกับ Python โดยต้องติดตั้ง OpenSSL ลงไปร่วมด้วยครับ รองรับทั้ง Python 2 , Python 3 และ License เป็น BSD หรือ Apache License, Version 2.0 สามารถติดตั้งได้โดยใช้ pip ด้วยคำสั่ง
pip install cryptography
หรือโหลดโค้ดมาติดตั้งได้เองจาก pypi https://pypi.python.org/pypi/cryptography/
เมื่อติดตั้งเสร็จแล้วอย่าลืมตั้งค่า Python กับ OpenSSL ด้วยนะครับ ดูวิธีตั้งค่าได้ที่ https://cryptography.io/en/latest/installation/
ตัวอย่างการเข้ารหัสและถอดรหัสใน Python ด้วยโมดูล cryptography
from cryptography.fernet import Fernet
# Put this somewhere safe!
key = Fernet.generate_key()
f = Fernet(key)
token = f.encrypt(b"A really secret message. Not for prying eyes.")
f.decrypt(token)
ผลลัพธ์
A really secret message. Not for prying eyes.
ดูรายละเอียดเพิ่มเติมได้ที่ https://cryptography.io/en/latest/
oscrypto
oscrypto เป็นโมดูลเข้ารหัสและถอดรหัสโดยใช้ตัวระบบปฎิบัติการ ใช้ MIT LICENSE รองรับทั้ง Python 2 และ Python 3
สามารถติดตั้งได้ด้วยคำสั่ง $ pip install oscrypto
อ่านเอกสารการใช้งานได้ที่ https://github.com/wbond/oscrypto
ติดตามบทความต่อไปนะครับ
ขอบคุณครับ
0 ความคิดเห็น:
แสดงความคิดเห็น
แสดงความคิดเห็นได้ครับ :)