def main(): text = open('ecb_text').read() ctr = RandomAccessCTR() ciphertext = ctr.encrypt(text) new_ciphertext = ctr.edit(ciphertext, 0, 'a' * len(ciphertext)) keystream = util.string_xor(new_ciphertext, 'a' * len(ciphertext)) print util.string_xor(keystream, ciphertext)
def main(): text = open('ecb_text').read() ctr = RandomAccessCTR() ciphertext = ctr.encrypt(text) new_ciphertext = ctr.edit(ciphertext, 0, 'a'*len(ciphertext)) keystream = util.string_xor(new_ciphertext, 'a'*len(ciphertext)) print util.string_xor(keystream, ciphertext)
def cbc_encrypt(text, key, iv): ''' CBC encrypt text with initialization vector iv and key ''' block_length = len(iv) text = pkcs_padding(text, block_length) blocks = util.blocks(text, block_length) blocks[0] = util.string_xor(blocks[0], iv) blocks[0] = util.ecb_encrypt(blocks[0], key) for i in xrange(1, len(blocks)): blocks[i] = util.string_xor(blocks[i], blocks[i - 1]) blocks[i] = util.ecb_encrypt(blocks[i], key) return ''.join(blocks)
def cbc_decrypt(text, key, iv): ''' CBC decrypt text with initialization vector iv and key ''' block_length = len(iv) blocks = util.blocks(text, block_length) decoded_blocks = [0] * len(blocks) decoded_blocks[0] = util.ecb_decrypt(blocks[0], key) decoded_blocks[0] = util.string_xor(decoded_blocks[0], iv) for i in xrange(1, len(blocks)): decoded_blocks[i] = util.ecb_decrypt(blocks[i], key) decoded_blocks[i] = util.string_xor(decoded_blocks[i], blocks[i - 1]) return ''.join(decoded_blocks)
def cbc_decrypt(text, key, iv): ''' CBC decrypt text with initialization vector iv and key ''' block_length = len(iv) blocks = util.blocks(text, block_length) decoded_blocks = [0] * len(blocks) decoded_blocks[0] = util.ecb_decrypt(blocks[0], key) decoded_blocks[0] = util.string_xor(decoded_blocks[0], iv) for i in xrange(1, len(blocks)): decoded_blocks[i] = util.ecb_decrypt(blocks[i], key) decoded_blocks[i] = util.string_xor(decoded_blocks[i], blocks[i-1]) return ''.join(decoded_blocks)
def cbc_encrypt(text, key, iv): ''' CBC encrypt text with initialization vector iv and key ''' block_length = len(iv) text = pkcs_padding(text, block_length) blocks = util.blocks(text, block_length) blocks[0] = util.string_xor(blocks[0], iv) blocks[0] = util.ecb_encrypt(blocks[0], key) for i in xrange(1, len(blocks)): blocks[i] = util.string_xor(blocks[i], blocks[i-1]) blocks[i] = util.ecb_encrypt(blocks[i], key) return ''.join(blocks)
def recover_seed(ciphertext, known_text): known_length = len(known_text) padding = len(ciphertext) - known_length rounded_padding = padding % 4 if rounded_padding != 0: rounded_padding = 4 - rounded_padding # Start of our known text known_start = padding + rounded_padding known_end = padding + rounded_padding + 8 known = ciphertext[known_start:known_end] # Convert them to numbers which were generated by rng t = util.string_xor(known, known_text[-8:]) known_a = struct.unpack(">L", t[:4])[0] known_b = struct.unpack(">L", t[4:])[0] for i in xrange(65536): update_progress(i, 65536) mt = MersenneTwister(i) for ignore in xrange(padding/4): mt.next() for check in xrange(known_length + 5): if mt.next() == known_a: if mt.next() == known_b: return i return "FAILED"
def ctr_decrypt(text, key='YELLOW SUBMARINE', nonce=0): ''' CTR decrypt a text using key and nonce ''' block_size = len(key) blocks = util.get_blocks(text, block_size) c = Counter() decrypted = '' for block in blocks: keystring = util.ecb_encrypt(c.next(), key) decrypted += util.string_xor(keystring, block) return decrypted
def try_ngrams(ciphertexts, length, ngram_frequency): ''' Match most repeated ngram with most common possible ngrams (from the list declared above), going down to least possible occurence ''' global trigrams global keystream most_common = repeated_ngrams(ciphertexts, length) # Start with most occured ngram for repeated_ngram in most_common: # ngram reference frequency for ngram in ngram_frequency: possible_keystream = util.string_xor(repeated_ngram['content'], ngram) start = repeated_ngram['start'] s = '' # Go through every ciphertext, and apply keystream at that position for ciphertext in ciphertexts: s += util.string_xor(possible_keystream, ciphertext[start:start+length]) + '-' if len(s.strip(allowed_letters)) == 0: if keystream.available(start, possible_keystream): keystream.assign(start, possible_keystream)
def main(): aes = AES() text = 'a' * 16 * 3 encrypted = aes.encrypt(text) blocks_encrypted = util.get_blocks(encrypted, 16) blocks_encrypted[0] = blocks_encrypted[2] = blocks_encrypted[1] blocks_encrypted[1] = '\0' * 16 modified_encrypted = ''.join(blocks_encrypted) try: decrypted = aes.decrypt(modified_encrypted) except InvalidString as e: decrypted = str(e) blocks_decrypted = util.get_blocks(decrypted, 16) print 'Recovered key/IV: ', repr(util.string_xor(blocks_decrypted[0], blocks_decrypted[2]))
def main(): aes = AES() text = 'a' * 16 * 3 encrypted = aes.encrypt(text) blocks_encrypted = util.get_blocks(encrypted, 16) blocks_encrypted[0] = blocks_encrypted[2] = blocks_encrypted[1] blocks_encrypted[1] = '\0' * 16 modified_encrypted = ''.join(blocks_encrypted) try: decrypted = aes.decrypt(modified_encrypted) except InvalidString as e: decrypted = str(e) blocks_decrypted = util.get_blocks(decrypted, 16) print 'Recovered key/IV: ', repr( util.string_xor(blocks_decrypted[0], blocks_decrypted[2]))
def print_decoded(ciphertexts, keystream): for ciphertext in ciphertexts: print repr(util.string_xor(ciphertext, str(keystream)))