【发布时间】:2016-06-30 13:18:57
【问题描述】:
我正在尝试使用 openssl_encrypt/openssl_decrypt 加密/解密一些数据。目的如下:用户在GUI中输入一些数据,这些数据被加密并存储在数据库中。稍后它将仅针对某个用户配置文件进行检索和解密。
加密部分工作正常,因为我听从了同事的建议,即将输出包装到 bin2hex 函数中。
关键是我在解密数据时似乎无法获得二进制输出,即使我尝试使用 hex2bin 转换输出。我总是得到像“��Ps�1�_G�5�OUT”这样的输出。
我的想法已经不多了,实际上我现在真的不知道该怎么办。
这是我为测试此功能而编写的示例代码:
PHP
function encrypt($string) {
$cypher = 'aes-256-cbc';
$key = 's7aBkf4Ypn59bWviQziPDXyPasdaYlhQ';
$ivsize = openssl_cipher_iv_length($cypher);
$iv = openssl_random_pseudo_bytes($ivsize);
$encripted = openssl_encrypt(
$string, $cypher, $key, OPENSSL_RAW_DATA | OPENSSL_ZERO_PADDING, $iv
);
return $iv . $encripted;
}
function decrypt($string) {
$cypher = 'aes-256-cbc';
$key = 's7aBkf4Ypn59bWviQziPDXyPasdaYlhQ';
$ivsize = openssl_cipher_iv_length($cypher);
$iv = mb_substr($string, 0, $ivsize, '8bit');
$decrypted = mb_substr($string, $ivsize, null, '8bit');
$output = openssl_decrypt(
$decrypted, $cifrado, $key, OPENSSL_RAW_DATA | OPENSSL_ZERO_PADDING, $iv
);
return $output;
}
HTML:
<!doctype html>
<html>
<head><title>TEST</title></head>
<body>
<div style='margin-left:250px;'>
<form action="test.php" method="POST">
Encrypt
<input type="text" name="encrypt" value=''/>
<input type="submit" name="send" value='Send'/>
<br/><br/>
<?php
if (isset($_POST['encrypt']) && !empty($_POST['encrypt'])) {
echo 'encrypted string: ' . bin2hex(encrypt($_POST['encrypt']));
}
?>
<br/>
<br/>
Decrypt
<input type="text" name="decrypt" value=''/>
<input type="submit" name="send" value='Send'/>
<br/><br/>
<?php
if (isset($_POST['decrypt']) && !empty($_POST['decrypt'])) {
echo 'decrypted string: ' . decrypt($_POST['decrypt']);
var_dump(decrypt($_POST['decrypt']));
}
?>
</form>
</body>
任何想法或帮助将不胜感激。
我的 PHP 版本是 5.4.45-0+deb7u2。
提前致谢。
【问题讨论】:
-
“我在解密数据时似乎无法获得二进制输出,即使我尝试使用 hex2bin 转换输出。我总是得到像“Ps”这样的输出_G�5�OUT" - 我能说的最好的,非打印意味着你有二进制输出。
-
@jww 我在解密输出上尝试了 bin2hex,但没有任何改变。我需要一个人类可以阅读的输出,但似乎找不到解决方案。 :(
-
OpenSSL 有
OPENSSL_buf2hexstr,但我不知道 pyOpenSSL 是否提供它。我最近与其中一位开发人员讨论了与BIOs一起使用的b16或hex编码器。这对我来说很有意义,因为它是一个反复出现的请求,并且非常适合 I/O 一致性。如果库提供了 Base64 编码器和解码器,那么它也可以提供 Base32 和 Base16 编码器和解码器。 -
加密例程中不需要“多字节”字符串处理,因为它们只是将数据视为字节块。
标签: php encryption pyopenssl