利用我在互联网上找到的所有知识,我想出了一个salt openssl加密和解密功能。它在90%的时间内工作,但每次在wile中,解密返回一个空的sting或与加密数据无关的随机字节。我正在使用的代码是:
function Encrypt($subject, $method, $saltLength, $key){
if($method==0){
$salt=random_bytes($saltLength);
$key=hash('sha256', $salt.$key);
$iv=random_bytes(16);
$encrypt=base64_encode(openssl_encrypt($subject, 'aes-256-ctr', $key, 0, $iv));
$return=base64_encode("$method:$salt:$iv:$encrypt");
}
return($return);
}
function Decrypt($subject, $key){
$components = explode( ':', base64_decode($subject));
$method=$components[0];
if($method==0){
$salt=$components[1];
$key = hash('sha256', $salt.$key);
$iv=$components[2];
$encrypt=base64_decode($components[3]);
$return=(openssl_decrypt($encrypt, 'aes-256-ctr', $key, 0, $iv));
}
return($return);
}
$testE=Encrypt('Test', 0, 20, 'Key0');
var_dump($testE);
echo('<br><br>');
$testD=Decrypt($testE, 'Key0');
var_dump($testD);
echo('<br><br>');
$testD=Decrypt($testE, 'Key0');
var_dump($testD);
echo('<br><br>');
此代码的错误结果示例如下:
string(72) "MDrVsJAIE8OFjyM6y5dt+xkij5m/rTrHTnzeWs0IRrTKvNR1L7wfOmJrSlNRWFIzUFQwPQ=="
string(1) "�"
string(1) "�"
或者返回一个完全空的字符串:
string(72) "MDrQ+5c83vJXnva1OjrbJ2RWGjU5ajrwCn+qCneIIOqh48Gt0JmbOllsZFVUMHRuUFQwPQ=="
string(0) ""
string(0) ""
我两次解密的原因是看故障是在解密还是加密,结果清楚地表明加密在某种程度上是错误的。
我的问题是导致数据错误加密的原因是什么? &安培;我可以改进这种方法并使其更安全吗?
答案 0 :(得分:1)
虽然不是为什么会发生这种情况的答案,但结果往往是最重要的。
如果是这种情况,那么,如果你获得90%的准确率,一段时间的循环会很快让你上路......
while(strlen($testD) < 5) {
$testD=Decrypt($testE, 'Key0');
}
如果您的目标是找出导致次要故障的原因,那么您可能需要更深入地了解核心代码。然而,在我的立场,“完成它并继续前进”往往是老板所说的,所以找到一个收集信息的工作解决方案通常是我必须要合作的。