If the ExeFS hashes match according to ctrtool, then you've already decrypted it. All hashes in an NCCH refer to the plaintext, not the ciphertext.
Also, what ctrtool calls "ExeFS Hash" is just the hash of the superblock. This matching does not mean jack shit; individual subsections can still be corrupted. Report back when the hash of the ExeFS:/.code matches.
Lastly, the keyX can't be missing. Either you have a CTRAging from a retail console and then you can use Decrypt9 as usual to decrypt it, or you have a CTRAging from a dev console and then you can use whatever people use on dev consoles to decrypt it.
If you're saying the keyY, taken from the signature, is corrupted, then congratulations, you have contributed absolutely nothing with your post because you stated that issue in the OP already. Besides, brute forcing 128 bits is still computationally infeasible.