首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何使用sodium_crypto_box_seal_open函数解密使用php在mysql中使用sodium_crypto_box_seal加密的数据?

如何使用sodium_crypto_box_seal_open函数解密使用php在mysql中使用sodium_crypto_box_seal加密的数据?
EN

Stack Overflow用户
提问于 2022-03-23 02:53:53
回答 1查看 141关注 0票数 0

我有一些用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代码:

代码语言:javascript
复制
<?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
?>

下面是我要解密的东西

代码语言:javascript
复制
<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>
EN

回答 1

Stack Overflow用户

发布于 2022-03-23 07:51:13

下面的代码是解决问题的解密的更新部分,如上面的注释部分所示,值"$company_keypair“存储在base64编码之前的HEXSTRING中。因此,在解密方面,"$company_keypair“必须转换为hex2bin,然后才能充当sodium_crypto_box_seal_open函数的参数:

代码语言:javascript
复制
<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>
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/71581294

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档