2010-08-29 2 views
2

ищет, чтобы сделать шифрование RSA на короткой строке в python. Это для части пользовательских данных, которые я хочу хранить без того, чтобы персонал (включая меня) мог видеть это. Закрытый ключ будет находиться в пальцевом указателе в моем сейфе, когда мы получим вызовы в суд.какой пакет python для алгоритма rsa

мой вопрос: есть ли «вероятно правильный» пакет python для RSA с асимметричным ключом? Будет ли я безопаснее использовать библиотеку C (если это так).

+0

Похоже, вы действительно хотите симметричное шифрование. –

+0

нет, он должен быть асимметричным. открытый ключ живет на сервере, и мои сотрудники могут получить к нему доступ. – amwinter

+0

Почему вы ищете «вероятно правильное» решение, а не «правильное»? – MAK

ответ

1

шифрования коротких строк с RSA может быть проблематичным. Есть определенные фрагменты данных, которые вы можете зашифровать с помощью RSA, которые раскрывают детали вашего закрытого ключа. В вашем случае это, вероятно, будет хорошо, так как оно будет неясным, ваши сотрудники не поймут это. Но в общем случае, со знающим и/или финансируемым противником, вы не хотите использовать RSA для прямого шифрования данных, если вы хотите, чтобы эти данные хранились в секрете.

Я бы порекомендовал использовать вместо этого gnupg. Это решает все эти проблемы для вас.

+0

Вы говорите об общей атаке модуля? – amwinter

+0

@amwinter - Если значение слишком мало, а показатель также мал (что обычно имеет место), то можно получить тривиальный корень результата, чтобы получить исходное сообщение. Это ничего не говорит о закрытом ключе, но делает это шифрование бесполезным. Существует еще одна атака, которая раскрывает информацию о закрытом ключе, но я не могу вспомнить ее имя, поэтому вы можете быть правы. Существует также выбранная атака открытого текста при подписании, поэтому вы всегда подписываете хеши. – Omnifarious

+0

@amwinter - Я посмотрел. Я на самом деле говорю об атаках, связанных с низким показателем шифрования. Один из способов решения проблемы с низким показателем шифрования состоит в том, чтобы отправлять сообщения короче максимального размера и заполнять их множеством случайных данных, что является именно тем, что делает gnupg, когда он шифрует симметричный ключ, используемый для фактического шифрования. – Omnifarious

3
+0

pycrypto не берет код у американцев. – amwinter

+0

Вы хотите внести свой вклад или использовать его? –

+0

@gregs Я хочу, чтобы он был безопасным и заимствовал код C из проверенных проектов. – amwinter

1
def gcd (a, b): 
    "Compute GCD of two numbers" 

    if b == 0: return a 
    else: return gcd(b, a % b) 

def multiplicative_inverse(a, b): 
    """ Find multiplicative inverse of a modulo b (a > b) 
     using Extended Euclidean Algorithm """ 

    origA = a 
    X = 0 
    prevX = 1 
    Y = 1 
    prevY = 0 

    while b != 0: 

     temp = b 
     quotient = a/b 
     b = a % b 
     a = temp 

     temp = X 
     a = prevX - quotient * X 
     prevX = temp 

     temp = Y 
     Y = prevY - quotient * Y 
     prevY = temp 

    return origA + prevY 

def generateRSAKeys(p, q): 
    "Generate RSA Public and Private Keys from prime numbers p & q" 

    n = p * q 
    m = (p - 1) * (q - 1) 

    # Generate a number e so that gcd(n, e) = 1, start with e = 3 
    e = 3 

    while 1: 

     if gcd(m, e) == 1: break 
     else: e = e + 2 

    d = multiplicative_inverse(m, e) 

    # Return a tuple of public and private keys 
    return ((n,e), (n,d))   

if __name__ == "__main__": 

    print "RSA Encryption algorithm...." 
    p = long(raw_input("Enter the value of p (prime number):")) 
    q = long(raw_input("Enter the value of q (prime number):")) 

    print "Generating public and private keys...." 
    (publickey, privatekey) = generateRSAKeys(p, q) 

    print "Public Key (n, e) =", publickey 
    print "Private Key (n, d) =", privatekey 

    n, e = publickey 
    n, d = privatekey 

    input_num = long(raw_input("Enter a number to be encrypted:")) 
    encrypted_num = (input_num ** e) % n 
    print "Encrypted number using public key =", encrypted_num 
    decrypted_num = encrypted_num ** d % n 
    print "Decrypted (Original) number using private key =", decrypted_num 
Смежные вопросы