ผลต่างระหว่างรุ่นของ "อาร์เอสเอ"

เพิ่มขึ้น 2,480 ไบต์ ,  4 ปีที่แล้ว
เพิ่มโค้ดและอัลกอริทึม
(ย้อนการแก้ไขของ 79.224.154.43 (พูดคุย) ไปยังรุ่นก่อนหน้าโดย Phizaz)
(เพิ่มโค้ดและอัลกอริทึม)
ขั้นตอนวิธีนี้ได้จดสิทธิบัตรโดย [[Massachusetts Institute of Technology|MIT]] เมื่อ[[พ.ศ. 2526]] ใน[[สหรัฐอเมริกา]] เป็น สิทธิบัตรหมายเลข 4,405,829 ซึ่งได้สิ้นสุดเมื่อ [[21 กันยายน]] [[พ.ศ. 2543]] เนื่องจากขั้นตอนวิธีได้พิมพ์แล้วก่อนที่จะจดสิทธิบัตร กฎหมายในส่วนอื่น ๆ ของโลกทำให้ไม่สามารถจดสิทธิบัตรที่อื่นได้ และในกรณีที่ผลงานของค็อกส์ได้เป็นที่รู้จักกันในสาธารณะ การจดสิทธิบัตรในสหรัฐฯก็ไม่สามารถจะกระทำได้เช่นกัน
 
== Operation ==
 
* กำหนดจำนวน เฉพาะ p และ q
* ให้ n = p*q
* z = (p-1)*(q-1)
* e<n และ e กับ n ต้องไม่มีตัวประกอบร่วมกัน
* e*d mod z =1
* ให้ m คือค่าที่ได้จากการ Hash function
 
=== Encryption ===
Public Key : (e,n)
 
<math>c \equiv m^e mod n</math>
 
=== Decryption ===
Private Key : (d,n)
 
<math>m \equiv c^d mod n</math>
 
== ตัวอย่างโค้ดในภาษา Python ==
โค้ดในส่วนของการสร้างคีย์<syntaxhighlight lang="python3" line="1">
import random
def is_prime(num):
if num == 2:
return True
if num < 2 or num % 2 == 0:
return False
for n in range(3, int(num ** 0.5) + 2, 2):
if num % n == 0:
return False
return True
 
def gcd(a, b):
while b != 0:
a, b = b, a % b
return a
'''Euclid's extended algorithm for finding the multiplicative inverse of two numbers'''
def multiplicative_inverse(e, z):
d = 0
x1 = 0
x2 = 1
y1 = 1
temp_z = z
 
while e > 0:
temp1 = temp_z // e
temp2 = temp_z - temp1 * e
temp_z = e
e = temp2
 
x = x2 - temp1 * x1
y = d - temp1 * y1
 
x2 = x1
x1 = x
d = y1
y1 = y
 
if temp_z == 1:
return d + z
 
def generate_keypair(p, q):
if not (is_prime(p) and is_prime(q)):
raise ValueError('Both numbers must be prime.')
elif p == q:
raise ValueError('p and q cannot be equal')
n = p * q
z = (p - 1) * (q - 1)
e = random.randrange(1, n)
g = gcd(e, z)
while g != 1:
e = random.randrange(1, n)
g = gcd(e, z)
 
d = multiplicative_inverse(e, z)
return (e,n),(d,n)
</syntaxhighlight>โค้ดในส่วนของการเข้ารหัส<syntaxhighlight lang="python3" line="1">
def encrypt(key,plainText):
e, n = key
cipherText = ""
for i in range(len(plainText)):
cipherText += chr(((ord(plainText[i]) ** e) % n))
return cipherText
</syntaxhighlight>โค้ดในส่วนของการถอดรหัส<syntaxhighlight lang="python3" line="1">
def decrypt(key, cipherText):
d, n = key
plainText = ""
for i in range(len(cipherText)):
plainText += chr(((ord(cipherText[i]) ** d) % n))
return plainText
</syntaxhighlight>
[[หมวดหมู่:การเข้ารหัส]]
{{โครงเทคโนโลยี}}
7

การแก้ไข