我用这个方法来加密小字符串很长一段时间,工作得很好。当我试图传递一个大字符串(长度〉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
1条答案
按热度按时间cbeh67ev1#
1.您的程序无法编译,如您在本例中所示,因为
您将此问题标记为 * Delphi *,因此标识符不区分大小写:无法定义
KEY
,因为Key
已经存在。这在 Pascal 中可能是可能的。所以请对照您的实际代码检查您给我们的示例。1.您的循环变量不够大:
如果
Length(Text)
为304,则循环将只运行48次迭代,因为Byte
最多可以保存256个值。如果循环结束条件的值大于变量所能保存的值,则从该结束条件中减去变量的最大值。即304减去256等于48。1.当你只需要一个字符的时候,为什么你需要一个临时字符串呢?即使这样,你也只把is当作Byte,那么为什么不使用它呢?
这可以写得更清楚:
1.永远不要加密文本-加密字节。声明
会因 Delphi 版本而异。为什么不至少声明
AnsiString
呢?或者更好:TBytes
或Array of Byte
?当处理任何类型的String
时,你永远无法确定一个字符需要多少字节。在 Delphi 2009及更高版本中使用String
时,每个字符使用的字节数超过1个,所以使用Byte(String[i])
时,你如履薄冰。