如果我有一个给定的十六进制密文(来自带有 AES 的随机 IV 的 CBC 模式),其明文是 ASCII 编码的,我是否需要在加密之前将该 ASCII 明文编码为十六进制?
明文是"Pay Bob $100"
ASCII080 097 121 032 066 111 098 032 036 049 048 048
我得到了密文20814804c1767293b99f1d9cab3bc3e7 ac1e37bfb15599e5f40eef805488281d
。
如果我有一个给定的十六进制密文(来自带有 AES 的随机 IV 的 CBC 模式),其明文是 ASCII 编码的,我是否需要在加密之前将该 ASCII 明文编码为十六进制?
明文是"Pay Bob $100"
ASCII080 097 121 032 066 111 098 032 036 049 048 048
我得到了密文20814804c1767293b99f1d9cab3bc3e7 ac1e37bfb15599e5f40eef805488281d
。
不,您不必创建明文的十六进制表示。
您从一个文本开始,这可能是您的应用程序中的一个字符串。该字符串可能还没有默认的字符编码,例如 ASCII 或 UTF-16LE。如果没有默认编码,那么您需要将纯文本编码为字节(也称为字节数组或八位字节字符串)。UTF-8 是当今使用最广泛的字符编码。
为了使这更有趣,大多数 IDE 和调试器在查看字节时将它们显示为十六进制。这只是内存中字节值的表示- 字节在内存中未编码为十六进制,您只是将它们视为它们。
现代密码采用明文字节并将它们转换为密文字节。如果你得到一个字符串,那么 API 有一个包含在算法中的默认编码方法(例如,已知 PHP 会自动编码)。这是该 API 的一部分,而不是密码本身。
同样,如果密文没有自动编码,那么您可能必须自己对字节进行编码。您可以使用十六进制 - 更易于调试,因为您可以轻松查看密文的大小 - 或更有效的 Base64 编码。但是,如果您需要字符串而不是字节中的密文,则只需进行编码。您确实需要字符串的一个示例是 XML,因为它是一种文本格式(密文通常在一个CDATA
部分中)。