さっそく実行してみたのですが、すみません。間違ってました。
XORした結果が0x00になる(元データとXORのキーが同じ)場合も元の値をそのまま使う必要がありました。
if (v != b'\x00'):
m = masks[i % len(masks)]
if (ord(v) != ord(m)):
v = ord(v) ^ ord(m)
fh2.write(v.to_bytes(1, 'little'))
else:
fh2.write(v)
else:
fh2.write(v)
i += 1
上記で無事復号できました。