我需要在使用 Lazarus/Freepascal 开发的程序中加密一些文本,但我应该能够将它们作为文本加载并解密它们,而不是二进制,因为我需要将它们保存在 TStrings 类型属性中。
哪种算法适合这种情况?
我需要在使用 Lazarus/Freepascal 开发的程序中加密一些文本,但我应该能够将它们作为文本加载并解密它们,而不是二进制,因为我需要将它们保存在 TStrings 类型属性中。
哪种算法适合这种情况?
使用任何合适的加密,然后使用 base64 MIME 编码将其变成可以存储在普通字符串中的纯字符串。
正确答案是:不要这样做。不要选择将文本加密为文本的算法。
您需要执行 2 个步骤:
无论如何,您将选择哪种加密方法 - 重要的部分是您将如何将二进制转换为文本。这意味着任何加密都可以。你可以选择 DCPCrypt、Windows 密码学——任何东西。
如何将二进制转换为文本?
1)。例如,您可以只转义坏字符,这样 TStrings 就不会混淆。选择一个特殊字符。例如:#1。
现在,要对字符串进行编码,请替换所有 #1 -> #1#2、#0 -> #1#3、#13 -> #1#4、#10 -> #1#5。这应该足以让 TStrings 毫无问题地接受这一点。
解码 - 做相反的顺序:替换 #1#5 -> #10, #1#4 -> #13, #1#3 -> #0, #1#2 -> #1。
2)。或者,您可以使用 Base64,正如 mj2008 指出的那样。Base64 是众所周知的标准。但是,它会产生更多臃肿的文本(与以前的方法相比)并且可能工作得更慢(复杂的编码而不是简单的搜索和替换逻辑)。
3)。或者您可以将每个字节写为 2 个字符:即编写每个字节的十六进制代码(就像 BinToHex 一样)。这甚至比 base64 更臃肿(但可能是最快的一种),但它具有比任何其他方法最容易实现的优点。您甚至不需要编写太多代码,因为 Delphi 已经有了 BinToHex/HexToBin 例程。
Afaik 经常使用的 Delphi dcpcrypt2 包在 FPC/Lazarus 上运行良好。
http://www.cityinthesky.co.uk/cryptography.html
我通常使用 Rijndael。
Freepascal 有一个自己的 mime 编码单元,在 Delphi 中也可以正常工作