def decrypt_cdata(data: bytes) -> Tuple[bool, int, int, int]: decrypted = tgcrypto.ige256_decrypt(data, key, bytes(32)) return ( bool(decrypted[0]), decrypted[1], decrypted[2], int.from_bytes(decrypted[3:7], "little"), )
def decrypt(self, ciphertext, message_key, mode): if mode == "org": mode = 8 else: mode = 0 msg_key_from_cipher = message_key kdf = KDF(self.secret_key, msg_key_from_cipher, mode) aes_key, aes_iv = kdf.KD() ige_decrypted = tgcrypto.ige256_decrypt(ciphertext[16:], aes_key, aes_iv) msg_key_large = hashlib.sha256(self.secret_key[88 + mode:120] + ige_decrypted).digest() msg_key = msg_key_large[8:24] length = int(ige_decrypted[:32], 2) if msg_key == msg_key_from_cipher: plaintext = ige_decrypted[32:32 + length] return plaintext else: print("msg_key mismatch!!!")
def decrypt_ige(cipher_text, key, iv): """ Decrypts the given text in 16-bytes blocks by using the given key and 32-bytes initialization vector. """ # print('using tgcrypto') return tgcrypto.ige256_decrypt(cipher_text, key, iv) if cryptg: return cryptg.decrypt_ige(cipher_text, key, iv) if libssl.decrypt_ige: return libssl.decrypt_ige(cipher_text, key, iv) iv1 = iv[:len(iv) // 2] iv2 = iv[len(iv) // 2:] aes = pyaes.AES(key) plain_text = [] blocks_count = len(cipher_text) // 16 cipher_text_block = [0] * 16 for block_index in range(blocks_count): for i in range(16): cipher_text_block[i] = \ cipher_text[block_index * 16 + i] ^ iv2[i] plain_text_block = aes.decrypt(cipher_text_block) for i in range(16): plain_text_block[i] ^= iv1[i] iv1 = cipher_text[block_index * 16:block_index * 16 + 16] iv2 = plain_text_block plain_text.extend(plain_text_block) return bytes(plain_text)
def test_ige256_decrypt_invalid_args_count(self): with self.assertRaisesRegex( TypeError, r"function takes exactly \d arguments \(\d given\)"): tgcrypto.ige256_decrypt(os.urandom(16), os.urandom(32))