ตัวเข้ารหัสที่กำหนดเอง – แพดแบบใช้ครั้งเดียว (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

ใส่ความเห็น

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