2017-08-18 5 views
1

Ich erhalte diese Fehlermeldung:Attribute: ‚Rsa‘ Objekt hat kein Attribut ‚n‘

Traceback (most recent call last): 
    File "/Users/aditya/Desktop/Pycharm /Fire_Tech_Camp/Rsa/RsaMainFrame.py", line 7, in <module> 
    rsa = RsaEncryptionAndDecryption.Rsa() 
    File "/Users/aditya/Desktop/Pycharm /Fire_Tech_Camp/Rsa/RsaEncryptionAndDecryption.py", line 8, in __init__ 
    self.p, self.q = self.findingPandQ() 
    File "/Users/aditya/Desktop/Pycharm /Fire_Tech_Camp/Rsa/RsaEncryptionAndDecryption.py", line 80, in findingPandQ 
    while not self.isPrime(self.a): 
    File "/Users/aditya/Desktop/Pycharm /Fire_Tech_Camp/Rsa/RsaEncryptionAndDecryption.py", line 14, in isPrime 
    for i in range(2,int(self.n**0.5)+1): 
AttributeError: 'Rsa' object has no attribute 'n' 

Was ich versuche zu tun ist, eine Klasse mit einer Funktion (isPrime()) erstellen Primzahlen zu überprüfen. Dann überprüfe ich in einer separaten Funktion, ob es prim ist (generate_keys()). Die Klasse wird in einer separaten Datei aufgerufen.

Code: Main-Datei, wo ich die Klasse nennen:

from Rsa import RsaEncryptionAndDecryption 
from appJar import gui 

app = gui() 
rsa = RsaEncryptionAndDecryption.Rsa() 

def encode(name): 
    msg = app.getEntry('Input to Encode Here') 
    if msg != '': 
     p, q = rsa.findingPandQ() 

     while p == q: 
      p, q = rsa.findingPandQ() 

     n, e, d = rsa.generate_keys(p, q) 

     print(n, e, d) 

Ich betreibe diese Funktion in diesem

app.addButton('Encode', encode, 3, 3) 

Der Klassencode ist hier:

import random 
from math import gcd 

class Rsa: 

    def __init__(self): 
     self.p, self.q = self.findingPandQ() 
     self.n = self.p * self.q 
     self.phi = (self.p - 1) * (self.q - 1) 
     self.e = 0 

    def isPrime(self, n): 
     for i in range(2,int(self.n**0.5)+1): 
      if self.n%i == 0: 
       return False 

     return True 

    def modReverse(self, phi, e): 
     self.pos00 = self.phi 
     self.pos01 = self.phi 
     self.pos10 = self.e 
     self.pos11 = 1 
     self.newpos10 = 0 


     while self.newpos10 != 1: 
      self.pos00pos10int = self.pos00 // self.pos10 
      self.inttimespos10 = self.pos00pos10int * self.pos10 
      self.inttimespos11 = self.pos00pos10int * self.pos11 

      self.newpos10 = self.pos00 - self.inttimespos10 
      if self.newpos10 < 0: 
       self.newpos10 %= phi 
       self.newpos11 = self.pos01 - self.inttimespos11 
      if self.newpos11 < 0: 
       self.newpos11 %= phi 

       self.pos00 = self.pos10 
       self.pos01 = self.pos11 
       self.pos10 = self.newpos10 
       self.pos11 = self.newpos11 


     return self.newpos11 

    def coprime(self, a, b): 
     return gcd(self.a, self.b) == 1 

    def findingPandQ(self): 
     self.a = random.randint(10,100) 
     while not self.isPrime(self.a): 
      self.a = random.randint(10,100) 

      self.b = random.randint(10,100) 
     while not self.isPrime(self.b): 
      self.b = random.randint(10,100) 
     return self.a, self.b 

    def generate_keys(self, p, q): 


     for i in range(self.phi): 
      if self.isPrime(i): 
       if self.coprime(i, self.phi): 
        self.e = i 

     self.d = self.modReverse(self.phi, self.e) 

     while self.e == self.d: 
      self.p, self.q = self.findingPandQ(self.p, self.q) 

      while self.p == self.q: 
       self.p, self.q = self.findingPandQ(self.p, self.q) 
       self.n, self.e, self.d = self.generate_keys(self.p, self.q) 
     return self.n, self.e, self.d 

Antwort

2

Sie sind Rufen Sie Ihre Funktionen vor haben Sie festgelegt self.n:

def __init__(self): 
    self.p, self.q = self.findingPandQ() 
    self.n = self.p * self.q 

self.n gesetzt wird, erst nachdem Sie findingPandQ() genannt. Da Sie isPrime() von findingPandQ() anrufen und isPrime() davon ausgeht, dass self.n existiert, schlägt das fehl.

Sie haben wahrscheinlich einen einfachen Fehler gemacht; Sie sollten n (das Argument isPrime() vergangen, und nichtself.n werden:.?

def isPrime(self, n): 
    for i in range(2, int(n ** 0.5) + 1): 
     if n % i == 0: 
      return False 
    return True 
+0

Warum ist es, dass ich der Selbst loswerden müssen Vielleicht haben Sie es mit allen Variablen sind erforderlich, Funktionen usw.? –

+0

@EpicBoss: 'n' ist eine lokale Variable;' self.n' ist ein Attribut. Sie sind zwei verschiedene Dinge. –

Verwandte Themen