Php 如何在openssl_random_pseudo_字节(0)中固定长度必须大于0?
我试图创建一个qr码生成器,但使用aes加密时遇到了错误 致命错误:未捕获错误:长度必须大于0英寸。。堆栈跟踪:#0..:openssl#u随机#u伪#u字节(0)#1..:AES->getIV()#2..:AES->encrypt()#3{main}抛出。。在线146 它指向这一行Php 如何在openssl_random_pseudo_字节(0)中固定长度必须大于0?,php,encryption,aes,Php,Encryption,Aes,我试图创建一个qr码生成器,但使用aes加密时遇到了错误 致命错误:未捕获错误:长度必须大于0英寸。。堆栈跟踪:#0..:openssl#u随机#u伪#u字节(0)#1..:AES->getIV()#2..:AES->encrypt()#3{main}抛出。。在线146 它指向这一行返回openssl_random_pseudo_字节(openssl_cipher_iv_length($this->method)) 我如何解决我修复这个问题,这意味着我需要修复长度必须大于0的问题 link :
返回openssl_random_pseudo_字节(openssl_cipher_iv_length($this->method))代码>
我如何解决我修复这个问题,这意味着我需要修复长度必须大于0的问题
link : <input type="text" name="link" value="<?=$link?>" > <br>
info : <input type="text" name="minfo" value="<?=$minfo?>" > <br>
mode : <input type="text" name="mode" value="<?=$mode?>" > <br>
key : <input type="text" name="key" value="<?=$key?>" > <br>
blockSize : <input type="text" name="blockSize" value="<?=$blockSize?>" ><br>
<input type="submit" name="btn" value="encrypt" >
<?php
ini_set('display_errors', 1);
ini_set('display_startup_errors', 1);
error_reporting(E_ALL);
$info = (explode(";",$minfo));
$abc_code = $info[0];
$abc_title = $info[1];
$inputText = trim($minfo);
$secret_key = $key;
$blockSize = trim($blockSize);//128;
$mode = trim($mode);
$aes = new AES($inputText, $secret_key, $blockSize, $mode );
$enc = $aes->encrypt();
$StrQRCode = $link.$enc;
echo "<br>ecrypted : ".$enc." <br/>";
echo "<br>text : ".$link.$enc." <br/>";
$aes->setData($enc);
$dec=$aes->decrypt();
echo "decrypted: ".$dec." <br/>";
?>
<?php
/**
Aes encryption
*/
class AES {
protected $key;
protected $data;
protected $method;
/**
* Available OPENSSL_RAW_DATA | OPENSSL_ZERO_PADDING
*
* @var type $options
*/
protected $options = 0;
/**
*
* @param type $data
* @param type $key
* @param type $blockSize
* @param type $mode
*/
function __construct($data, $key , $blockSize , $mode ) {
$this->setData($data);
$this->setKey($key);
$this->setMethode($blockSize, $mode);
}
/**
*
* @param type $data
*/
public function setData($data) {
$this->data = $data;
}
/**
*
* @param type $key
*/
public function setKey($key) {
$this->key = $key;
}
public function setMethode($blockSize, $mode ) { //$mode = 'CBC'
if($blockSize==192 && in_array('', array('CBC-HMAC-SHA1','CBC-HMAC-SHA256','XTS'))){
$this->method=null;
throw new Exception('Invlid block size and mode combination!');
}
$this->method = 'AES-' . $blockSize . '-' . $mode;
}
/**
*
* @return boolean
*/
public function validateParams() {
if ($this->data != null &&
$this->method != null ) {
return true;
} else {
return FALSE;
}
}
protected function getIV() {
return openssl_random_pseudo_bytes(openssl_cipher_iv_length($this->method));
}
public function encrypt() {
if ($this->validateParams()) {
return trim(openssl_encrypt($this->data, $this->method, $this->key, $this->options,$this->getIV()));
} else {
throw new Exception('Invlid params!');
}
}
/**
*
* @return type
* @throws Exception
*/
public function decrypt() {
if ($this->validateParams()) {
$ret=openssl_decrypt($this->data, $this->method, $this->key, $this->options,$this->getIV());
return trim($ret);
} else {
throw new Exception('Invlid params!');
}
}
}
?>
link:在您执行“$mode=trim($mode);”之后的值是多少?->请打印出该值。我认为该值为0,因此最后您尝试生成一个长度为0的随机值。$mode的值为ECB
两条注释:请不要再使用不安全的ECB模式;其次:不要使用ECB模式,因为它没有初始化向量。将模式更改为(例如,'CBC'允许您运行您的类:-)哦,天哪,这就是我出现错误的原因吗???这么想你,我真的不知道那件事。我想我需要阅读更多在你做“$mode=trim($mode);”->之后的值是多少请打印出值。我认为该值为0,因此最后您尝试生成一个长度为0的随机值。$mode的值为ECB
两条注释:请不要再使用不安全的ECB模式;其次:不要使用ECB模式,因为它没有初始化向量。将模式更改为(例如,'CBC'允许您运行您的类:-)哦,天哪,这就是我出现错误的原因吗???这么想你,我真的不知道那件事。我想我需要多读点书