예제 #1
0
        /// <summary>
        /// CryptProtectDataでデータを暗号化します。
        /// </summary>
        /// <param name="unencryptedData">処理対象のデータ</param>
        /// <returns>暗号化されたデータ</returns>
        public static byte[] CryptProtectedData(byte[] unencryptedData)
        {
            //リソース確保
            var input  = new Win32Api.DATA_BLOB();
            var output = new Win32Api.DATA_BLOB();

            try
            {
                input.pbData = Marshal.AllocHGlobal(unencryptedData.Length);
                input.cbData = (uint)unencryptedData.Length;
                Marshal.Copy(unencryptedData, 0, input.pbData, unencryptedData.Length);

                //復号化
                var dammy  = new Win32Api.DATA_BLOB();
                var isSucc = Win32Api.CryptProtectData(ref input, null, ref dammy, IntPtr.Zero, IntPtr.Zero, 0, ref output);
                Trace.Assert(isSucc,
                             "SnkLib.App.CookieGetter: error",
                             "CryptProtectedData()でエラーが発生しました。データ暗号化で予期せぬ失敗が発生しています。");
                if (isSucc == false)
                {
                    return(null);
                }

                //リソース解放
                var cryptedBytes = new byte[output.cbData];
                Marshal.Copy(output.pbData, cryptedBytes, 0, (int)output.cbData);
                return(cryptedBytes);
            }
            catch (DllNotFoundException e)
            {
                Trace.TraceError("SnkLib.App.CookieGetter.dll:\r\n"
                                 + "CryptProtectedData()でエラーが発生しました。Win32API呼び出しで対象のdllが存在しませんでした。\r\n"
                                 + e.ToString());
                return(null);
            }
            catch (EntryPointNotFoundException e)
            {
                Trace.TraceError("SnkLib.App.CookieGetter.dll:\r\n"
                                 + "CryptProtectedData()でエラーが発生しました。Win32API呼び出しで対象のエントリーポイントが存在しませんでした。\r\n"
                                 + e.ToString());
                return(null);
            }
            finally
            {
                if (input.pbData != null)
                {
                    Marshal.FreeHGlobal(input.pbData);
                }
                if (output.pbData != null)
                {
                    Marshal.FreeHGlobal(output.pbData);
                }
            }
        }
        /// <summary>
        /// CryptProtectDataでデータを暗号化します。
        /// </summary>
        /// <param name="unencryptedData">処理対象のデータ</param>
        /// <returns>暗号化されたデータ</returns>
        public static byte[] CryptProtectedData(byte[] unencryptedData)
        {
            //リソース確保
            var input = new Win32Api.DATA_BLOB();
            var output = new Win32Api.DATA_BLOB();
            try
            {
                input.pbData = Marshal.AllocHGlobal(unencryptedData.Length);
                input.cbData = (uint)unencryptedData.Length;
                Marshal.Copy(unencryptedData, 0, input.pbData, unencryptedData.Length);

                //復号化
                var dammy = new Win32Api.DATA_BLOB();
                var isSucc = Win32Api.CryptProtectData(ref input, null, ref dammy, IntPtr.Zero, IntPtr.Zero, 0, ref output);
                Trace.Assert(isSucc,
                    "SnkLib.App.CookieGetter: error",
                    "CryptProtectedData()でエラーが発生しました。データ暗号化で予期せぬ失敗が発生しています。");
                if (isSucc == false)
                    return null;

                //リソース解放
                var cryptedBytes = new byte[output.cbData];
                Marshal.Copy(output.pbData, cryptedBytes, 0, (int)output.cbData);
                return cryptedBytes;
            }
            catch (DllNotFoundException e)
            {
                Trace.TraceError("SnkLib.App.CookieGetter.dll:\r\n"
                    + "CryptProtectedData()でエラーが発生しました。Win32API呼び出しで対象のdllが存在しませんでした。\r\n"
                    + e.ToString());
                return null;
            }
            finally
            {
                if (input.pbData != null)
                    Marshal.FreeHGlobal(input.pbData);
                if (output.pbData != null)
                    Marshal.FreeHGlobal(output.pbData);
            }
        }