44using System . Text ;
55
66namespace Confuser . Renamer {
7- public class ReversibleRenamer {
8- readonly RijndaelManaged cipher ;
7+ public class ReversibleRenamer : IDisposable {
8+ readonly Aes cipher ;
99 readonly byte [ ] key ;
10+ readonly byte keyHash ;
1011
11- public ReversibleRenamer ( string password ) {
12- cipher = new RijndaelManaged ( ) ;
13- using ( var sha = SHA256 . Create ( ) )
14- cipher . Key = key = sha . ComputeHash ( Encoding . UTF8 . GetBytes ( password ) ) ;
12+ public ReversibleRenamer ( string password , string seed ) {
13+ cipher = Aes . Create ( ) ;
14+ using ( var sha = SHA256 . Create ( ) ) {
15+ var passwordSeed = password + seed ;
16+ key = sha . ComputeHash ( Encoding . UTF8 . GetBytes ( passwordSeed ) ) ;
17+ keyHash = GetDataHash ( passwordSeed ) ;
18+ cipher . Key = key ;
19+ }
1520 }
1621
1722 public string Encrypt ( string name ) {
18- byte ivId = GetIVId ( name ) ;
19- cipher . IV = GetIV ( ivId ) ;
20- var buf = Encoding . UTF8 . GetBytes ( name ) ;
21-
2223 using ( var ms = new MemoryStream ( ) ) {
24+ byte ivId = GetDataHash ( name ) ;
2325 ms . WriteByte ( ivId ) ;
26+ cipher . IV = GenerateIV ( ivId ) ;
27+
28+ var buf = Encoding . UTF8 . GetBytes ( name ) ;
2429 using ( var stream = new CryptoStream ( ms , cipher . CreateEncryptor ( ) , CryptoStreamMode . Write ) ) {
2530 stream . Write ( buf , 0 , buf . Length ) ;
2631 stream . FlushFinalBlock ( ) ;
@@ -29,10 +34,10 @@ public string Encrypt(string name) {
2934 }
3035 }
3136
32- public string Decrypt ( string name ) {
33- using ( var ms = new MemoryStream ( Base64Decode ( name ) ) ) {
37+ public string Decrypt ( string encrypted ) {
38+ using ( var ms = new MemoryStream ( Base64Decode ( encrypted ) ) ) {
3439 byte ivId = ( byte ) ms . ReadByte ( ) ;
35- cipher . IV = GetIV ( ivId ) ;
40+ cipher . IV = GenerateIV ( ivId ) ;
3641
3742 using ( var result = new MemoryStream ( ) ) {
3843 using ( var stream = new CryptoStream ( ms , cipher . CreateDecryptor ( ) , CryptoStreamMode . Read ) )
@@ -42,20 +47,24 @@ public string Decrypt(string name) {
4247 }
4348 }
4449
45- byte [ ] GetIV ( byte ivId ) {
50+ byte GetDataHash ( string str ) {
51+ byte hash = 0 ;
52+ if ( str . Length > 0 ) {
53+ hash = ( byte ) str [ 0 ] ;
54+ for ( int i = 1 ; i < str . Length ; i ++ )
55+ hash = ( byte ) ( ( hash * 3 ) + ( byte ) str [ i ] ) ;
56+ }
57+
58+ return ( byte ) ( hash ^ keyHash ) ;
59+ }
60+
61+ byte [ ] GenerateIV ( byte dataHash ) {
4662 byte [ ] iv = new byte [ cipher . BlockSize / 8 ] ;
4763 for ( int i = 0 ; i < iv . Length ; i ++ )
48- iv [ i ] = ( byte ) ( ivId ^ key [ i ] ) ;
64+ iv [ i ] = ( byte ) ( dataHash ^ key [ i ] ) ;
4965 return iv ;
5066 }
5167
52- byte GetIVId ( string str ) {
53- byte x = ( byte ) str [ 0 ] ;
54- for ( int i = 1 ; i < str . Length ; i ++ )
55- x = ( byte ) ( x * 3 + ( byte ) str [ i ] ) ;
56- return x ;
57- }
58-
5968 static string Base64Encode ( byte [ ] buffer , int length ) {
6069 int inputUnpaddedLength = 4 * length / 3 ;
6170 var outArray = new char [ ( inputUnpaddedLength + 3 ) & ~ 3 ] ;
@@ -99,5 +108,7 @@ static byte[] Base64Decode(string str) {
99108
100109 return Convert . FromBase64CharArray ( inArray , 0 , inArray . Length ) ;
101110 }
111+
112+ public void Dispose ( ) => cipher ? . Dispose ( ) ;
102113 }
103114}
0 commit comments