异或字节和 str (AES CBC)
xoring bytes and str (AES CBC)
您好,非常感谢您对此的帮助,因为我真的迷路了,我不明白为什么它不起作用。
我有一个 16 字节的密钥和 16 字节的块
但是键类型是'str',块类型是'bytes',我想在它们之间进行异或,但值不正确(我认为)
此代码基于 this post
def xor(data, key):
if type(key) != str:
key = str(key)
l = len(key)
buff=""
for i in range(0,len(data)):
buff+=chr(data[i]^ord(key[i]))
return str.encode(buff)
在上下文中:(ref to CBC)
def CBC_decrypt(blocklist,IV,decrypter):
'''
:param blocklist: a 16 byte item list(or other iteratable)
:param IV: 16 byte sized iv
:param decrypter: decrypter: a generic decrypter-must provide an decrypt(plaintext) method
where plaintext is 16 byte size
:return: a list of decrypted blocks of 16 bytes
'''
decrypted_msg=[]
prev = IV
for x in blocklist:
r = xor(decrypter.decrypt(x),prev)
decrypted_msg.append(r)
prev = x
return decrypted_msg
a = FileTo16ByteBlocks(path) #just read 16 bytes at a time and return a list
cipher2= AES.new(loadKey(),AES.MODE_ECB) #init AES in ECB cause we had to implement CBC
d = CBC_decrypt(a,iv[0],cipher2)
在这里,我将其全部写入文件
# create new file iterate through the deciphered data and write it to that file
with open(str(fileSeq)+'.mp4','wb') as f:
for i in d:
f.write(i)
f.write(b'')
我已经尝试过关于 xor 的其他事情(因为 ECB 解密是由 library-pycrypto 进行的)比如使用它的 number.bytes 来做长和异或
我试着把它转换成整数,看看结果如何,一切都很糟糕
而 xor 的事情只是一种预感,我真的无法理解为什么它不能正常工作!
感谢大家的帮助
我已经解决了!
正如我所想的那样,问题确实出在 xor 函数上,显然 xor 结果的长度不是 16,但由于转换,它是变体(为什么会这样?)
我在此处添加代码以防将来有人需要它
def xor(data, key1):
b=key1
if type(key1) is str:
b = bytes(key1,encoding='utf8')
iData = int.from_bytes(data, sys.byteorder)
iKey = int.from_bytes(b, sys.byteorder)
xored = iData ^ iKey
xored = xored.to_bytes(len(data), sys.byteorder)
return xored
您好,非常感谢您对此的帮助,因为我真的迷路了,我不明白为什么它不起作用。
我有一个 16 字节的密钥和 16 字节的块 但是键类型是'str',块类型是'bytes',我想在它们之间进行异或,但值不正确(我认为) 此代码基于 this post
def xor(data, key):
if type(key) != str:
key = str(key)
l = len(key)
buff=""
for i in range(0,len(data)):
buff+=chr(data[i]^ord(key[i]))
return str.encode(buff)
在上下文中:(ref to CBC)
def CBC_decrypt(blocklist,IV,decrypter):
'''
:param blocklist: a 16 byte item list(or other iteratable)
:param IV: 16 byte sized iv
:param decrypter: decrypter: a generic decrypter-must provide an decrypt(plaintext) method
where plaintext is 16 byte size
:return: a list of decrypted blocks of 16 bytes
'''
decrypted_msg=[]
prev = IV
for x in blocklist:
r = xor(decrypter.decrypt(x),prev)
decrypted_msg.append(r)
prev = x
return decrypted_msg
a = FileTo16ByteBlocks(path) #just read 16 bytes at a time and return a list
cipher2= AES.new(loadKey(),AES.MODE_ECB) #init AES in ECB cause we had to implement CBC
d = CBC_decrypt(a,iv[0],cipher2)
在这里,我将其全部写入文件
# create new file iterate through the deciphered data and write it to that file
with open(str(fileSeq)+'.mp4','wb') as f:
for i in d:
f.write(i)
f.write(b'')
我已经尝试过关于 xor 的其他事情(因为 ECB 解密是由 library-pycrypto 进行的)比如使用它的 number.bytes 来做长和异或 我试着把它转换成整数,看看结果如何,一切都很糟糕 而 xor 的事情只是一种预感,我真的无法理解为什么它不能正常工作! 感谢大家的帮助
我已经解决了! 正如我所想的那样,问题确实出在 xor 函数上,显然 xor 结果的长度不是 16,但由于转换,它是变体(为什么会这样?)
我在此处添加代码以防将来有人需要它
def xor(data, key1):
b=key1
if type(key1) is str:
b = bytes(key1,encoding='utf8')
iData = int.from_bytes(data, sys.byteorder)
iKey = int.from_bytes(b, sys.byteorder)
xored = iData ^ iKey
xored = xored.to_bytes(len(data), sys.byteorder)
return xored