And*_*Dev 4 python encryption aes pycrypto
仍然无法让这个工作.我的问题是关于如何使解密线工作.这是我写的:
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
Run Code Online (Sandbox Code Playgroud)
我的错误信息是:
ValueError:'counter'参数必须是可调用对象
我只是无法弄清楚pycrypto是如何让我将第三个参数组织成新的.
有人可以帮忙吗?谢谢!
在实施以下建议后编辑新代码.还是卡住了!
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
Run Code Online (Sandbox Code Playgroud)
EDIT STILL无法让这个工作.非常沮丧,完全出于想法.这是最新的代码:(请注意,我的输入字符串是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
Run Code Online (Sandbox Code Playgroud)
TypeError:CTR计数器函数返回的字符串长度不是16
ato*_*inf 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)
Run Code Online (Sandbox Code Playgroud)
但是,PyCrypto为你提供了一个比纯Python更快的计数器方法:
import Crypto.Util.Counter
ctr = Crypto.Util.Counter.new(NUM_COUNTER_BITS)
Run Code Online (Sandbox Code Playgroud)
ctr现在是一个有状态函数(同时也是一个可调用对象),每次调用它时它都会递增并返回其内部状态.然后你可以做
print AES.new(key, AES.MODE_CTR, counter=ctr).decrypt(ciphertext)
Run Code Online (Sandbox Code Playgroud)
就像以前一样.
这是一个使用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)
Run Code Online (Sandbox Code Playgroud)