wang_80919 发表于 2017-10-21 10:04:59

跨平台 通用的 数据加密解密或编码解码的 设计思路

delphi 的 加密解密都是针对 Byte 来的。
具体表现是 TBytes 和 TStream。
字符串,那是最终封装,方便使用而已。
delphi 内置的封装,都是 UTF8 编码的。
例如 Base64 UrlEncode 这些 都是 默认 UTF8 。

所以,自己写的 加密解密 编码解码。
也应如下设计。

注意 不要用 “复制代码” 这个按钮。

**** Hidden Message *****

当然 UTF8 换成 ANSI 或 Unicode 等 其他编码也是很容易的。

下面是按 TStream 设计。
**** Hidden Message *****

TBytes 和 TStream 是可以互相转换的
AStream := TBytesStream.Create(ABytes) //TBytes 转为 TStream
下面是 反过来 TStream 转为 TBytes;
SetLength(ABytes, AStream.Size - AStream.Position);
AStream.Read(ABytes, AStream.Size - AStream.Position);
也可以通过下面的代码转换就是麻烦些

ABytesStream := TBytesStream.Create(nil);
try
    ABytesStream.CopyFrom(AStream, 0);
    ABytes := ABytesStream.Bytes;
    SetLength(ABytes, ABytesStream.Size);
finally
    FreeAndNil(ABytesStream);
end;


上述 所有代码中的UTF8 换成ANSI ,立即就能支持 D7 版本编码或加密结果了。


如果你不知道结果是什么编码的,可以先用 内存流 代替字符串流(TMemoryStream 代替 TStringStream)。
先将结果保存到内存中。
然后你再去分析这个结果是什么编码的。
当然文件流(TFileStream)也可以,这样就去分析这个文件是什么编码的。

例如
**** Hidden Message *****


如果数据中包含了 BOM 其实就非常好办了
AStringList.LoadFromStream(AStream);
就可以得到字符串了。
但是这种情况,很少见。

wang_80919 发表于 2017-10-21 10:41:01

上述代码是将加密或编码结果转为了 Base64
如果希望转换为 Hex 可以用下面的代码。

跨平台 Unicode string 用 HexToStr StrToHex
http://www.2pascal.com/forum.php ... &tid=2731&fromuid=4
(出处: 2Pascal-新时代的Pascal)


通过 TStream 转为 TBytes 的代码,
再加上 上面链接的代码 就能将 TStream 转为 Hex 了。

SetLength(ABytes, AStream.Size - AStream.Position);
AStream.Read(ABytes, AStream.Size - AStream.Position);
TempHexStr := StrToHex(ABytes);


反过来的代码我就不写了。

wfymqj 发表于 2017-10-21 10:47:25

:)来学习了,谢谢!

pascal76 发表于 2017-10-23 13:15:26

来学习了:)

hsanming 发表于 2017-10-23 13:46:40

好方法,学习了

红鱼儿 发表于 2017-10-23 13:47:02

学习:lol

zhuolong1987 发表于 2017-10-23 14:16:12

学习学习

jianwt 发表于 2017-10-23 14:31:07

这个代码要支持!!!!!

xmchcly 发表于 2017-10-23 14:42:09

学习学习

xgwzw 发表于 2017-10-23 16:51:16

看看怎么转码
页: [1] 2 3 4
查看完整版本: 跨平台 通用的 数据加密解密或编码解码的 设计思路