【问题标题】:openssl_encrypt works also to decryptopenssl_encrypt 也可以解密
【发布时间】:2018-04-07 09:10:27
【问题描述】:

我在编写openssl_encrypt 来解密我的密码的代码中犯了一个错误,它可以工作。所以也许是一个愚蠢的问题,但它是相同的功能?

这里是测试代码:

$algo  = 'AES-256-CTR';
$key = "1P4s5W0rd_or_4nyTh1ng_3L53";
$ivlen=openssl_cipher_iv_length($algo);
$iv = openssl_random_pseudo_bytes($ivlen);

$data="test";
$b64data=base64_encode($data);
$encdata = openssl_encrypt($b64data,$algo,$key,OPENSSL_RAW_DATA,$iv);

$b64decdata = openssl_encrypt($encdata,$algo,$key,OPENSSL_RAW_DATA,$iv);
$decdata=base64_decode($b64decdata);

print "<br>data: $data";
print "<br>encdata: $encdata";
print "<br>decdata: $decdata";
print "<br>";
print "<br>key: $key";
print "<br>iv: $iv";

哪个印刷品:

data: test
encdata: ��v�>u
decdata: test

key: 1P4s5W0rd_or_4nyTh1ng_3L53
iv: �|t,ԏ�&6�����

那么我的错误是什么?小鬼在哪里?

【问题讨论】:

  • 不……不一样。你的代码中有一个 gremlin,它肯定是行不通的。
  • 请看我的编辑
  • 请注意,加密是二进制的,不是基于字符的操作。加密数据似乎是随机位/字节,并且大多数没有 ASCII 或任何可显示的字符,这就是您的输出看起来“有趣”的原因。为了正确显示二进制输出,请使用十六进制(用于人)或 Base64(用于计算机)。

标签: php openssl cryptography


【解决方案1】:

CTR模式下的加密和解密是一样的,算法根据密钥和计数器(iv)生成一个数据流,与数据进行异或。给定相同的密钥和计数器,生成相同的数据流,因此加密和解密是相同的操作。

详见CTR Mode,注意图中加密用于加密和解密。

【讨论】:

    猜你喜欢
    • 2021-12-24
    • 1970-01-01
    • 2020-05-09
    • 2018-09-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-11-12
    • 2021-10-10
    相关资源
    最近更新 更多