我有一些用sodium_crypto_box_seal加密的数据,并将加密的数据和键区存储在mysql中。现在我想用php中的sodium_crypto_box_seal_open解密数据,但是我得到了以下错误:
致命错误: Uncaught : sodium_crypto_box_seal_open():参数#2 ($key_pair)必须是在第67行C:\xampp\htdocs\encryption\htdocs\encryption\Vailability1.php中抛出的SODIUM_CRYPTO_BOX_KEYPAIRBYTES字节长度:#0 C:\xampp\htdocs\encryption\vulnerability1.php(67):sodium_crypto_box_seal_open() #1 {main}
我在谷歌上搜索解决方案,但我无法让它发挥作用。这里供参考的是解密的php代码:
<?php
//check if input box not empty
if(isset($_POST['company'])){
//get value from form input boxes
$company = $_POST['company'];
//set secret and public keys for the input values
$company_keypair = sodium_crypto_box_keypair();
//set public keys for input value
$company_public_key = sodium_crypto_box_publickey($company_keypair);
//encrypt the values
$encrypted_text = sodium_crypto_box_seal($company, $company_public_key);
$company_keypair = bin2hex($company_keypair);
$encrypted_text = base64_encode($encrypted_text);
echo "<br>c".$company_keypair;
echo "<br>en".$encrypted_text;
//connect to a databse
try {
$connDB = new PDO("mysql:host=localhost;dbname=encryption", "root", "");
// set the PDO error mode to exception
$connDB->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
echo "Connected successfully";
} catch(PDOException $e) {
echo "Connection failed: " . $e->getMessage();
}
//insert query
$insert = "INSERT INTO report (company,ck)
VALUES ('$encrypted_text','$company_keypair')";
//do insertion
if($connDB->query($insert)){
echo 'Report added successfully';
}
else{
echo $connDB->error;
echo "Problem in Adding Report";
}
}//end isset
?>下面是我要解密的东西
<h2>Below is the decrypted result</h2>
<table border= 1>
<thead>
<th>Company</th>
</thead>
<tbody>
<?php
$sql = "SELECT * FROM report";
$sql = $connDB->prepare($sql);
$sql->execute();
$sql->setFetchMode(PDO::FETCH_ASSOC);
//$query = $connDB->query($sql);
while($row = $sql->fetch()):
?>
<tr>
<td>
<?php
$sealed = base64_decode($row['company']);
$key = $row['ck'];
$keypair = sodium_base642bin($key, SODIUM_BASE64_VARIANT_ORIGINAL);
$opened = sodium_crypto_box_seal_open($sealed, $keypair);
ECHO var_dump($opened);
?>
</td>
<?php endwhile; ?>
</tr>
</tbody>
</table>发布于 2022-03-23 07:51:13
下面的代码是解决问题的解密的更新部分,如上面的注释部分所示,值"$company_keypair“存储在base64编码之前的HEXSTRING中。因此,在解密方面,"$company_keypair“必须转换为hex2bin,然后才能充当sodium_crypto_box_seal_open函数的参数:
<h2>Below is the decrypted result</h2>
<table border= 1>
<thead>
<th>Company</th>
</thead>
<tbody>
<?php
$sql = "SELECT * FROM report";
$sql = $connDB->prepare($sql);
$sql->execute();
$sql->setFetchMode(PDO::FETCH_ASSOC);
//$query = $connDB->query($sql);
while($row = $sql->fetch()):
?>
<tr>
<td>
<?php
$sealed = base64_decode($row['company']);
$key = $row['ck'];
$keypair = hex2bin($key);
//$keypair = sodium_base642bin($key, SODIUM_BASE64_VARIANT_ORIGINAL);
$opened = sodium_crypto_box_seal_open($sealed, $keypair);
// $opened = sodium_crypto_box_seal_open($sealed, $key);
ECHO var_dump($opened);
?>
</td>
<?php endwhile; ?>
</tr>
</tbody>https://stackoverflow.com/questions/71581294
复制相似问题