虽然在网上看到了一个脚本,但运行起来却发现报错
代码:
from base64 import b64decode
from random import randint
from Crypto.Cipher.AES import block_size,key_size
from Crypto import Random
from S2C1 import judging, unpad
from S2C2 import CBC_decrypt, CBC_encrypt
class Oracle:
def __init__(self,possible_input):
self.iv=Random.new().read(block_size)
self.key=Random.new().read(key_size[0])
self.possible_input=possible_input
def get_cipher(self):
chosen_input=self.possible_input[randint(0,9)].encode()
return CBC_encrypt(chosen_input,self.key,self.iv)
def decrypt_and_check_padding(self,cipher,iv):
plain=CBC_decrypt(cipher,self.key,iv)
return judging(plain)
def get_padding(iv,guessed_byte,padding_len,found_plain):
index_padding=len(iv)-padding_len
padding=iv[index_padding]^guessed_byte^padding_len
output=iv[:index_padding]+bytes([padding])
m=0
for i in range(block_size-padding_len+1,block_size):
padding=iv[i]^found_plain[m]^padding_len
output+=bytes([padding])
m+=1
return output
def attack_padding(cipher,oracle):
plain=b''
cipher_block=[oracle.iv]+[cipher[i:i+block_size] for i in range(0,len(cipher),block_size)]
for c in range(1,len(cipher_block)):
plain_block=b''
for i in range(block_size-1,-1,-1):
padding_len=len(cipher_block)+1
possible_byte=[]
for j in range(256):
test_iv1=get_padding(cipher_block[c-1],j,padding_len,plain_block)
if(oracle.decrypt_and_check_padding(cipher_block[i],test_iv1) is True):
possible_byte+=bytes(j)
if(len(possible_byte)!=1):
for byte in possible_byte:
for j in range(256):
text_iv=get_padding(cipher_block[c-1],j,padding_len+1,bytes(byte)+plain_block)
if(oracle.decrypt_and_check_padding(cipher_block[c],text_iv) is True):
possible_byte=bytes(byte)
break
plain_block+=bytes(possible_byte)
plain+=plain_block
return unpad(plain)
if __name__=='__main__':
text=[
'MDAwMDAwTm93IHRoYXQgdGhlIHBhcnR5IGlzIGp1bXBpbmc=',
'MDAwMDAxV2l0aCB0aGUgYmFzcyBraWNrZWQgaW4gYW5kIHRoZSBWZWdhJ3MgYXJlIHB1bXBpbic=',
'MDAwMDAyUXVpY2sgdG8gdGhlIHBvaW50LCB0byB0aGUgcG9pbnQsIG5vIGZha2luZw==',
'MDAwMDAzQ29va2luZyBNQydzIGxpa2UgYSBwb3VuZCBvZiBiYWNvbg==',
'MDAwMDA0QnVybmluZyAnZW0sIGlmIHlvdSBhaW4ndCBxdWljayBhbmQgbmltYmxl',
'MDAwMDA1SSBnbyBjcmF6eSB3aGVuIEkgaGVhciBhIGN5bWJhbA==',
'MDAwMDA2QW5kIGEgaGlnaCBoYXQgd2l0aCBhIHNvdXBlZCB1cCB0ZW1wbw==',
'MDAwMDA3SSdtIG9uIGEgcm9sbCwgaXQncyB0aW1lIHRvIGdvIHNvbG8=',
'MDAwMDA4b2xsaW4nIGluIG15IGZpdmUgcG9pbnQgb2g=',
'MDAwMDA5aXRoIG15IHJhZy10b3AgZG93biBzbyBteSBoYWlyIGNhbiBibG93'
]
oracle=Oracle(text)
result=attack_padding(oracle.get_cipher(),oracle)
print(b64decode(result))
有谁能跟我说说该咋搞?