88
99namespace Corsinvest . ProxmoxVE . Api . Console . Helpers ;
1010
11- /// <summary>
12- /// String helper
13- /// </summary>
1411internal static class StringHelper
1512{
16- /// <summary>
17- /// Decrypt
18- /// </summary>
19- /// <param name="data"></param>
20- /// <param name="key"></param>
21- /// <returns></returns>
13+ private const string VERSION_PREFIX = "v2:" ;
14+
2215 public static string Decrypt ( string data , string key )
2316 {
24- var dataArray = Convert . FromBase64String ( data ) ;
17+ if ( data . StartsWith ( VERSION_PREFIX ) )
18+ {
19+ // New format with version prefix - uses CBC mode with IV
20+ var actualData = data [ VERSION_PREFIX . Length ..] ;
21+ var dataArray = Convert . FromBase64String ( actualData ) ;
2522
26- using var tDes = TripleDES . Create ( ) ;
27- tDes . Mode = CipherMode . ECB ;
28- tDes . Key = Encoding . UTF8 . GetBytes ( key ) ;
29- tDes . Padding = PaddingMode . PKCS7 ;
23+ // Extract IV from the beginning of the data
24+ var iv = new byte [ 8 ] ;
25+ Array . Copy ( dataArray , 0 , iv , 0 , 8 ) ;
3026
31- using var cTransform = tDes . CreateDecryptor ( ) ;
32- var resultArray = cTransform . TransformFinalBlock ( dataArray , 0 , dataArray . Length ) ;
33- tDes . Clear ( ) ;
27+ // Extract encrypted content
28+ var encryptedData = new byte [ dataArray . Length - 8 ] ;
29+ Array . Copy ( dataArray , 8 , encryptedData , 0 , dataArray . Length - 8 ) ;
30+
31+ using var tDes = TripleDES . Create ( ) ;
32+ tDes . Mode = CipherMode . CBC ;
33+ tDes . Key = Encoding . UTF8 . GetBytes ( key ) ;
34+ tDes . IV = iv ;
35+ tDes . Padding = PaddingMode . PKCS7 ;
36+
37+ using var cTransform = tDes . CreateDecryptor ( ) ;
38+ var resultArray = cTransform . TransformFinalBlock ( encryptedData , 0 , encryptedData . Length ) ;
39+ tDes . Clear ( ) ;
40+
41+ return Encoding . UTF8 . GetString ( resultArray ) ;
42+ }
43+ else
44+ {
45+ // Old format without version prefix - uses ECB mode
46+ #pragma warning disable CA5351 // Accettabile per retrocompatibilità con formato dati esistenti
47+ var dataArray = Convert . FromBase64String ( data ) ;
3448
35- return Encoding . UTF8 . GetString ( resultArray ) ;
49+ using var tDes = TripleDES . Create ( ) ;
50+ tDes . Mode = CipherMode . ECB ;
51+ tDes . Key = Encoding . UTF8 . GetBytes ( key ) ;
52+ tDes . Padding = PaddingMode . PKCS7 ;
53+
54+ using var cTransform = tDes . CreateDecryptor ( ) ;
55+ var resultArray = cTransform . TransformFinalBlock ( dataArray , 0 , dataArray . Length ) ;
56+ tDes . Clear ( ) ;
57+
58+ #pragma warning restore CA5351
59+ return Encoding . UTF8 . GetString ( resultArray ) ;
60+ }
3661 }
3762
38- /// <summary>
39- /// Encrypt
40- /// </summary>
41- /// <param name="data"></param>
42- /// <param name="key"></param>
43- /// <returns></returns>
4463 public static string Encrypt ( string data , string key )
4564 {
4665 var dataArray = Encoding . UTF8 . GetBytes ( data ) ;
4766
4867 using var tDes = TripleDES . Create ( ) ;
49- tDes . Mode = CipherMode . ECB ;
68+ tDes . Mode = CipherMode . CBC ;
5069 tDes . Key = Encoding . UTF8 . GetBytes ( key ) ;
70+ tDes . GenerateIV ( ) ;
5171 tDes . Padding = PaddingMode . PKCS7 ;
5272
5373 using var cTransform = tDes . CreateEncryptor ( ) ;
5474 var resultArray = cTransform . TransformFinalBlock ( dataArray , 0 , dataArray . Length ) ;
55- tDes . Clear ( ) ;
5675
57- return Convert . ToBase64String ( resultArray , 0 , resultArray . Length ) ;
76+ // Combine IV and encrypted data
77+ var combined = new byte [ tDes . IV . Length + resultArray . Length ] ;
78+ Array . Copy ( tDes . IV , 0 , combined , 0 , tDes . IV . Length ) ;
79+ Array . Copy ( resultArray , 0 , combined , tDes . IV . Length , resultArray . Length ) ;
80+
81+ tDes . Clear ( ) ;
82+ return VERSION_PREFIX + Convert . ToBase64String ( combined , 0 , combined . Length ) ;
5883 }
84+
85+ /// <summary>
86+ /// Get the version prefix used for new encrypted data
87+ /// </summary>
88+ /// <returns></returns>
89+ public static string GetVersionPrefix ( ) => VERSION_PREFIX ;
5990}
0 commit comments