44using System . Text ;
55
66namespace Confuser . Renamer {
7- public class ReversibleRenamer {
8- readonly RijndaelManaged cipher ;
9- readonly byte [ ] key ;
10-
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 ) ) ;
7+ public class ReversibleRenamer : IDisposable {
8+ readonly Aes cipher ;
9+ readonly byte seedBytesHash ;
10+
11+ public ReversibleRenamer ( string password , string seed ) {
12+ cipher = Aes . Create ( ) ;
13+ using ( var sha = SHA256 . Create ( ) ) {
14+ cipher . Key = sha . ComputeHash ( Encoding . UTF8 . GetBytes ( password + seed ) ) ;
15+ seedBytesHash = GetDataHash ( seed ) ;
16+ }
1517 }
1618
1719 public string Encrypt ( string name ) {
18- byte ivId = GetIVId ( name ) ;
19- cipher . IV = GetIV ( ivId ) ;
20- var buf = Encoding . UTF8 . GetBytes ( name ) ;
21-
2220 using ( var ms = new MemoryStream ( ) ) {
21+ byte ivId = GetDataHash ( name ) ;
2322 ms . WriteByte ( ivId ) ;
23+ cipher . IV = GenerateIV ( ivId ) ;
24+
25+ var buf = Encoding . UTF8 . GetBytes ( name ) ;
2426 using ( var stream = new CryptoStream ( ms , cipher . CreateEncryptor ( ) , CryptoStreamMode . Write ) ) {
2527 stream . Write ( buf , 0 , buf . Length ) ;
2628 stream . FlushFinalBlock ( ) ;
@@ -29,10 +31,10 @@ public string Encrypt(string name) {
2931 }
3032 }
3133
32- public string Decrypt ( string name ) {
33- using ( var ms = new MemoryStream ( Base64Decode ( name ) ) ) {
34+ public string Decrypt ( string encrypted ) {
35+ using ( var ms = new MemoryStream ( Base64Decode ( encrypted ) ) ) {
3436 byte ivId = ( byte ) ms . ReadByte ( ) ;
35- cipher . IV = GetIV ( ivId ) ;
37+ cipher . IV = GenerateIV ( ivId ) ;
3638
3739 using ( var result = new MemoryStream ( ) ) {
3840 using ( var stream = new CryptoStream ( ms , cipher . CreateDecryptor ( ) , CryptoStreamMode . Read ) )
@@ -42,20 +44,24 @@ public string Decrypt(string name) {
4244 }
4345 }
4446
45- byte [ ] GetIV ( byte ivId ) {
47+ byte GetDataHash ( string str ) {
48+ byte hash = 0 ;
49+ if ( str . Length > 0 ) {
50+ hash = ( byte ) str [ 0 ] ;
51+ for ( int i = 1 ; i < str . Length ; i ++ )
52+ hash = ( byte ) ( hash * 3 + ( byte ) str [ i ] ) ;
53+ }
54+
55+ return ( byte ) ( hash ^ seedBytesHash ) ;
56+ }
57+
58+ byte [ ] GenerateIV ( byte dataHash ) {
4659 byte [ ] iv = new byte [ cipher . BlockSize / 8 ] ;
4760 for ( int i = 0 ; i < iv . Length ; i ++ )
48- iv [ i ] = ( byte ) ( ivId ^ key [ i ] ) ;
61+ iv [ i ] = dataHash ;
4962 return iv ;
5063 }
5164
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-
5965 static string Base64Encode ( byte [ ] buffer , int length ) {
6066 int inputUnpaddedLength = 4 * length / 3 ;
6167 var outArray = new char [ ( inputUnpaddedLength + 3 ) & ~ 3 ] ;
@@ -99,5 +105,7 @@ static byte[] Base64Decode(string str) {
99105
100106 return Convert . FromBase64CharArray ( inArray , 0 , inArray . Length ) ;
101107 }
108+
109+ public void Dispose ( ) => cipher ? . Dispose ( ) ;
102110 }
103111}
0 commit comments