Delphi 中的大字符串加密

ivqmmu1c  于 2022-11-23  发布在  其他
关注(0)|答案(1)|浏览(180)

我用这个方法来加密小字符串很长一段时间,工作得很好。当我试图传递一个大字符串(长度〉500)它不工作,有人可以告诉我为什么?

`function Encrypt(const Text: string): string;
var
  i: Byte;
  Key: Word;
  strTemp: string;
const
  KEY  = 7519;
  KEY1 = 03001;
  KEY2 = 002279;
begin
  Key := KEY;
  SetLength(strTemp, Length(Text));
  Result := '';
  for i := 1 to Length(Text) do
  begin
    strTemp[i] := Char(byte(Text[I]) xor (Key shr 8));
    Result := Result + IntToHex(Byte(strTemp[i]), 2);
    Key := (Byte(strTemp[i]) + KEY) * KEY1 + KEY2 ;
  end;
end;`

我试图传递一个base64的大值,大约有5000个字符,加密后的结果大约是250个字符。
我正在尝试加密base64文本.. base64从.jpeg中提取
例如:

var vText: AnsiString;
    vText := 'iVBORw0KGgoAAAANSUhEUgAAB4AAAAQ4CAYAAADo08FDAAAgAElEQVR4XuydUbbjOJIss5bR+19oz' + '1Fla1KpS4kgCcLdI+z9XpBhbgGRfIisnn/+85///PcX/w8DGMAABsoa+Oeff8pmew1WMWelTJWyPPZdt' +'TzP31LVXO8PwS45jz788XLUmMd6+ubRh8oU//0vRwZp/aVnnzvWxU3FnNUyVcpTKcvz6VExzFgtU6U8l' +'bJUHGp/e09U693eO5G/YwADGOhggAFwhy6TEQMYaGegy0FyxZyVMpHF99FTqTcMfsf2';

结果= 6EA0B289D3DB602BC0EFCC2F2B38A54FF5916CE39FF43E4F7CACFFF7BB372D2E5485038DE606514C0BC943D55B9246C8

cbeh67ev

cbeh67ev1#

1.您的程序无法编译,如您在本例中所示,因为

var
  Key: Word;
const
  KEY  = 7519;

您将此问题标记为 * Delphi *,因此标识符不区分大小写:无法定义KEY,因为Key已经存在。这在 Pascal 中可能是可能的。所以请对照您的实际代码检查您给我们的示例。
1.您的循环变量不够大

var
  i: Byte;
begin
  for i := 1 to Length(Text) do

如果Length(Text)为304,则循环将只运行48次迭代,因为Byte最多可以保存256个值。如果循环结束条件的值大于变量所能保存的值,则从该结束条件中减去变量的最大值。即304减去256等于48。
1.当你只需要一个字符的时候,为什么你需要一个临时字符串呢?即使这样,你也只把is当作Byte,那么为什么不使用它呢?

var
  strTemp: string;
begin
  SetLength(strTemp, Length(Text));
  for i := 1 to Length(Text) do
  begin
    strTemp[i] := Char(...);
    Result := Result + IntToHex(Byte(strTemp[i]), 2);
    Key := (Byte(strTemp[i]) ...)...;

这可以写得更清楚:

var
  byteTemp: Byte;
begin
  for i := 1 to Length(Text) do
  begin
    byteTemp := Byte(Text[I]) xor (Key shr 8);
    Result := Result + IntToHex(byteTemp, 2);
    Key := (byteTemp + KEY0) * KEY1 + KEY2;

1.永远不要加密文本-加密字节。声明

function Encrypt(const Text: string): string;

会因 Delphi 版本而异。为什么不至少声明AnsiString呢?或者更好:TBytesArray of Byte?当处理任何类型的String时,你永远无法确定一个字符需要多少字节。在 Delphi 2009及更高版本中使用String时,每个字符使用的字节数超过1个,所以使用Byte(String[i])时,你如履薄冰。

相关问题