我已经读过加密字符串的字节数组而不是字符串本身是最佳实践。
加密算法通常适用于字节数组或字节流,所以是的。您不直接加密对象(字符串),而是加密它们的字节表示。
另外,我读过某些加密算法期望每个加密数据包的大小是固定的。如果要加密的最后一个数据包不是所需的大小,则加密将失败。
这是您选择的特定加密算法的实现细节。这实际上取决于算法的 API 接口是什么。
一般来说,是的,加密算法会将输入分解为固定大小的块。如果最后一个块未满,那么他们可能会用任意字节填充末尾以获得完整块。为了区分填充数据和恰好在末尾具有看起来像填充字节的数据,它们会将纯文本的长度预先或附加到字节流中。
这是不应该留给用户的那种细节,一个好的加密库会为你处理这些细节。理想情况下,您只想输入纯文本字节并在另一端获取加密字节。
因此,对首先转换为固定长度(例如十六进制)的数据进行加密似乎是个好主意。
将字节转换为十六进制不会使其长度固定。它的大小加倍,但这不是固定的。它使它成为 ASCII 安全的,因此它可以很容易地嵌入到文本文件和电子邮件中,但这与这里无关。(而且 Base64 是比十六进制更好的二进制→ASCII 编码。)
为了确定确保与跨不同语言和平台加密和解密数据的兼容性的最佳实践,我想对以下步骤作为一个过程进行批评:
加密:
- 纯文本字符串
- 将纯文本字符串转换为字节数组
将字节数组转换为十六进制
- 将十六进制加密为加密字符串
加密字符串
- 纯文本字节数组到加密字节数组
解密:
加密字符串
- 将加密字符串解密为十六进制
将十六进制转换为字节数组
- 加密字节数组
- 将加密字节数组解密为纯文本字节数组
- 将字节数组转换为纯文本字符串
- 纯文本字符串
要加密,请将纯文本字符串转换为其字节表示,然后加密这些字节。结果将是一个加密的字节数组。
以您选择的方式将字节数组传输到其他程序。
要解密,请将加密的字节数组解密为纯文本字节数组。从这个字节数组构造你的字符串。完毕。