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?
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?
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. »
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()
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é.
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}
Qu'avez-vous trouvé dans votre recherche Google pour « chiffrement à clé publique en python »? N'importe quoi? –
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. –
@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