【问题标题】:Encrypt large string in Delphi在Delphi中加密大字符串
【发布时间】:2022-11-18 22:52:51
【问题描述】:

我使用这种方法加密小字符串很长一段时间并且工作得很好.. 当我尝试传递一个大字符串(长度 > 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 文本.. 从 .jpeg 中提取的 base64

例子:


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

结果 = 6EA0B289D3DB602BC0EFCC2F2B38A54FF5916CE39FF43E4F7CACFFF7BB372D2E5485038DE606514C0BC943D55B9246C8

【问题讨论】:

  • 问题从什么字符串大小开始?这会给你一个线索。
  • 您使用的是哪个 Delphi 版本?自 Delphi 2009 起,string 类型从 Ansi 切换到 Unicode。这意味着,一个字符不再等于一个字节。所以你的byte-casts 看起来很可疑!
  • 也许加密逻辑导致某些字符变为#0,并且您用来查看加密字符串的方法在那里停止输出(即它看到字符串就好像它是空终止的一样)?
  • @rossum,有时 128.. 其他时间 250.. 它是随机的
  • 将文本转换为 UTF-8、加密字节数组(即您的 UTF-8 字节)以及将字节转换为 base64 字符串的示例数不胜数。这是一个被没完没了地讨论的话题。你为什么不自己寻找而不是让我们再举一个例子呢?

标签: delphi


【解决方案1】:
  1. 你的程序无法编译正如你在这个例子中展示的那样,因为
    var
      Key: Word;
    const
      KEY  = 7519;
    
    你标记了这个问题德尔福,并且标识符不区分大小写:KEY 无法定义,因为 Key 已经存在。这可能在帕斯卡一个人,寿。因此,请根据您的实际代码检查您给我们的示例。
  2. 你的循环变量是不够大:
    var
      i: Byte;
    begin
      for i := 1 to Length(Text) do
    
    如果 Length(Text) 为 304,则循环将仅运行 48 次迭代,因为 Byte 最多可以保存 256 个值。如果循环结束条件的值高于变量能够容纳的值,则从该结束条件中减去变量的最大值。即 304 减去 256 等于 48。
  3. 为什么需要一个临时字符串什么时候只需要一个字符?即便如此,您也只能将 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;
    
  4. 从不加密文本- 改为加密字节。声明书
    function Encrypt(const Text: string): string;
    
    将根据 Delphi 版本而有所不同。为什么不至少做到AnsiString?或者更好:TBytesArray of Byte?在处理任何一种 String 时,您永远无法确定一个字符需要多少字节。在 Delphi 2009 及更高版本中使用 String 每个字符使用超过 1 个字节,因此使用 Byte(String[i]) 你如履薄冰。

【讨论】:

    猜你喜欢
    • 2014-11-05
    • 2018-04-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-04-07
    相关资源
    最近更新 更多