I am writing a game for a relative to generate cryptograms.
Use List::Util::shuffle for the key generation. It's not bad to map letters in the clear text to the same letter in the cypher text - as long as it's not more often than the statistical average.
Actually the Enigma forbade that, which was one of the reasons why it could be broken during the second world war.
BTW a common scheme for generating a key was to take a word, remove all duplicate characters, and fill the rest of the alphabet from the back:
key: LimbicRegion
removed duplicates: limbcregon
filled with the rest of the alphabet:
limbcregonzyxwvutsrqpkjhfdcba
But that's not very secure, and mostly of historical interest ;-)