"""
aigc1.jpg 是 v.tsa.cn 返回的图（modifyImageBytes）。
原始上传图 = modifyImageBytes 但没有 0xfe59 和 Copyright。
如果同时去掉 APP1 EXIF 段中 0xfe59 entry 和 Copyright，应该等于 token 内 hashedMessage。
"""
import hashlib, struct, sys

p = r'C:\Users\13794\Desktop\workspace\工作\2026\aigcdemo\images\aigc1.jpg'
with open(p, 'rb') as f:
    data = f.read()

# 找 APP1 段
exif_marker = data.find(b'Exif\x00\x00')
app1_start = exif_marker - 4
seg_len = (data[app1_start + 2] << 8) | data[app1_start + 3]
app1_end = app1_start + 2 + seg_len

# TIFF header
tiff_start = exif_marker + 6
bo = 'LE' if data[tiff_start:tiff_start+2] == b'II' else 'BE'
def r16(o):
    return data[o] | (data[o+1] << 8) if bo == 'LE' else (data[o] << 8) | data[o+1]
def r32(o):
    return data[o] | (data[o+1] << 8) | (data[o+2] << 16) | (data[o+3] << 24) if bo == 'LE' else (data[o] << 24) | (data[o+1] << 16) | (data[o+2] << 8) | data[o+3]

# 找 0x8769
ifd0_off = r32(tiff_start + 4)
ifd0_n = r16(tiff_start + ifd0_off)
exif_off = None
for i in range(ifd0_n):
    eo = tiff_start + ifd0_off + 2 + i * 12
    if r16(eo) == 0x8769:
        exif_off = r32(eo + 8)

# 找 0x8298 (Copyright) 在 IFD0
copyright_data_off = None
copyright_count = None
for i in range(ifd0_n):
    eo = tiff_start + ifd0_off + 2 + i * 12
    if r16(eo) == 0x8298:
        copyright_count = r32(eo + 4)
        copyright_data_off = tiff_start + r32(eo + 8)
        copyright_entry_abs = eo
        break

# 找 0xfe59 在 ExifIFD
exif_n = r16(tiff_start + exif_off)
fe59_count = None
fe59_data_off = None
fe59_entry_abs = None
for i in range(exif_n):
    eo = tiff_start + exif_off + 2 + i * 12
    if r16(eo) == 0xfe59:
        fe59_count = r32(eo + 4)
        fe59_data_off = tiff_start + r32(eo + 8)
        fe59_entry_abs = eo
        break

print(f'Copyright entry at {copyright_entry_abs}, data at {copyright_data_off}, count {copyright_count}')
print(f'0xfe59 entry at {fe59_entry_abs}, data at {fe59_data_off}, count {fe59_count}')

# 重建：清掉 0xfe59 entry 和它的 data；清掉 Copyright entry 和它的 data
new = bytearray(data)

# 清 0xfe59 entry
for j in range(12):
    new[fe59_entry_abs + j] = 0
# 清 0xfe59 data
for j in range(fe59_count):
    new[fe59_data_off + j] = 0
# 清 Copyright entry
for j in range(12):
    new[copyright_entry_abs + j] = 0
# 清 Copyright data
for j in range(copyright_count):
    new[copyright_data_off + j] = 0

h = hashlib.sha256(bytes(new)).hexdigest()
print(f'SHA-256 (清 0xfe59 + Copyright): {h}')
print(f'expected (token): {sys.argv[1] if len(sys.argv)>1 else "331c07f7e5ea9cbf6b7aab0b8e54765bf366f97f40047168299dd415e0e62597"}')