Android游戏逆向:AES_SIV加密SharedPreferences解密失败求助
我正在逆向一款Android游戏,目标是解密它的加密SharedPreferences。已经从Android Keystore里提取到了解密密钥,但写Python脚本解密AES_SIV类型的密钥集时,一直报“MAC check failed”错误。
下面是我用的解密代码:
import base64 from Crypto.Cipher import AES def decrypt_keyset(key, encrypted_data, tag): decoded_data = base64.b64decode(encrypted_data) # key becomes 32 bytes once decoded which siv requires decoded_key = base64.b64decode(key) cipher = AES.new(decoded_key, AES.MODE_SIV) decrypted_data = cipher.decrypt_and_verify(decoded_data,tag) return decrypted_data keyset_file_path = "/home/un/dev/decryption_tests/an" # extracted from software keystore keyset_key = b"shBeeokeqh1k3Mz/2PbbuFC7NG3UZEN9dGOT9VzwG9k=" with open(keyset_file_path, "rb") as f: tag = f.read()[-16:] encrypted_keyset = f.read() decrypted_keyset = decrypt_keyset(keyset_key, encrypted_keyset,tag)
相关资源:
- 源码片段
- 测试数据
- 完整存档
问题排查及修复建议
- 文件读取逻辑错误
当前代码先读取文件最后16字节作为tag,此时文件指针已移到末尾,后续f.read()只能读到空数据。正确做法是先读取全部文件内容,再拆分加密数据和tag:
with open(keyset_file_path, "rb") as f: all_data = f.read() encrypted_keyset = all_data[:-16] tag = all_data[-16:]
不必要的Base64解码
代码中对encrypted_data执行了base64.b64decode,但如果从文件读取的是原始二进制加密数据,这一步会导致数据损坏,直接去掉即可。AES-SIV关联数据缺失
AES-SIV加密时如果使用了关联数据(Associated Data),解密时必须传入完全相同的关联数据,否则MAC校验必然失败。需要查看游戏源码中加密密钥集的逻辑,确认是否有传入关联数据,解密时补充到decrypt_and_verify参数中:
decrypted_data = cipher.decrypt_and_verify(encrypted_data, tag, associated_data=b"your_associated_data_here")
- 密钥正确性验证
确认提取的密钥解码后是32字节(AES-256要求),可以打印len(decoded_key)验证长度是否符合AES-SIV的要求。
内容的提问来源于stack exchange,提问作者Un SImp
相关产品推荐
相关产品推荐

