2014-01-14 6 views
0

Привет, Я пытаюсь создать рабочую программу RSA, но на очень маленьком уровне у меня возникают проблемы с шифрованием и расшифровкой с помощью этого кода, может кто-нибудь поможет мне разобраться, что не так? Я пробовал делать это по-разному, но, похоже, это правильная математика, поэтому я считаю, что это может быть просто недостаток навыков кодирования? БлагодаряПростой код RSA

import random, math 

def RandomPrime(): 
    prime = False 
    while prime == False: 
    n = 2 
    while n % 2 == 0: 
     n = random.randint(10000, 100000) 
    s = math.trunc(n**0.5) 
    s = int(s) 
    x = 3 
    # While n doesn't exactly divide to equal 0, and x is less then the sqrt of n 
    while (n % x != 0) and (x <= s): 
     x = x + 2 
    # if n is greater than s, it means it has run out of numbers to test, so is prime 
    if x > s: 
     prime = True 




    return n 

def Modulus(p, q): 
    M = p * q 
    return M 

def Totient(p, q): 
    T = ((p-1) * (q-1)) 
    return T 

def Pubkey(T): 
    prime = False 
    while prime == False: 
    n = 2 
    while n % 2 == 0: 
     n = random.randint(3, T) 
    s = math.trunc(n**0.5) 
    s = int(s) 
    x = 3 
    # While 
    while (n % x != 0) and (x <= s): 
     x = x + 2 
    if x > s: 
     prime = True 
    return n 

def privkey(T, n): 
    y = math.fmod(1, T) 
    d = float((y/n)) 
    return d 


# z is my encyption in this scenario 
z = 8 
# I generate p and q, using my random prime generator, i used low primes in 
# this example just to see if it would work but it is still not showing reults 
p = RandomPrime() 
q = RandomPrime() 
print(p, q) 
#This creates the modulus 
M = Modulus(p, q) 
print(M) 
# Eulier's totient 
T = Totient(p, q) 
print(T) 
#Pub key creation 
n = Pubkey(T) 
print(n) 
#Priv key creation 
d = privkey(n, T) 
print(d) 


enc = (pow(z, n)) % M 
print('enc: ', enc) 


dec = (pow(enc, d)) % M 
print('dec: ', dec) 
+0

вы пропустили сказать нам, какой язык программирования вы используете. Измените свой вопрос и добавьте его как минимум в качестве тега. – Robert

+0

его python, извините mate – user3181295

+0

Какая у вас ошибка? И можете ли вы вычислить (pow (z, n))? это должно быть огромное число для произвольного n. – alko

ответ

0

Ваш privkey функция появляется неправильно - я предполагаю, что вы видели, определение закрытого ключа RSA, как что-то вроде:

the value "e" such that e * d = 1 mod Phi(N)

Однако в этом случае 1 mod Phi(N) делает не значит The remainder when 1 is divided by Phi(N) (похоже, вы переводили его в код, основываясь на использовании вами math.fmod(1, T), но на самом деле его следует больше походить:

the value "e" such that (e * d) mod Phi(N) = 1

Это значение, как правило, рассчитывается с использованием Extended Euclidean Algorithm. Пример реализации Python - here.

Также стоит отметить, что вы, кажется, определяете privkey(T, n), но называете это privkey(n, T).

+0

Как мне переставить эту формулу, чтобы просто получить d? – user3181295

+0

@ user3181295 Для выполнения расчета вам понадобится использовать алгоритм, такой как расширенный евклидовой алгоритм (связанный в ответе выше). – Iridium

+0

Я борюсь с тем, что делаю это в python, вы можете помочь ??? – user3181295

0

Проверьте мой блог, который подробно содержит реализацию следующих с помощью Python:

MD5 Secure Hash Algorithm RFC 1321, RSA шифрование с открытым ключом RFC 3447, OpenPGP RFC 4880

def keyGen(): 
    ''' Generate Keypair ''' 
    i_p=randint(0,20) 
    i_q=randint(0,20) 
    # Instead of Asking the user for the prime Number which in case is not feasible, 
    # generate two numbers which is much highly secure as it chooses higher primes 
    while i_p==i_q: 
     continue 
    primes=PrimeGen(100) 
    p=primes[i_p] 
    q=primes[i_q] 
    #computing n=p*q as a part of the RSA Algorithm 
    n=p*q 
    #Computing lamda(n), the Carmichael's totient Function. 
    # In this case, the totient function is the LCM(lamda(p),lamda(q))=lamda(p-1,q-1) 
    # On the Contrary We can also apply the Euler's totient's Function phi(n) 
    # which sometimes may result larger than expected 
    lamda_n=int(lcm(p-1,q-1)) 
    e=randint(1,lamda_n) 
    #checking the Following : whether e and lamda(n) are co-prime 
    while math.gcd(e,lamda_n)!=1: 
     e=randint(1,lamda_n) 
    #Determine the modular Multiplicative Inverse 
    d=modinv(e,lamda_n) 
    #return the Key Pairs 
    # Public Key pair : (e,n), private key pair:(d,n) 
    return ((e,n),(d,n)) 

Блог Ссылка: Python Cryptography

Github Ссылка: Python Cryptography

+0

Ссылка на блог: [Криптография на Python] (http://crypto-python.blogspot.com) –

Смежные вопросы