J'essaie de créer un programme qui gère le chiffrement et le déchiffrement RSA pour l'envoi de messages à l'aide de la bibliothèque rsa. Actuellement, je l'implémente pour n'utiliser qu'une seule paire de clés, mais elle sera modifiée plus tard. J'ai des problèmes avec la logique pour vérifier si les fichiers qui stockent les clés existent ou non. La logique de ces fonctions ressemble à ceci:
import rsa
################################################
keySize = 256
################################################
def genKeys():
pubkey, privkey = rsa.newkeys(keySize)
with open("public.pem", "w") as pub:
pub.write(str(pubkey))
with open("private.pem", "w") as priv:
priv.write(str(privkey))
return pubkey, privkey
def readKeys():
with open("private.pem", "r") as priv:
keydata = priv.read()
privkey = rsa.PrivateKey.load_pkcs1(keydata)
print(privkey)
with open("public.pem", "r") as pub:
keydata = pub.read()
pubkey = rsa.PublicKey.load_pkcs1(keydata)
print(pubkey)
return pubkey, privkey
def send(message, pubkey):
message = message.encode('utf-8')
crypto = rsa.encrypt(message, pubkey)
return crypto
def recv(crypto, privkey):
message = rsa.decrypt(crypto, privkey)
message = message.decode('utf-8')
return message
def main():
global pubkey, privkey
try:
if (open("private.pem", "r") and open("public.pem", "r")) == True:
pubkey, privkey = readKeys()
except:
(pubkey, privkey) = genKeys()
cryptMessage = send('hello world', pubkey)
print(cryptMessage)
print(recv(cryptMessage, privkey))
if __name__ == "__main__":
main()
La fonction main()
, en particulier l'instruction try: except:
, est l'endroit où réside mon problème. L'erreur que j'obtiens est builtins.NameError: name 'pubkey' is not defined
. J'ai essayé de déclarer les variables comme globales, ce que d'autres réponses ont suggéré, mais cela n'a pas fonctionné pour moi, ou je le fais mal.
Merci pour l'aide. Désolé pour la question noob.
ÉDITER: Donc, cela a résolu mon premier problème. Cependant, maintenant, lorsque j'utilise l'instruction try/except
, il essaie d'appeler les variables, qui ont une valeur de None
, même si je leur attribue une valeur à l'aide des fonctions. La trace de pile est
File "", line 61, in <module>
main()
File "", line 56, in main
cryptMessage = send('hello world', pubkey)
File "", line 37, in send
crypto = rsa.encrypt(message, pubkey)
File "/usr/local/lib/python3.6/dist-packages/rsa/pkcs1.py", line 169, in encrypt
keylength = common.byte_size(pub_key.n)
builtins.AttributeError: 'NoneType' object has no attribute 'n'
3 réponses
Même si vous déclarez une variable comme globale dans une fonction, vous devez toujours l'initialiser, ou dans la portée globale ou lors de la déclaration.
import rsa
################################################
keySize = 256
################################################
# DECLARATION IN GLOBAL SCOPE
pubkey = None
privkey = None
def genKeys():
pubkey, privkey = rsa.newkeys(keySize)
with open("public.pem", "w") as pub:
pub.write(str(pubkey))
with open("private.pem", "w") as priv:
priv.write(str(privkey))
return pubkey, privkey
def readKeys():
with open("private.pem", "r") as priv:
keydata = priv.read()
privkey = rsa.PrivateKey.load_pkcs1(keydata)
print(privkey)
with open("public.pem", "r") as pub:
keydata = pub.read()
pubkey = rsa.PublicKey.load_pkcs1(keydata)
print(pubkey)
return pubkey, privkey
def send(message, pubkey):
message = message.encode('utf-8')
crypto = rsa.encrypt(message, pubkey)
return crypto
def recv(crypto, privkey):
message = rsa.decrypt(crypto, privkey)
message = message.decode('utf-8')
return message
def main():
# DECLARATION INSIDE THE FUNCTION
global pubkey, privkey; pubkey = privkey = None
try:
if (open("private.pem", "r") and open("public.pem", "r")) == True:
pubkey, privkey = readKeys()
except:
(pubkey, privkey) = genKeys()
cryptMessage = send('hello world', pubkey)
print(cryptMessage)
print(recv(cryptMessage, privkey))
if __name__ == "__main__":
main()
Votre problème est ici:
if (open("private.pem", "r") and open("public.pem", "r")) == True:
Les opérateurs logiques Python renvoient la dernière valeur inspectée, pas True ou False. Cette valeur était un objet file
de la commande open n'est pas égal à True. Vous pouvez vérifier l'existence des fichiers avec os.path.isfile
et ignorer complètement le bloc try / except. Ou vous pouvez simplement essayer la lecture réelle dans le bloc d'essai, comme ça
(allégé pour démo)
# dummys for test...
def readKeys():
print('try read')
return open('public.pem').read(), open('private.pem').read()
def genKeys():
print('try write')
open('public.pem','w').write('foo')
open('private.pem','w').write('bar')
return 'foo', 'bar'
def main():
global pubkey, privkey
try:
pubkey, privkey = readKeys()
except:
(pubkey, privkey) = genKeys()
if __name__ == "__main__":
main()
Vous devez déclarer les variables pubkey et privkey en dehors de la fonction genKeys()
, puis l'erreur devrait disparaître. Ceci est mon premier post, j'espère être utile. Cordialement.
Questions connexes
De nouvelles questions
python
Python est un langage de programmation multi-paradigme, typé dynamiquement et polyvalent. Il est conçu pour être rapide à apprendre, comprendre, utiliser et appliquer une syntaxe propre et uniforme. Veuillez noter que Python 2 est officiellement hors support à partir du 01-01-2020. Néanmoins, pour les questions Python spécifiques à la version, ajoutez la balise [python-2.7] ou [python-3.x]. Lorsque vous utilisez une variante Python (par exemple, Jython, PyPy) ou une bibliothèque (par exemple, Pandas et NumPy), veuillez l'inclure dans les balises.