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'
0
GarrukApex 14 avril 2018 à 19:17

3 réponses

Meilleure réponse

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()
1
Ami Hollander 14 avril 2018 à 16:41

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()
0
tdelaney 14 avril 2018 à 16:47

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.

0
Half_Bit 15 avril 2018 à 12:31