This happens because of the Initialisation Vector. This behaviour is there by design. You don't want the encryption algorithm to produce exactly the same output for the same input. Such algorythm is susceptible to plain text attack, where attacker can potentially infer encryption key from the input and the produced output.
This happens in the line
ICryptoTransform ct2 = des.CreateEncryptor();
According to msdn
If the current IV property is null,
the GenerateIV method is called to create a new random IV.
To fix this you need to set the IV for your encryptor. You would then store IV alongside the encrypted bytes and use it for decryption. IV, in simple words, is some initial random noise that allows encryption algorithm to produce different input. As a good practise, this noise must be different for each encryption call.
Obviously, DES is a really weak algorithm, you would want to use at least 3DES. But even 3DES is only used for legacy applications. Modern applications use AES.