>>894さんありがとうございます。
さっそく実行してみたのですが、すみません。間違ってました。
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

上記で無事復号できました。