如何将openssl_encrypt生成的IV字节数据转换为可传输字符串?
PHP AES加密二进制IV转可传输字符串的实现方案
你可以通过Base64编码或者十六进制编码两种方式将二进制IV转换为可传输的字符串,两种方式都可以无损还原为原始二进制IV供解密使用,以下是具体实现:
方案1:Base64编码(推荐,空间占用更低)
加密侧逻辑
在你原有代码的基础上,将生成的二进制IV编码为Base64字符串,你可以选择将IV字符串和密文拼接后一起传输(IV不需要保密,仅需保证单次加密唯一即可):
$textToEncrypt = "some text to encrypt"; $secretHash = "some-hash"; $encryptionMethod = "AES-256-CBC"; $ivlen1 = openssl_cipher_iv_length($encryptionMethod); $iv1 = openssl_random_pseudo_bytes($ivlen1); $encryptedMessage1 = openssl_encrypt($textToEncrypt, $encryptionMethod, $secretHash, 0, $iv1); // 二进制IV转Base64字符串 $ivStr = base64_encode($iv1); // 可拼接为统一字符串传输,示例用::作为分隔符 $finalContent = $ivStr . "::" . $encryptedMessage1;
解密侧逻辑
接收到传输内容后拆分出IV字符串,解码为二进制即可正常解密:
// 拆分接收到的内容 list($receivedIvStr, $receivedEncryptedMessage) = explode("::", $finalContent); // Base64字符串转回二进制IV $receivedIv = base64_decode($receivedIvStr); // 执行解密 $decryptedText = openssl_decrypt($receivedEncryptedMessage, $encryptionMethod, $secretHash, 0, $receivedIv);
方案2:十六进制编码
如果场景要求仅可使用字母数字传输,可选择十六进制编码方式:
加密侧转换
// 二进制IV转十六进制字符串 $ivStr = bin2hex($iv1);
解密侧还原
// 十六进制字符串转回二进制IV $receivedIv = hex2bin($receivedIvStr);
两种编码方式都是无损转换,不会丢失IV的原始信息,都可以保证解密正常执行。Base64编码后的字符串长度仅为十六进制的75%,更推荐在大多数场景下使用。
内容的提问来源于stack exchange,提问作者Miro
相关产品推荐
相关产品推荐

