@@ -31,42 +31,43 @@ string IEncryptionService.Decrypt(EncryptedValue encryptedValue)
31
31
return encryptedValue . EncryptedBase64Value ;
32
32
}
33
33
34
- var decryptionKeys = new List < byte [ ] > { Key } ;
34
+ var decryptionKeys = new List < byte [ ] > { Key } ;
35
35
if ( ExpiredKeys != null )
36
36
{
37
37
decryptionKeys . AddRange ( ExpiredKeys ) ;
38
38
}
39
- var encrypted = Convert . FromBase64String ( encryptedValue . EncryptedBase64Value ) ;
40
39
var cryptographicExceptions = new List < CryptographicException > ( ) ;
41
- using ( var rijndael = new RijndaelManaged ( ) )
42
- {
43
- rijndael . IV = Convert . FromBase64String ( encryptedValue . Base64Iv ) ;
44
- rijndael . Mode = CipherMode . CBC ;
45
40
46
- foreach ( var key in decryptionKeys )
41
+ foreach ( var key in decryptionKeys )
42
+ {
43
+ try
47
44
{
48
- rijndael . Key = key ;
49
- try
50
- {
51
- return Decrypt ( rijndael , encrypted ) ;
52
- }
53
- catch ( CryptographicException exception )
54
- {
55
- cryptographicExceptions . Add ( exception ) ;
56
- }
45
+ return Decrypt ( encryptedValue , key ) ;
46
+ }
47
+ catch ( CryptographicException exception )
48
+ {
49
+ cryptographicExceptions . Add ( exception ) ;
57
50
}
58
51
}
59
52
var message = string . Format ( "Could not decrypt message. Tried {0} keys." , decryptionKeys . Count ) ;
60
53
throw new AggregateException ( message , cryptographicExceptions ) ;
61
54
}
62
- static string Decrypt ( RijndaelManaged rijndael , byte [ ] encrypted )
55
+
56
+ static string Decrypt ( EncryptedValue encryptedValue , byte [ ] key )
63
57
{
64
- using ( var decryptor = rijndael . CreateDecryptor ( ) )
65
- using ( var memoryStream = new MemoryStream ( encrypted ) )
66
- using ( var cryptoStream = new CryptoStream ( memoryStream , decryptor , CryptoStreamMode . Read ) )
67
- using ( var reader = new StreamReader ( cryptoStream ) )
58
+ using ( var rijndael = new RijndaelManaged ( ) )
68
59
{
69
- return reader . ReadToEnd ( ) ;
60
+ var encrypted = Convert . FromBase64String ( encryptedValue . EncryptedBase64Value ) ;
61
+ rijndael . IV = Convert . FromBase64String ( encryptedValue . Base64Iv ) ;
62
+ rijndael . Mode = CipherMode . CBC ;
63
+ rijndael . Key = key ;
64
+ using ( var decryptor = rijndael . CreateDecryptor ( ) )
65
+ using ( var memoryStream = new MemoryStream ( encrypted ) )
66
+ using ( var cryptoStream = new CryptoStream ( memoryStream , decryptor , CryptoStreamMode . Read ) )
67
+ using ( var reader = new StreamReader ( cryptoStream ) )
68
+ {
69
+ return reader . ReadToEnd ( ) ;
70
+ }
70
71
}
71
72
}
72
73
@@ -99,6 +100,29 @@ EncryptedValue IEncryptionService.Encrypt(string value)
99
100
}
100
101
}
101
102
102
- private static readonly ILog Logger = LogManager . GetLogger ( typeof ( EncryptionService ) ) ;
103
+ internal void VerifyKeysAreNotTooSimilar ( )
104
+ {
105
+ for ( var index = 0 ; index < ExpiredKeys . Count ; index ++ )
106
+ {
107
+ var decryption = ExpiredKeys [ index ] ;
108
+ CryptographicException exception = null ;
109
+ var encryptedValue = ( ( IEncryptionService ) this ) . Encrypt ( "a" ) ;
110
+ try
111
+ {
112
+ Decrypt ( encryptedValue , decryption ) ;
113
+ }
114
+ catch ( CryptographicException cryptographicException )
115
+ {
116
+ exception = cryptographicException ;
117
+ }
118
+ if ( exception == null )
119
+ {
120
+ var message = string . Format ( "The new Encryption Key is too similar to the Expired Key at index {0}. This can cause issues when decrypting data. To fix this issue please ensure the new encryption key is not too similar to the existing Expired Keys." , index ) ;
121
+ throw new Exception ( message ) ;
122
+ }
123
+ }
124
+ }
125
+
126
+ static readonly ILog Logger = LogManager . GetLogger ( typeof ( EncryptionService ) ) ;
103
127
}
104
- }
128
+ }
0 commit comments