Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/339.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 属性错误:';Rsa&x27;对象没有属性';n';_Python_Python 3.x - Fatal编程技术网

Python 属性错误:';Rsa&x27;对象没有属性';n';

Python 属性错误:';Rsa&x27;对象没有属性';n';,python,python-3.x,Python,Python 3.x,我得到这个错误: 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/Rsa

我得到这个错误:

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'
我在这里运行这个函数

   app.addButton('Encode', encode, 3, 3)
课程代码如下:

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
随机导入
从数学导入gcd
Rsa类:
定义初始化(自):
self.p,self.q=self.findingPandQ()
self.n=self.p*self.q
self.phi=(self.p-1)*(self.q-1)
self.e=0
def iPrime(自我,n):
对于范围(2,int(self.n**0.5)+1)内的i:
如果self.n%i==0:
返回错误
返回真值
def modReverse(自动、phi、e):
self.pos00=self.phi
self.pos01=self.phi
self.pos10=self.e
self.pos11=1
self.newpos10=0
而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
如果self.newpos10<0:
self.newpos10%=φ
self.newpos11=self.pos01-self.inttimespos11
如果self.newpos11<0:
self.newpos11%=φ
self.pos00=self.pos10
self.pos01=self.pos11
self.pos10=self.newpos10
self.pos11=self.newpos11
返回self.newpos11
def互质(self,a,b):
返回gcd(自我a、自我b)==1
def findingPandQ(自身):
self.a=random.randint(10100)
而不是self.isPrime(self.a):
self.a=random.randint(10100)
self.b=random.randint(10100)
而不是self.isPrime(self.b):
self.b=random.randint(10100)
返回self.a,self.b
def生成密钥(self、p、q):
对于范围内的i(自身φ):
如果self.isPrime(i):
如果自互素(i,自φ):
self.e=i
self.d=self.modReverse(self.phi,self.e)
当self.e==self.d时:
self.p,self.q=self.findingPandQ(self.p,self.q)
而self.p==self.q:
self.p,self.q=self.findingPandQ(self.p,self.q)
self.n,self.e,self.d=self.generate_键(self.p,self.q)
返回self.n,self.e,self.d

在设置了
self.n
之前,您正在调用函数

def __init__(self):
    self.p, self.q = self.findingPandQ()
    self.n = self.p * self.q
def isPrime(self, n):
    for i in range(2, int(n ** 0.5) + 1):
        if n % i == 0:
            return False
    return True
self.n
仅在调用
findingPandQ()
后设置。因为您从
findingPandQ()
调用
isPrime()
,并且
isPrime()
假设
self.n
存在,所以失败

你可能犯了一个简单的错误;您应该使用
n
(参数传递给
isPrime()
,而不是
self.n

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

为什么我必须去掉self?我以为你需要将它与所有变量、函数等一起包含?@EpicBoss:
n
是一个局部变量;
self.n
是一个属性。它们是两个不同的东西。