Объект 'method-wrapper' не может быть повторен в библиотеке AES CTR pycrypto - PullRequest
0 голосов
/ 13 октября 2018

Я пытаюсь реализовать функцию шифрования / дешифрования в python2.Это схема шифрования: encryption scheme Однако, я получаю ошибку 'method-wrapper' object is not iterable в функции CES AES библиотеки pycrypto

Это трассировка стека:

---------------------------------------------------------------------------
TypeError                                 Traceback (most recent call last)
<ipython-input-5-1c44f21fcf83> in <module>()
     45         l = random.randint(16,48)
     46         m = random_bytes(l)
---> 47         assert specialDecryption(k, specialEncryption(k, m)) == m

<ipython-input-5-1c44f21fcf83> in specialEncryption(k, m)
      7     # compute PRF
      8     r = random_bytes(KEYLENGTH/8)
----> 9     prf = lengthQuadruplingPRF(k, r)
     10 
     11     # xor

<ipython-input-4-59fb6141461b> in lengthQuadruplingPRF(k, r)
     34     assert len(k) == KEYLENGTH/8
     35     assert len(r) <= KEYLENGTH/8
---> 36     obj = AES.new(k, AES.MODE_CTR, counter=make_counter())
     37     output = obj.encrypt(r*4)
     38     return output

/usr/local/lib/python2.7/site-packages/Crypto/Cipher/AES.pyc in new(key, mode, *args, **kwargs)
    204 
    205     kwargs["add_aes_modes"] = True
--> 206     return _create_cipher(sys.modules[__name__], key, mode, *args, **kwargs)
    207 
    208 

/usr/local/lib/python2.7/site-packages/Crypto/Cipher/__init__.pyc in _create_cipher(factory, key, mode, *args, **kwargs)
     77             raise TypeError("IV is not meaningful for the ECB mode")
     78 
---> 79     return modes[mode](factory, **kwargs)

/usr/local/lib/python2.7/site-packages/Crypto/Cipher/_mode_ctr.pyc in _create_ctr_cipher(factory, **kwargs)
    323     # 'counter' used to be a callable object, but now it is
    324     # just a dictionary for backward compatibility.
--> 325     _counter = dict(counter)
    326     try:
    327         counter_len = _counter.pop("counter_len")

TypeError: 'method-wrapper' object is not iterable

Воткод:

if __name__ == '__main__':
    k = os.urandom(KEYLENGTH/8)  # generate key
    l = random.randint(16,48)
    m = os.urandom(l)
    c = specialEncryption(k, m) ## FIRST IN THE FAILURE STACK

def specialEncryption(k, m):     
   ... other code

    # compute PRF
    r = os.urandom(KEYLENGTH/8)
    prf = lengthQuadruplingPRF(k, r) ## SECOND IN THE FAIL STACK

    ... other code

def make_counter():
    import struct
    def gen():
        i = 0;
        while True:
            yield struct.pack('>QQ', 0, i)
            i += 1
    return gen().next

def lengthQuadruplingPRF(k, r):
    # Input: 16 byte key, 16 byte value
    # Output: 64 byte pseudorandom bytes
    obj = AES.new(k, AES.MODE_CTR, counter=make_counter()) ## FAILS HERE
    output = obj.encrypt(r*4)
    return output

1 Ответ

0 голосов
/ 13 октября 2018

Ваш counter должен быть итеративным, способным инициализировать dict, а не привязанный метод.

Я подозреваю, что ваша функция make_counter изменяется на:

return gen()

с:

return gen().next

достаточно, чтобы это исправить.

...