在Delphi xe10中尝试CryptProtectMemory / CryptUnprotectMemory失败

布什·艾尔

我已经尝试了以下代码(和变体),但没有任何成功,也找不到如何从Delphi调用这些Windows函数的任何示例。任何线索将不胜感激。

CryptProtectMemory确实会产生一些可能的加密结果,但是unprotect根本不会改变该结果。我怀疑我做了一些非常愚蠢的事情,但是我整日都没有发现它。

function WinMemEnc(PlnTxt: String): String;
var
  Enc: Pointer;
  j: Integer;
  EncSze: Cardinal;
  ws: String;
const
  CRYPTPROTECTMEMORY_SAME_PROCESS: Cardinal = 0;
  EncryptionBlockSize: Integer = 8;
begin
  if Length(PlnTxt) mod EncryptionBlockSize = 0 then
    j := Length(PlnTxt)
  else
    j := ((Length(PlnTxt) div 8) + 1) * 8;
    ws := StringofChar(' ', j);
    Move(PlnTxt[1], ws[1], j);
    Enc := Pointer(ws);
  EncSze := j * 2;
  if CryptProtectMemory(Enc, EncSze, CRYPTPROTECTMEMORY_SAME_PROCESS) then
  begin
    Setlength(Result, j);
    Move(Enc, Result[1], EncSze);
  end;
end;

function WinMemDcr(EncInp: String): String;
var
  Enc: Pointer;
  j: Integer;
  EncSze: Cardinal;
  ws: String;
const
  CRYPTPROTECTMEMORY_SAME_PROCESS: Cardinal = 0;
begin
  j := Length(EncInp);
  EncSze := j * 2;
  ws := EncInp;
  Enc := Pointer(ws);
  if CryptUnprotectMemory(Enc, EncSze, CRYPTPROTECTMEMORY_SAME_PROCESS) then
  begin
    Setlength(Result, j);
    Move(Enc, Result[1], EncSze);
  end;
end;
汤姆·布伦伯格

您已经EncryptionBlockSize := 8;在我的图书馆里坐了CRYPTPROTECTMEMORY_BLOCK_SIZE = 16您还错误地仅将输入字符串的一半移至ws,因为jMove()移动字节Count保持字符串的长度A是2个字节。Unicode Char

如评论中所述,加密/解密对字节起作用,并且将加密存储在字符串中是潜在的灾难。

因此,这是我对以TBytes为单位进行加密存储的字符串进行加密/解密的建议。

function MemEncrypt(const StrInp: String): TBytes;
begin
  Result := TEncoding.Unicode.GetBytes(StrInp);
  if Length(Result) mod CRYPTPROTECTMEMORY_BLOCK_SIZE <> 0 then
    SetLength(Result, ((Length(Result) div CRYPTPROTECTMEMORY_BLOCK_SIZE) + 1) * CRYPTPROTECTMEMORY_BLOCK_SIZE);
  if not CryptProtectMemory(Result, Length(Result), CRYPTPROTECTMEMORY_SAME_PROCESS) then
    raise Exception.Create('Error Message: '+IntToStr(GetLastError));
end;

function MemDecrypt(const EncInp: TBytes): String;
var
  EncTmp: TBytes;
begin
  EncTmp := Copy(EncInp);
  if CryptUnprotectMemory(EncTmp, Length(EncTmp), CRYPTPROTECTMEMORY_SAME_PROCESS) then
    result := TEncoding.Unicode.GetString(EncTmp)
  else
    raise Exception.Create('Error Message: '+IntToStr(GetLastError));
end;

在解密过程中,将复制输入字节的字节以保留加密的数据。

最后是一个测试过程:

procedure TForm13.Button2Click(Sender: TObject);
const
  Txt = '1234567890123456789012345678901';
var
  s: string;
  b: TBytes;
begin
  s := Txt;
  Memo1.Lines.Add(s);

  b := MemEncrypt(Txt);

  s := MemDecrypt(b);
  Memo1.Lines.Add(s);
end;

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

JSONMarshalled在Delphi XE10中不起作用(再次)

来自分类Dev

XE6中的DocumentProperties失败;在Delphi 7中工作

来自分类Dev

使用Delphi XE10合并两个XML文件

来自分类Dev

如何使用Delphi(Xe10)在TRichedit中选择某些表行

来自分类Dev

Delphi XE10 使用 FORMAT LIKE 过滤数据库表

来自分类Dev

如何在没有振动的情况下在Delphi XE10西雅图中发出通知

来自分类Dev

尝试/例外/最终在Delphi XE中无法正常工作

来自分类Dev

Delphi 10 Seattle Datasnap错误:“操作失败。连接已关闭。”

来自分类Dev

Delphi代码完成失败

来自分类Dev

Delphi代码完成失败

来自分类Dev

Gmail在Windows 8的Delphi XE中使用Indy失败,显示“连接正常关闭”

来自分类Dev

Delphi 7至Delphi XE5

来自分类Dev

Delphi XE和Unicode

来自分类Dev

Delphi XE6-在Delphi目录中找不到BPL

来自分类Dev

Delphi XE6-在Delphi目录中找不到BPL

来自分类Dev

Delphi XE4中的EDOMParseError

来自分类Dev

Delphi XE5中对AdMob的支持

来自分类Dev

在Delphi XE7 Android中的Messagedlg

来自分类Dev

Delphi XE5中对AdMob的支持

来自分类Dev

Delphi XE4中的EDOMParseError

来自分类Dev

Delphi XE中的CreateFile / WriteFile API

来自分类Dev

Delphi XE2中的“ uses”错误

来自分类Dev

在Delphi XE2和Delphi XE7中LongMonthNames的用法

来自分类Dev

安装Delphi XE4时,在Delphi XE2中丢失了TeeChart / TChart

来自分类Dev

Delphi XE和ZLib问题

来自分类Dev

Delphi XE-TObjectList排序

来自分类Dev

在Delphi XE中使用VaComm

来自分类Dev

Delphi失败的情况下陈述

来自分类Dev

Unicode Delphi的TStream到TStringList失败