If you write a little test, your problem becomes obvious,
var failures = ParallelEnumerable.Range(0, 10000).Count(i =>
{
var keyBefore = TripleDES.Create().Key;
var keyAfter = Encoding.UTF8.GetBytes(Encoding.UTF8.GetString(keyBefore));
return !keyBefore.SequenceEqual(keyAfter);
});
In my testing, every attempted roundtrip fails. This confirms Damien's comment.
There's no guarantee that the bytes generated for a key can be safely round-tripped into a string by acting as if they're a valid UTF-8 sequence.
The keyAfter
is (almost) always somewhat expanded, sometimes doubled in length. In fact, I'm unable to fluke a key that is round trippable, this may have something to do with avoiding weak keys.
However, if i try
var failures = ParallelEnumerable.Range(0, 10000).Count(i =>
{
var keyBefore = TripleDES.Create().Key;
var keyAfter = Convert.FromBase64String(Convert.ToBase64String(keyBefore));
return !keyBefore.SequenceEqual(keyAfter);
});
failures
always equals 0
, as expected. So, there is a simple solution.