gpt4 book ai didi

python - AES CTR 实现

转载 作者:行者123 更新时间:2023-11-28 22:51:31 27 4
gpt4 key购买 nike

我正在尝试自己实现 CTR 模式(目前仅解密),仅使用来自 pycrypto 的 AES 内置函数。这意味着我不应该使用 mode=AES.MODE_CTR。不过,我知道使用 AES.MODE_CTR 会更简单,但我这样做是为了学习经验。

我不确定如何将 AES 用作 PRF,以便在 CTR 加密算法中使用它。

我做错了什么?(非平行版)

from Crypto.Cipher import AES

ciphers = ["69dda8455c7dd4254bf353b773304eec0ec7702330098ce7f7520d1cbbb20fc3" + \
"88d1b0adb5054dbd7370849dbf0b88d393f252e764f1f5f7ad97ef79d59ce29f5f51eeca32eabedd9afa9329", \
"770b80259ec33beb2561358a9f2dc617e46218c0a53cbeca695ae45faa8952aa" + \
"0e311bde9d4e01726d3184c34451"]

key = "36f18357be4dbd77f050515c73fcf9f2"

class IVCounter(object):
def __init__(self, value):
self.value = value

def increment(self):
# Add the counter value to IV
newIV = hex(int(self.value.encode('hex'), 16) + 1)

# Cut the negligible part of the string
self.value = newIV[2:len(newIV) - 1].decode('hex') # for not L strings remove $ - 1 $
return self.value

def __repr__(self):
self.increment()
return self.value

def string(self):
return self.value

class CTR():
def __init__(self, k):
self.key = k

def __strxor(self, a, b): # xor two strings of different lengths
if len(a) > len(b):
return "".join([chr(ord(x) ^ ord(y)) for (x, y) in zip(a[:len(b)], b)])
else:
return "".join([chr(ord(x) ^ ord(y)) for (x, y) in zip(a, b[:len(a)])])

def __split_len(self, seq, lenght):
return [seq[i:i+lenght] for i in range(0, len(seq), lenght)]

def __AESdecryptor(self, k, cipher):
decryptor = AES.new(k, AES.MODE_ECB)

return decryptor.decrypt(cipher)

def decrypt(self, cipher):
# Split the CT in blocks of 16 bytes
blocks = self.__split_len(cipher.decode('hex'), 16)

# Takes the initiator vector
self.IV = IVCounter(blocks[0])
blocks.remove(blocks[0])

# Message block
msg = []

# Decrypt
for b in blocks:
aes = self.__AESdecryptor(self.key.decode('hex'), self.IV.string())
msg.append(self.__strxor(b, aes))

self.IV.increment()

return ''.join(msg)

def main():
decryptor = CTR(key)
for c in ciphers:
print 'msg = ' + decryptor.decrypt(c)

if __name__ == '__main__':
main()

此代码应该与下面的代码执行相同的操作,但它没有按应有的方式解码。

import Crypto.Util.Counter
ctr_e = Crypto.Util.Counter.new(128, initial_value=long(IV.encode('hex'), 16))
decryptor = AES.new(key.decode('hex'), AES.MODE_CTR, counter=ctr_e)
print decryptor.decrypt(''.join(blocks))

最佳答案

# Decrypt
for b in blocks:
aes = self.__AESdecryptor(self.IV.string(), self.key.decode('hex'))
msg.append(self.__strxor(b, aes))
self.IV.increment()

return ''.join(msg)

AES CTR 模式使用 AES 的正向转换进行加密和解密。也就是说,在这两种情况下,都对计数器进行加密,然后进行异或。当我说“正向转换”时,我的意思是您始终执行 AES_Encrypt(counter)(并且从不执​​行 AES_Decrypt(counter))。

无论您是加密还是解密,您都对明文和密文执行异或。 text XOR encrypt(counter)是加密或解密操作。那是流密码。

self.IV.string() 不是 AES key 。它是在 key 下加密的值。加密后,它会与{plain|cipher} 文本进行异或运算。

关于python - AES CTR 实现,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21440506/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com