2013-07-27 2 views
0

Неизвестная ошибка в PyCrypto AES CBC шифрование, Ключ разделся до 16bytes, но все же он дает эту ошибку:Неизвестная ошибка шифрования AES CBC PyCrypto 2.6

Источник Помощь Артикул: http://support.ideascale.com/kb/ideascale-setup/single-sign-on-multipass-token-based Обновление класса модуля: класс multipassGenerator(): защиту INIT (само): api_key = "61fd537c-8961-479f-A413-aa91a401c3f5-5e866a4c-09c7-4ba0-8da1-cd8e4e88e3ec" app_key = "25151"

def generateMultipass(self,usrEmail,usrName): 
     if usrEmail and usrName: 
      # EXAMPLE: Multipass JSON Token 
      message = {"email":usrEmail,"name":usrName,"expires":"2099-02-24T19:55:31.111-08:00"} 
      block_size = 16 
      mode = AES.MODE_CBC 

      # Replace api_key and app_key with your Community's API Key and Site Key 
      # The keys below are for this community: http://multipass.ideascale.com/ 
      # Do not share your keys - the keys below are for testing purposes only. 
      # See: http://support.ideascale.com/kb/ideascale-setup/single-sign-on-multipass-token-based 
      api_key = self.api_key 
      app_key = self.app_key 

      json = JSON.dumps(message, separators=(',',':')) 

      salted = api_key+app_key 
      saltedHash = hashlib.sha1(salted).digest()[:16] 
      logging.info(message) 
      logging.info(salted) 
      #logging.info(saltedHash) 
      logging.info(len(saltedHash)) 
      json_bytes = array.array('b', json[0 : len(json)]) 

      pad = block_size - len(json_bytes.tostring()) % block_size 
      data = json_bytes.tostring() + pad * chr(pad) 
      aes = AES.new(saltedHash, mode) 
      encrypted_bytes = aes.encrypt(data) 

      b64token = base64.b64encode(encrypted_bytes) 
      b64token = re.sub(r'\s+' ,'' ,b64token) 
      b64token = re.sub(r'\=+$','' ,b64token) 
      b64token = re.sub(r'\+' ,'-',b64token) 
      b64token = re.sub(r'\/' ,'_',b64token) 
      token = urllib.quote(b64token) 

      return token 

Мы выполняем это:

from getUserMuiltipass import multipassGenerator 
tokenGenerator = multipassGenerator() 
tokenGenerator.api_key = u"61fd537c-8961-479f-a413-aa91a401c3f5-5e866a4c-09c7-4ba0-8da1-cd8e4e88e3ec" 
tokenGenerator.app_key = u"25151" 
email = '[email protected]' # any input same issue 
print email.split('@')[0] 
ssoToken = tokenGenerator.generateMultipass(email,email.split('@')[0]) 
print ssoToken 

эта часть кода вызывает вопрос: AES.new (saltedHash режим)

Traceback (most recent call last): 
    File "C:\Program Files (x86)\Google\google_appengine\google\appengine\tools\devappserver2\python\request_handler.py", line 156, in handle_interactive_request 
    exec(compiled_code, self._command_globals) 
    File "<string>", line 7, in <module> 
    File "C:\appengine\ideasONSMS\getUserMuiltipass.py", line 59, in generateMultipass 
    aes = AES.new(saltedHash, mode) 
    File "C:\Python27\lib\site-packages\Crypto\Cipher\AES.py", line 95, in new 
    return AESCipher(key, *args, **kwargs) 
    File "C:\Python27\lib\site-packages\Crypto\Cipher\AES.py", line 59, in __init__ 
    blockalgo.BlockAlgo.__init__(self, _AES, key, *args, **kwargs) 
    File "C:\Python27\lib\site-packages\Crypto\Cipher\blockalgo.py", line 141, in __init__ 
    self._cipher = factory.new(key, *args, **kwargs) 
ValueError: IV must be 16 bytes long 

ответ

1

Это, вероятно, потому, что AES.new сноска нужно 3 арг для режима CBC :

AES.new(key, *args, **kwargs) 

3-d arg is IV. Может быть сгенерировано следующим образом:

iv = Random.new().read(AES.block_size) 
+0

спасибо, получилось, что разрешено ... –

Смежные вопросы