2016-09-09 2 views
0

값이 p,q,d = 61,53,17 인 RSA 암호화 및 암호 해독 코드를 구현했습니다. 위키 백과에서 언급 한대로이 값들을 사용했습니다. 나는 p와 q가 프라임이어야하고 d는 ph와 (n)이 상대적으로 소수가되도록 선택된다고 믿는다.작은 소수로 RSA 암호화 파이썬이 작동하지 않습니다

값을 p,q,d = 3,17,19으로 변경하면 암호 해독이 작동하지 않습니다. 이걸 좀 도와 주실 수 있습니까? 당신이 d을 부르는

#!/usr/bin/python3 
# -*- coding: utf-8 -*- 

def main(): 
    str = 'computer' 
    p,q,d = 61,53,17 
    #p,q,d = 3,17,19 
    cipher_text = list() 
    plain_text = list() 

    for c in str: 
     cipher_char = EncryptCharRSA(c, p, q ,d) 
     cipher_text.append(cipher_char) 


    for x in cipher_text: 
     plain_char = DecryptCharRSA(x, p, q, d)  
     plain_text.append(plain_char) 

    print ('Original Message: ', str) 

    print ('Encrypted Message(UTF-8 Unicode characters) : ', end='') 
    for element in cipher_text: 
     print(element,end = '') 

    print ('\nDecrypted Message: ', end='') 
    for element in plain_text: 
     print(element,end='') 

def EncryptCharRSA(msg , p, q, d): 
    n = p * q 
    phi = (p-1) * (q-1)    
    cipher_no = 0 
    cipher_char = '' 

    for c in msg: 
     # conver char to ascii for calculation 
     cipher_no = (ord(c)** d) % n 
     cipher_char = chr(cipher_no) 
     return cipher_char 
     #print (cipher_no) 
     #plain_no = (cipher_no ** d) % n 

def DecryptCharRSA(msg,p, q,d): 
    n = p * q 
    phi = (p-1) * (q-1) 
    e = ModularMultiplicativeInverse(d,phi) 
    for c in msg: 
     plain_no = (ord(c) ** e) % n 
     plain_char = chr(plain_no) 
     return plain_char 

# Get modular multiplicative inverse 
def ModularMultiplicativeInverse(d,n): 
    i = 1 
    while True: 
     if (d * i) % n == 1: 
     return i 
     i = i + 1 

if __name__ == '__main__' : main() 
+0

'for' 루프 내부의'return'은 의도적입니까? – RafazZ

+0

예. 문자를 암호화/해독 한 후에는 문자를 main() 함수로 반환합니다. –

답변

2

실제로 e 공개 지수이며, 당신이 e를 호출하는 것은 실제로 d 비공개 지수입니다 : 여기 내 코드입니다.

다른 이름을 지정하면 n 이상의 평문 문자 코드 포인트를 암호화한다는 점에서 문제가 있습니다. 그럴 경우 실제로는 ord("A") (= 65)이 아니라 ord("A") % n이 암호화됩니다.

>>> n = 3 * 17 # 51 
>>> ord("A") 
65 
>>> ord("A") % n 
14 

을 그리고 당신이 해독 할 수있을 것이라고 정확히 : 작은 n에 대한 귀하의 경우와 같이이 복구 할 수없는 암호문으로 이어질 것입니다. RSA는 임의로 큰 데이터를 암호화하는 데 사용할 수있는 것이 아닙니다. 일반적으로 AES와 같은 안전하고 빠른 블록 암호 (hybrid encryption)를 결합합니다.

+0

예 : letters = {a : 1, b : 2 ....}와 같이 사전을 사용하여 문자 집합을 제한했습니다. 이제는 잘 작동합니다. 당신의 도움을 주셔서 감사합니다 :-) –