4

まだこれを機能させることはできません。私の質問は、復号化ラインを機能させる方法についてです。ここに私が書いたものがあります:

class IVCounter(object):
    @staticmethod
    def incrIV(self):
        temp = hex(int(self, 16)+1)[2:34]
        return array.array('B', temp.decode("hex")).tostring()


def decryptCTR(key, ciphertext):

    iv = ciphertext[:32] #extracts the first 32 characters of the ciphertext

    #convert the key into a 16 byte string
    key = array.array('B', key.decode("hex")).tostring()

    print AES.new(key, AES.MODE_CTR, counter=IVCounter.incrIV(iv)).decrypt(ciphertext)
    return

私のエラーメッセージは次のとおりです。

ValueError: 'counter' パラメータは呼び出し可能なオブジェクトでなければなりません

pycrypto がその 3 番目の引数を new に整理する方法がわかりません。

誰でも助けることができますか?ありがとう!

以下の提案を実装した後の新しいコードを編集します。まだ立ち往生!

class IVCounter(object):
    def __init__(self, start=1L):
        print start #outputs the number 1 (not my IV as hoped)
        self.value = long(start)

   def __call__(self):
        print self.value  #outputs 1 - need this to be my iv in long int form
        print self.value + 1L  #outputs 2
        self.value += 1L
        return somehow_convert_this_to_a_bitstring(self.value) #to be written

def decryptCTR(key, ciphertext):

    iv = ciphertext[:32] #extracts the first 32 characters of the ciphertext
    iv = int(iv, 16)

    #convert the key into a 16 byte string
    key = array.array('B', key.decode("hex")).tostring()

    ctr = IVCounter()
    Crypto.Util.Counter.new(128, initial_value = iv)

    print AES.new(key, AES.MODE_CTR, counter=ctr).decrypt(ciphertext)
    return

EDIT STILL はこれを機能させることができません。非常にイライラし、完全にアイデアがありません。これが最新のコードです: (私の入力文字列は 32 ビットの 16 進文字列であり、長い整数に変換するには 2 桁のペアで解釈する必要があることに注意してください。)

class IVCounter(object):
    def __init__(self, start=1L):
        self.value = long(start)

    def __call__(self):
        self.value += 1L
        return hex(self.value)[2:34]

def decryptCTR(key, ciphertext):
    iv = ciphertext[:32] #extracts the first 32 characters of the ciphertext
    iv = array.array('B', iv.decode("hex")).tostring()

    ciphertext = ciphertext[32:]

    #convert the key into a 16 byte string
    key = array.array('B', key.decode("hex")).tostring()

    #ctr = IVCounter(long(iv))
    ctr = Crypto.Util.Counter.new(16, iv)

    print AES.new(key, AES.MODE_CTR, counter=ctr).decrypt(ciphertext)
    return

TypeError: CTR カウンター関数が長さ 16 以外の文字列を返しました

4

1 に答える 1

15

Python では、関数をオブジェクトとして扱うことは完全に有効です。関数として定義されているオブジェクトを扱うことも完全に有効です__call__(self, ...)

したがって、あなたが望むものは次のようなものかもしれません:

class IVCounter(object):
    def __init__(self, start=1L):
        self.value = long(start)
    def __call__(self):
        self.value += 1L
        return somehow_convert_this_to_a_bitstring(self.value)

ctr = IVCounter()
... make some keys and ciphertext ...
print AES.new(key, AES.MODE_CTR, counter=ctr).decrypt(ciphertext)

ただし、PyCrypto は、純粋な Python よりもはるかに高速なカウンター メソッドを提供します。

import Crypto.Util.Counter
ctr = Crypto.Util.Counter.new(NUM_COUNTER_BITS)

ctrは、呼び出すたびに内部状態をインクリメントして返すステートフル関数 (同時に呼び出し可能なオブジェクト) になりました。その後、次のことができます

print AES.new(key, AES.MODE_CTR, counter=ctr).decrypt(ciphertext)

前と同じように。

ユーザー指定の初期化ベクトルを使用して CTR モードで Crypto.Cipher.AES を使用する実際の例を次に示します。

import Crypto.Cipher.AES
import Crypto.Util.Counter

key = "0123456789ABCDEF" # replace this with a sensible value, preferably the output of a hash
iv = "0000000000009001" # replace this with a RANDOMLY GENERATED VALUE, and send this with the ciphertext!

plaintext = "Attack at dawn" # replace with your actual plaintext

ctr = Crypto.Util.Counter.new(128, initial_value=long(iv.encode("hex"), 16))

cipher = Crypto.Cipher.AES.new(key, Crypto.Cipher.AES.MODE_CTR, counter=ctr)
print cipher.encrypt(plaintext)
于 2012-07-25T22:04:03.490 に答える