2017-07-04 10 views
0

私はこの小さなモジュールをPython 3でPyCryptodomeとRSA/PKCS1_OAEPモジュールを使って書きました。しかし、私はエラーを取得しておいてください。名前を呼び出す際にモジュールを呼び出し、クラス関数のデフォルト値を宣言する

NameError: name 'aesenc' is not defined

これは、2つの部分の質問です:スタンドアロンコードで

  1. (クラス外)= default_valコードが動作する引数が、私はかなりよこのコードがエラーを投げることを確かめてください(私が質問#2を修正したと仮定して)。私はself.default_valを使うことができないことも知っています。なぜなら、まずオブジェクトを作成する必要があるからです。

  2. エラーメッセージに関して、vgrepは、スイートが呼び出される前に宣言されていることを示していますが、それでも私はまだそのオブジェクトのプライベート/パブリックキーを割り当てますか? NameErrorを取得します。誰かが見て、私が間違っていることを教えてくださいできますか?

モジュール(SOコードを相互に重なったり保つように部品に侵入)

from passlib.context import CryptContext 
from Crypto.Cipher import AES, PKCS1_OAEP 
from Crypto.PublicKey import RSA 
from Crypto import Random 
from Crypto.Random import get_random_bytes 

クラス:

class statEnc: 
    pubcipher = None 
    privcipher = None 
    pubkeystr = None 
    privkeystr = None 
    sessionkey = None 

    def __init__(self, pubkeystr = None, privkeystr = None, sessionkey = None): 
     self.pubkeystr = pubkeystr 
     self.privkeystr = privkeystr 
     self.sessionkey = sessionkey 
     if pubkeystr == None or privkeystr == None: #if blank, generate keys 
      self.random_generator = Random.new().read 
      self.keys = RSA.generate(1024, self.random_generator) 
      self.pubkey = self.keys.publickey() 
      self.pubkeystr = self.pubkey.exportKey(format='PEM', 
              passphrase=None, 
              pkcs=1) 
      self.pubcipher = PKCS1_OAEP.new(self.pubkey) 
      self.privcipher = PKCS1_OAEP.new(self.keys) 
      self.privkeystr = self.keys.exportKey(format='PEM', 
               passphrase=None, 
               pkcs=1) 
      self.privkey = self.keys.exportKey() 
     else: #import the keys 
      self.pubkey = RSA.importKey(pubkeystr) 
      self.pubcipher = PKCS1_OAEP.new(pubkey) 
      self.privkey = RSA.importKey(privkeystr) 
      self.pubcipher = PKCS1_OAEP.new(privkey) 
      if sessionkey == None: 
       sessionkey = get_random_bytes(16) 
      else: 
       self.sessionkey = sessionkey 

    def encrypt_val(self, session_key, cipher = pubcipher): 
     # a little ditty to hep encrypt the AES session key 
     try: 
      session_key = session_key.encode('utf8') 
     except: 
      pass 
     ciphertext = cipher.encrypt(session_key) 
     return ciphertext 


    def decrypt_val(self, ciphertext, cipher = privcipher): 
     # a little ditty to hep decrypt the AES session key 
     session_key = cipher.decrypt(ciphertext) 
     try: 
      session_key = session_key.decode('utf8') 
     except: 
      pass 
     return session_key 

    def aesenc(self, data, *args): 
     #encrypt the payload using AES 
     key = '' 
     if args: 
      if 'str' in str(type(args[0])): 
       try: 
        key = int(args[0]) 
       except: 
        key = get_random_bytes(16) 
     else: 
      key = get_random_bytes(16) 
     try: 
      data = data.encode('utf8') 
     except: 
      pass 
     cipher = AES.new(key, AES.MODE_EAX) 
     ciphertext, tag = cipher.encrypt_and_digest(data) 
     aesencdict = { 
     'ciphertext' : ciphertext, 
     'tag' : tag, 
     'nonce' : cipher.nonce , 
     'key' : key 
     } 
     return(aesencdict) 

    def aesdec(self, aesdict): 
     #decrypt the AES encrypted payload 
     cipher = AES.new(aesdict['key'], AES.MODE_EAX, aesdict['nonce']) 
     data = cipher.decrypt_and_verify(aesdict['ciphertext'], aesdict['tag']) 
     try: 
      data = data.decode('utf8') 
     except: 
      pass 
     return data 

    def end2enc(self, val, cipher = pubcipher): 
     # a master function to first encrypt the payload 
     val = str(val) 
     encval = aesenc(val) 
     # and then PK encrypt the key 
     encval['key'] = encrypt_val(encval['key'], cipher) 
     return encval 

    def end2dec(self, encval, cipher = privcipher): 
     encval['key'] = decrypt_val(encval['key'], cipher) 
     outval = aesdec(encval['aesdict'], encval['key']) 
     return outval 

テスト機能とメイン:

def test(): 
    val = { 'test' : "hello"} 
    keypair = statEnc() 
    print(str(type(keypair))) 
    encval = keypair.end2enc(val, keypair.pubcipher) 
    outval = keypair.end2dec(encval, keypair.privcipher) 
    print(val, outval) 
    if val == eval(outval): 
     return(val) 
    else: 
     return False 

if __name__ == '__main__': 
    test() 

[アップデート] Tracebac次のようにkは次のとおりです。

[[email protected] stat]$ python statenc.py 
<class '__main__.statEnc'> 
Traceback (most recent call last): 
    File "statenc.py", line 124, in <module> 
    test() 
    File "statenc.py", line 115, in test 
    encval = keypair.end2enc(val, keypair.pubcipher) 
    File "statenc.py", line 100, in end2enc 
    encval = aesenc(val) 
NameError: name 'aesenc' is not defined 
+1

エラートレースバックの投稿はプラスになります。 –

+0

トレースバックを追加しました - それを共有できなかったことを指摘してくれてありがとう! :) – kilokahn

答えて

0

は私の質問の上に寝て新鮮な心で目が覚めた、と出来上がり!その答えはそれ自体を提示した。

2番目の質問に対する答えは次のとおりです。 2.単純な「自己」を置く。問題を解決する - 私は 'selfesaesenc(params)'の代わりに 'aesenc(params)'を呼んでいた。私の愚かな、本当に。

質問1の回答はthis SO questionです。