You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Android游戏逆向:AES_SIV加密SharedPreferences解密失败求助

AES-SIV解密Android游戏SharedPreferences密钥集时MAC校验失败求助

我正在逆向一款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)

相关资源:

  • 源码片段
  • 测试数据
  • 完整存档

问题排查及修复建议

  1. 文件读取逻辑错误
    当前代码先读取文件最后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:]
  1. 不必要的Base64解码
    代码中对encrypted_data执行了base64.b64decode,但如果从文件读取的是原始二进制加密数据,这一步会导致数据损坏,直接去掉即可。

  2. 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")
  1. 密钥正确性验证
    确认提取的密钥解码后是32字节(AES-256要求),可以打印len(decoded_key)验证长度是否符合AES-SIV的要求。

内容的提问来源于stack exchange,提问作者Un SImp

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.09 14:55:16