11 มกราคม 2558

Published มกราคม 11, 2558 by with 0 comment

เข้ารหัส (Encrypt) และถอดรหัส (Decryption) ใน Python

สวัสดีทุกท่านครับ ความปลอดภัยของข้อมูลเป็นสิ่งสำคัญ ไม่ว่าจะเป็นข้อมูลอะไรก็ตาม ไม่ควรที่จะแก้ไข ทำลาย ขโมยหรือแอบดูข้อมูลโดยที่ไม่ต้องการ ถ้าเป็นข้อมูลความลับต่าง ๆ
ผู้อื่นไม่ควรที่จะเข้าถึงข้อมูลนั้นได้ การเข้ารหัส 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

สำหรับผู้ใช้งาน Windows ในกรณีที่ไม่สามารถ compile โมดูลได้ สามารถไปโหลด Binaries ได้ที่ http://www.voidspace.org.uk/python/modules.shtml#pycrypto (โมดูลด้านความปลอดภัยนี้แนะนำให้ทำการ compile เองเพื่อความปลอดภัยจะดีที่สุดครับ)

แต่ปัจจุบันนี้ 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 ความคิดเห็น:

แสดงความคิดเห็น

แสดงความคิดเห็นได้ครับ :)