2010-08-29 3 views
2

cherchant à faire le chiffrement RSA sur une chaîne courte en python. C'est pour un morceau de données d'utilisateur que je veux stocker sans personnel (y compris moi-même) pouvoir le voir. La clé privée sera sur une clé USB dans mon coffret de sécurité lorsque nous serons assignés à comparaître.quel package python pour algorithme rsa

ma question: existe-t-il un paquet python «probablement correct» pour RSA asymétrique-clé? Serai-je plus sûr d'utiliser une bibliothèque C (si oui lequel).

+0

Cela ressemble à un chiffrement symétrique. –

+0

non, il doit être asymétrique. la clé publique réside sur le serveur et mon personnel peut y accéder. – amwinter

+0

Pourquoi cherchez-vous une solution «probablement correcte» par opposition à une solution «correcte»? – MAK

Répondre

1

Le chiffrement des chaînes courtes avec RSA peut être problématique. Certaines données peuvent être cryptées avec RSA pour révéler des détails sur votre clé privée. Dans votre cas, cela ira probablement bien car il sera assez obscur que votre personnel ne le comprendra pas. Mais dans le cas général, avec un adversaire bien informé et/ou bien financé, vous ne voulez pas utiliser RSA pour chiffrer directement des données si vous voulez que ces données soient gardées secrètes.

Je recommande d'utiliser simplement gnupg à la place. Il a résolu tous ces problèmes pour vous.

+0

parlez-vous de l'attaque du module commun? – amwinter

+0

@amwinter - Si la valeur est trop petite et que l'exposant est également petit (ce qui est généralement le cas), alors il est possible de prendre trivialement la racine du résultat pour obtenir le message original. Cela ne révèle rien à propos de la clé privée, mais cela rend le chiffrement inutile. Il y a une autre attaque qui révèle des informations sur la clé privée, mais je ne me souviens pas de son nom, alors vous avez peut-être raison. Une attaque de texte en clair est également sélectionnée lors de la signature, ce qui explique pourquoi vous signez toujours des hachages. – Omnifarious

+0

@amwinter - J'ai regardé ça. Je parle en fait d'attaques liées à des exposants à faible chiffrement. Une façon de résoudre le problème de l'exposant à faible chiffrement est d'envoyer des messages plus courts que la taille maximale et de les remplir avec beaucoup de données aléatoires, ce que fait exactement gnupg lorsqu'il crypte la clé symétrique utilisée pour effectuer le chiffrement. – Omnifarious

3
+0

pycrypto ne prend pas de code des américains. – amwinter

+0

Souhaitez-vous contribuer ou l'utiliser? –

+0

@TEGS Je veux que ce soit sécurisé et emprunter du code C à partir de projets éprouvés – 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