Browse Source

修复超大文件解密问题

Suxue 1 năm trước cách đây
mục cha
commit
f07d93c461
1 tập tin đã thay đổi với 8 bổ sung8 xóa
  1. 8 8
      Helpers/DecryptionHelper.cs

+ 8 - 8
Helpers/DecryptionHelper.cs

@@ -19,12 +19,12 @@ namespace WechatBakTool.Helpers
 {
     public class DecryptionHelper
     {
-        const int IV_SIZE = 16;
+        const long IV_SIZE = 16;
         const int HMAC_SHA1_SIZE = 20;
         const int KEY_SIZE = 32;
         const int AES_BLOCK_SIZE = 16;
         const int DEFAULT_ITER = 64000;
-        const int DEFAULT_PAGESIZE = 4096; //4048数据 + 16IV + 20 HMAC + 12
+        const long DEFAULT_PAGESIZE = 4096; //4048数据 + 16IV + 20 HMAC + 12
         const string SQLITE_HEADER = "SQLite format 3";
         public static byte[]? GetWechatKey(string pid, int find_key_type, string account)
         {
@@ -158,7 +158,7 @@ namespace WechatBakTool.Helpers
                 hmac_salt[i] = (byte)(salt_key[i] ^ 0x3a);
             }
             //计算保留段长度
-            int reserved = IV_SIZE;
+            long reserved = IV_SIZE;
             reserved += HMAC_SHA1_SIZE;
             reserved = ((reserved % AES_BLOCK_SIZE) == 0) ? reserved : ((reserved / AES_BLOCK_SIZE) + 1) * AES_BLOCK_SIZE;
 
@@ -168,8 +168,8 @@ namespace WechatBakTool.Helpers
             OpenSSLInterop.PKCS5_PBKDF2_HMAC_SHA1(password_bytes, password_bytes.Length, salt_key, salt_key.Length, DEFAULT_ITER, key.Length, key);
             OpenSSLInterop.PKCS5_PBKDF2_HMAC_SHA1(key, key.Length, hmac_salt, hmac_salt.Length, 2, hmac_key.Length, hmac_key);
 
-            int page_no = 0;
-            int offset = 16;
+            long page_no = 0;
+            long offset = 16;
             Console.WriteLine("开始解密...");
             var hmac_sha1 = HMAC.Create("HMACSHA1");
             hmac_sha1!.Key = hmac_key;
@@ -188,7 +188,7 @@ namespace WechatBakTool.Helpers
                         byte[] decryped_page_bytes = new byte[DEFAULT_PAGESIZE];
                         byte[] going_to_hashed = new byte[DEFAULT_PAGESIZE - reserved - offset + IV_SIZE + 4];
                         fileStream.Seek((page_no * DEFAULT_PAGESIZE) + offset, SeekOrigin.Begin);
-                        fileStream.Read(going_to_hashed, 0, DEFAULT_PAGESIZE - reserved - offset + IV_SIZE);
+                        fileStream.Read(going_to_hashed, 0, Convert.ToInt32(DEFAULT_PAGESIZE - reserved - offset + IV_SIZE));
 
                         // 分页标志
                         var page_bytes = BitConverter.GetBytes(page_no + 1);
@@ -216,7 +216,7 @@ namespace WechatBakTool.Helpers
                             // 加密内容
                             byte[] page_content = new byte[DEFAULT_PAGESIZE - reserved - offset];
                             fileStream.Seek((page_no * DEFAULT_PAGESIZE) + offset, SeekOrigin.Begin);
-                            fileStream.Read(page_content, 0, DEFAULT_PAGESIZE - reserved - offset);
+                            fileStream.Read(page_content, 0, Convert.ToInt32(DEFAULT_PAGESIZE - reserved - offset));
 
                             // iv
                             byte[] iv = new byte[16];
@@ -229,7 +229,7 @@ namespace WechatBakTool.Helpers
                             // 保留
                             byte[] reserved_byte = new byte[reserved];
                             fileStream.Seek((page_no * DEFAULT_PAGESIZE) + DEFAULT_PAGESIZE - reserved, SeekOrigin.Begin);
-                            fileStream.Read(reserved_byte, 0, reserved);
+                            fileStream.Read(reserved_byte, 0, Convert.ToInt32(reserved));
                             reserved_byte.CopyTo(decryped_page_bytes, DEFAULT_PAGESIZE - reserved);
 
                             tofileStream.Write(decryped_page_bytes, 0, decryped_page_bytes.Length);