2009-06-25 3 views
2

Je dois prendre une chaîne en Python et la chiffrer à l'aide d'une clé publique.Chiffrer une chaîne à l'aide d'une clé publique

Quelqu'un peut-il me donner un exemple ou une recommandation sur la façon de s'y prendre?

+0

Qu'avez-vous trouvé dans votre recherche Google pour « chiffrement à clé publique en python »? N'importe quoi? –

+3

Aussi, juste pour l'enregistrement, il est très inhabituel de chiffrer une chaîne avec une clé publique en tant que telle. La chose standard à faire est de générer aléatoirement une "clé de session" à utiliser avec un chiffrement symétrique (en utilisant une source aléatoire sécurisée, par exemple/dev/random), crypter votre message en utilisant le chiffrement symétrique, puis chiffrer la clé de session en utilisant le Clé publique. –

+0

@Chris: Pas s'il parle de (par exemple) e-mail - pour le courrier électronique, crypter avec la clé publique est une chose parfaitement normale à faire. – RichieHindle

Répondre

3

Pour ce faire, vous aurez besoin d'une bibliothèque de chiffrement Python.

Jetez un oeil à ezPyCrypto: « En réaction à d'autres bibliothèques crypto, qui peut être douloureusement complexe à comprendre et à utiliser, ezPyCrypto a été conçu dès le départ du sol pour la facilité d'utilisation absolue, sans compromettre la sécurité. »

Il a une API:

encString(self, raw) 

qui ressemble à ce que vous êtes après: «func haut niveau encrypte une chaîne complète de données, retourner la chaîne cryptée en tant que binaire. »

2

PyMe fournit une interface Python à la bibliothèque GPGME.

Vous devriez, en théorie, pouvoir utiliser cela pour interagir avec GPG de Python afin de faire le chiffrement que vous avez besoin de faire.

Voici un exemple très simple de code du documentation:

Ce programme n'est pas pour le cryptage sérieux, mais qu'à titre d'exemple!

import sys 
from pyme import core, constants 

# Set up our input and output buffers. 

plain = core.Data('This is my message.') 
cipher = core.Data() 

# Initialize our context. 

c = core.Context() 
c.set_armor(1) 

# Set up the recipients. 

sys.stdout.write("Enter name of your recipient: ") 
name = sys.stdin.readline().strip() 
c.op_keylist_start(name, 0) 
r = c.op_keylist_next() 

# Do the encryption. 

c.op_encrypt([r], 1, plain, cipher) 
cipher.seek(0,0) 
print cipher.read() 
2

Je regardais la bibliothèque ezPyCrypto qui a été recommandé dans une autre réponse. Veuillez ne pas utiliser cette bibliothèque. Il est très incomplet et, dans certains cas, incorrect et très peu sûr. Les algorithmes de clé publique présentent de nombreux pièges et doivent être mis en œuvre avec soin. Par exemple, le message RSA doit utiliser un schéma de remplissage tel que PKCS # 1, OAEP, etc. pour être sécurisé. Cette bibliothèque ne contient pas de tampon. Les signatures DSA doivent utiliser la fonction de hachage SHA1. Cette bibliothèque utilise le hachage MD5 rompu et il y a même un plus grand bug dans la génération de nombres aléatoires. Par conséquent, la mise en œuvre de la DSA n'est ni conforme aux normes ni sécurisée. ElGamal est également implémenté de manière incorrecte.

Les normes suivantes rendent les implémentations un peu plus complexes. Mais ne pas suivre tout n'est pas une option. Du moins pas si vous vous souciez de la sécurité.

0

Un même « simple » par exemple, sans l'utilisation de toutes les bibliothèques supplémentaires serait:

def rsa(): 
# Choose two prime numbers p and q 
p = raw_input('Choose a p: ') 
p = int(p) 

while isPrime(p) == False: 
    print "Please ensure p is prime" 
    p = raw_input('Choose a p: ') 
    p = int(p) 

q = raw_input('Choose a q: ') 
q = int(q) 

while isPrime(q) == False or p==q: 
    print "Please ensure q is prime and NOT the same value as p" 
    q = raw_input('Choose a q: ') 
    q = int(q) 

# Compute n = pq 
n = p * q 

# Compute the phi of n 
phi = (p-1) * (q-1) 

# Choose an integer e such that e and phi(n) are coprime 
e = random.randrange(1,phi) 

# Use Euclid's Algorithm to verify that e and phi(n) are comprime 
g = euclid(e,phi) 
while(g!=1): 
    e = random.randrange(1,phi) 
    g = euclid(e,phi) 

# Use Extended Euclid's Algorithm 
d = extended_euclid(e,phi) 

# Public and Private Key have been generated 
public_key=(e,n) 
private_key=(d,n) 
print "Public Key [E,N]: ", public_key 
print "Private Key [D,N]: ", private_key 

# Enter plain text to be encrypted using the Public Key 
sentence = raw_input('Enter plain text: ') 
letters = list(sentence) 

cipher = [] 
num = "" 

# Encrypt the plain text 
for i in range(0,len(letters)): 
    print "Value of ", letters[i], " is ", character[letters[i]] 

    c = (character[letters[i]]**e)%n 
    cipher += [c] 
    num += str(c) 
print "Cipher Text is: ", num 

plain = [] 
sentence = "" 

# Decrypt the cipher text  
for j in range(0,len(cipher)): 

    p = (cipher[j]**d)%n 

    for key in character.keys(): 
     if character[key]==p: 
      plain += [key] 
      sentence += key 
      break 
print "Plain Text is: ", sentence 

# Euclid's Algorithm 
def euclid(a, b): 
if b==0: 
    return a 
else: 
    return euclid(b, a % b) 

# Euclid's Extended Algorithm 
def extended_euclid(e,phi): 
d=0 
x1=0 
x2=1 
y1=1 
orig_phi = phi 
tempPhi = phi 

while (e>0): 
    temp1 = int(tempPhi/e) 
    temp2 = tempPhi - temp1 * e 
    tempPhi = e 
    e = temp2 

    x = x2- temp1* x1 
    y = d - temp1 * y1 

    x2 = x1 
    x1 = x 
    d = y1 
    y1 = y 

    if tempPhi == 1: 
     d += phi 
     break 
return d 

# Checks if n is a prime number 
def isPrime(n): 
for i in range(2,n): 
    if n%i == 0: 
     return False 
return True 

character = {"A":1,"B":2,"C":3,"D":4,"E":5,"F":6,"G":7,"H":8,"I":9,"J":10, 
    "K":11,"L":12,"M":13,"N":14,"O":15,"P":16,"Q":17,"R":18,"S":19, 
    "T":20,"U":21,"V":22,"W":23,"X":24,"Y":25,"Z":26,"a":27,"b":28, 
    "c":29,"d":30,"e":31,"f":32,"g":33,"h":34,"i":35,"j":36,"k":37, 
    "l":38,"m":39,"n":40,"o":41,"p":42,"q":43,"r":44,"s":45,"t":46, 
    "u":47,"v":48,"w":49,"x":50,"y":51,"z":52, " ":53, ".":54, ",":55, 
    "?":56,"/":57,"!":58,"(":59,")":60,"$":61,":":62,";":63,"'":64,"@":65, 
    "#":66,"%":67,"^":68,"&":69,"*":70,"+":71,"-":72,"_":73,"=":74} 
Questions connexes