The crypt.php config file is generated, if it doesn't exist, when you use the Crypt class. It is unrelated to Smarty or anything else, it is a standard framework feature.
And Crypt uses symmetric encription, you need the keys to be able to decrypt.
That error message indicates you have pre-1.8 data stored somewhere that needs decryption, but your app doesn't have the keys.
So, to avoid it, make sure the app has the correct crypt config.
I believe you, but I rebuilt this demo from scratch starting from composer. At this point I do not know where to look for and how to avoid using this "existing data".
As I said, for some reason your app gets an existing session cookie, which is encrytped with old keys, from the browser.
This is indicated by the fact that if you add the old keys (which you have from somewhere), the problem goes away. If those keys were not the same as the one's used to encrypt, you would have gotten an error message to that effect.
My 2ct:
you are using a hostname for your application that you have used before for another application, you are using a long session cookie expiry in your apps, and your browser still has that session cookie for that hostname in it's cache.
So when you request a page, your browser sends the cookies it has, the Session class sees them, tries to decrypt them, which fails due to the missing keys...