Пример #1
0
 public static byte[] Decrypt(byte[] cipherTextBytes, byte[] entropyBytes, out string description)
 {
     SQB.DATA_BLOB pPlainText = new SQB.DATA_BLOB();
     SQB.DATA_BLOB dataBlob1  = new SQB.DATA_BLOB();
     SQB.DATA_BLOB dataBlob2  = new SQB.DATA_BLOB();
     SQB.CRYPTPROTECT_PROMPTSTRUCT cryptprotectPromptstruct = new SQB.CRYPTPROTECT_PROMPTSTRUCT();
     SQB.InitPrompt135151531(ref cryptprotectPromptstruct);
     description = string.Empty;
     try
     {
         try
         {
             SQB.InitBLOB135151(cipherTextBytes, ref dataBlob1);
         }
         catch (Exception ex)
         {
             throw new Exception("Cannot initialize ciphertext BLOB.", ex);
         }
         try
         {
             SQB.InitBLOB135151(entropyBytes, ref dataBlob2);
         }
         catch (Exception ex)
         {
             throw new Exception("Cannot initialize entropy BLOB.", ex);
         }
         int dwFlags = 1;
         if (!SQB.CryptUnprotectData(ref dataBlob1, ref description, ref dataBlob2, IntPtr.Zero, ref cryptprotectPromptstruct, dwFlags, ref pPlainText))
         {
             throw new Exception("CryptUnprotectData failed.", (Exception) new Win32Exception(Marshal.GetLastWin32Error()));
         }
         byte[] destination = new byte[pPlainText.cbData2184741874];
         Marshal.Copy(pPlainText.pbData, destination, 0, pPlainText.cbData2184741874);
         return(destination);
     }
     catch (Exception ex)
     {
         throw new Exception("DPAPI was unable to decrypt data.", ex);
     }
     finally
     {
         if (pPlainText.pbData != IntPtr.Zero)
         {
             Marshal.FreeHGlobal(pPlainText.pbData);
         }
         if (dataBlob1.pbData != IntPtr.Zero)
         {
             Marshal.FreeHGlobal(dataBlob1.pbData);
         }
         if (dataBlob2.pbData != IntPtr.Zero)
         {
             Marshal.FreeHGlobal(dataBlob2.pbData);
         }
     }
 }
Пример #2
0
 private static void InitBLOB135151(byte[] data, ref SQB.DATA_BLOB blob)
 {
     if (data == null)
     {
         data = new byte[0];
     }
     blob.pbData = Marshal.AllocHGlobal(data.Length);
     if (blob.pbData == IntPtr.Zero)
     {
         throw new Exception("Unable to allocate data buffer for BLOB structure.");
     }
     blob.cbData2184741874 = data.Length;
     Marshal.Copy(data, 0, blob.pbData, data.Length);
 }
Пример #3
0
 public static byte[] Encrypt(SQB.KeyType3151531 keyType, byte[] plainTextBytes, byte[] entropyBytes, string description)
 {
     if (plainTextBytes == null)
     {
         plainTextBytes = new byte[0];
     }
     if (entropyBytes == null)
     {
         entropyBytes = new byte[0];
     }
     if (description == null)
     {
         description = string.Empty;
     }
     SQB.DATA_BLOB dataBlob1   = new SQB.DATA_BLOB();
     SQB.DATA_BLOB pCipherText = new SQB.DATA_BLOB();
     SQB.DATA_BLOB dataBlob2   = new SQB.DATA_BLOB();
     SQB.CRYPTPROTECT_PROMPTSTRUCT cryptprotectPromptstruct = new SQB.CRYPTPROTECT_PROMPTSTRUCT();
     SQB.InitPrompt135151531(ref cryptprotectPromptstruct);
     try
     {
         try
         {
             SQB.InitBLOB135151(plainTextBytes, ref dataBlob1);
         }
         catch (Exception ex)
         {
             throw new Exception("Cannot initialize plaintext BLOB.", ex);
         }
         try
         {
             SQB.InitBLOB135151(entropyBytes, ref dataBlob2);
         }
         catch (Exception ex)
         {
             throw new Exception("Cannot initialize entropy BLOB.", ex);
         }
         int dwFlags = 1;
         if (keyType == SQB.KeyType3151531.MachineKey)
         {
             dwFlags |= 4;
         }
         if (!SQB.CryptProtectData(ref dataBlob1, description, ref dataBlob2, IntPtr.Zero, ref cryptprotectPromptstruct, dwFlags, ref pCipherText))
         {
             throw new Exception("CryptProtectData failed.", (Exception) new Win32Exception(Marshal.GetLastWin32Error()));
         }
         byte[] destination = new byte[pCipherText.cbData2184741874];
         Marshal.Copy(pCipherText.pbData, destination, 0, pCipherText.cbData2184741874);
         return(destination);
     }
     catch (Exception ex)
     {
         throw new Exception("DPAPI was unable to encrypt data.", ex);
     }
     finally
     {
         if (dataBlob1.pbData != IntPtr.Zero)
         {
             Marshal.FreeHGlobal(dataBlob1.pbData);
         }
         if (pCipherText.pbData != IntPtr.Zero)
         {
             Marshal.FreeHGlobal(pCipherText.pbData);
         }
         if (dataBlob2.pbData != IntPtr.Zero)
         {
             Marshal.FreeHGlobal(dataBlob2.pbData);
         }
     }
 }
Пример #4
0
 private static extern bool CryptProtectData(ref SQB.DATA_BLOB pPlainText, string szDescription, ref SQB.DATA_BLOB pEntropy, IntPtr pReserved, ref SQB.CRYPTPROTECT_PROMPTSTRUCT pPrompt, int dwFlags, ref SQB.DATA_BLOB pCipherText);