我仍然无法使这个工作。我的问题是如何使解密行起作用。以下是我的代码:
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希望我如何组织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
编辑:仍然无法让这个工作起来。非常沮丧,完全没有头绪。以下是最新的代码:(请注意,我的输入字符串是32位十六进制字符串,必须以两位数字对进行解释以转换为长整型。)
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
ctr = Crypto.Util.Counter.new(NUM_COUNTER_BITS, initial_value = 90000001L)
,其中initial_value是以长整型形式表示的IV。我们认为'ctr'是一个有状态的函数的原因是因为它在内部存储了自己的计数器。每次调用ctr()
时,其内部计数器会增加一。因此,通过使用您需要的IV来初始化此函数,然后您就可以递增'您的'IV。 - atomicinfIVCounter
时,它自己的内部计数器(由您初始化)都会递增。原则上,您可以定义多个相互独立的IVCounter
实例。 - atomicinfctr = Crypto.Util.Counter.new(256, long(iv))
。第二个问题(前面的问题也解决了)是Crypto.Util.Counter.new返回一个函数,您没有将其分配在任何地方。 - atomicinfbaadf00d
)。 2: 在解密之前,您需要重置计数器,即使用相同的IV创建一个新的计数器,然后使用新的计数器创建一个新的密码上下文,并使用该上下文进行解密。 - atomicinf