This thread sounds delicious! … sorry, I love bad puns.
I think your misunderstanding is here:
You shouldn’t be decrypting anything. Cryptographic salt and pepper are used in hashing algorithms, not encryption.
When building an authentication system, don’t encrypt a users password and store it. Instead, hash the password and store the hash. The difference between a hashed password and an encrypted password is that the hash is one way. It cannot be reversed. This is good because you shouldn’t want anyone – not a hacker, not your sys admin, not even you – to be able to reverse the function and see the password. Many people reuse passwords, so being able to decrypt someone’s password that is associated with an identity is bad idea for everyone involved.
When it comes time to authenticate, you hash the password they typed in using the same algorithm and compare the new hash with the one you stored.
Salt is stored beside the password in the database. In the case of a breach, it helps prevent attacks on the passwords using a “rainbow table”.
Pepper is stored outside of the database, usually in a config but directly in the code would be okay, so it won’t necessarily be part of a data breach if just the database is stolen. Pepper helps protect against attacks on weak passwords (low bit counts), since they increase the complexity of everyone’s password.
I don’t see much difference between storing the pepper in a text file or directly in code, except that your authentication code will be more reusable if the string is configurable in one way or another. This decision is less about security and more about code design.
Depending how secure you want to get, you can also encrypt the pepper and use another strong authentication system, such as a “secrets vault” you find on the popular cloud hosting services, to only allow your application to decrypt it. Layered security, using varied techniques and functions, improve your overall security position.