使用 PHP 加密数据
Encrypt data with PHP
我有这个代码:
$token = $this->hextobin($dataEncrypt);
$key = $this->key_192;
$iv = $this->iv;
$algorithm = 'xxxx';
$mode = 'ecb'; //QUESTION!!!
$td = mcrypt_module_open($algorithm, '', $mode, '') ;
$iv = substr($iv, 0, mcrypt_enc_get_iv_size($td));
$expected_key_size = mcrypt_enc_get_key_size($td);
$key = substr($key, 0, $expected_key_size);
mcrypt_generic_init($td, $key, $iv);
$response = trim(mdecrypt_generic($td, $token), '');
mcrypt_generic_deinit($td);
mcrypt_module_close($td);
$response = explode(XXXX,$response);
return $response[0];
但是请阅读 PHP 文档,特别是:http://php.net/manual/en/function.mcrypt-ecb.php 表示因此已过时并建议使用 mcrypt_generic() 和 mdecrypt_generic() 进行替换。
我的问题是如果你问我打开方式一样怎么用这些功能?
mcrypt_generic()
的使用说明如下:
- http://php.net/manual/en/mcrypt.examples.php
- http://php.net/manual/en/book.mcrypt.php
- http://php.net/manual/en/function.mcrypt-generic.php
但是,我会推荐更简单的 API mcrypt
:
用法示例:
mcrypt_encrypt(MCRYPT_3DES, "secret key", "data to encrypt", MCRYPT_MODE_ECB);
我注意到你在 ecb
上有问号。这是此处解释的加密的 "mode":
http://php.net/manual/en/mcrypt.constants.php
根据 PHP 文档:
- MCRYPT_MODE_ECB(电子密码本)适用于随机数据,比如加密其他密钥。由于那里的数据短且随机,因此ECB的缺点具有有利的负面影响。
- MCRYPT_MODE_CBC(密码块链接)特别适用于加密比 ECB 安全性显着提高的文件。
- MCRYPT_MODE_CFB(密码反馈)是加密字节流的最佳模式,其中必须加密单个字节。
- MCRYPT_MODE_OFB(输出反馈,8bit)与CFB相当,但可用于不能容忍错误传播的应用。不安全(因为它在8位模式下运行)所以不建议使用它。
- MCRYPT_MODE_NOFB(输出反馈,单位nbit)与OFB相当,但更安全,因为它对算法的块大小进行操作。
- MCRYPT_MODE_STREAM 是一种额外的模式,用于包含一些流算法,例如 "WAKE" 或 "RC4".
更新
如果您使用 CBC
模式,请记住像这样设置 iv
:
$size = mcrypt_get_iv_size(MCRYPT_3DES, MCRYPT_MODE_CBC);
$iv = mcrypt_create_iv($size, MCRYPT_DEV_RANDOM);
echo mcrypt_encrypt(MCRYPT_3DES, "secret key", "data", MCRYPT_MODE_CBC, $iv);
我有这个代码:
$token = $this->hextobin($dataEncrypt);
$key = $this->key_192;
$iv = $this->iv;
$algorithm = 'xxxx';
$mode = 'ecb'; //QUESTION!!!
$td = mcrypt_module_open($algorithm, '', $mode, '') ;
$iv = substr($iv, 0, mcrypt_enc_get_iv_size($td));
$expected_key_size = mcrypt_enc_get_key_size($td);
$key = substr($key, 0, $expected_key_size);
mcrypt_generic_init($td, $key, $iv);
$response = trim(mdecrypt_generic($td, $token), '');
mcrypt_generic_deinit($td);
mcrypt_module_close($td);
$response = explode(XXXX,$response);
return $response[0];
但是请阅读 PHP 文档,特别是:http://php.net/manual/en/function.mcrypt-ecb.php 表示因此已过时并建议使用 mcrypt_generic() 和 mdecrypt_generic() 进行替换。 我的问题是如果你问我打开方式一样怎么用这些功能?
mcrypt_generic()
的使用说明如下:
- http://php.net/manual/en/mcrypt.examples.php
- http://php.net/manual/en/book.mcrypt.php
- http://php.net/manual/en/function.mcrypt-generic.php
但是,我会推荐更简单的 API mcrypt
:
用法示例:
mcrypt_encrypt(MCRYPT_3DES, "secret key", "data to encrypt", MCRYPT_MODE_ECB);
我注意到你在 ecb
上有问号。这是此处解释的加密的 "mode":
http://php.net/manual/en/mcrypt.constants.php
根据 PHP 文档:
- MCRYPT_MODE_ECB(电子密码本)适用于随机数据,比如加密其他密钥。由于那里的数据短且随机,因此ECB的缺点具有有利的负面影响。
- MCRYPT_MODE_CBC(密码块链接)特别适用于加密比 ECB 安全性显着提高的文件。
- MCRYPT_MODE_CFB(密码反馈)是加密字节流的最佳模式,其中必须加密单个字节。
- MCRYPT_MODE_OFB(输出反馈,8bit)与CFB相当,但可用于不能容忍错误传播的应用。不安全(因为它在8位模式下运行)所以不建议使用它。
- MCRYPT_MODE_NOFB(输出反馈,单位nbit)与OFB相当,但更安全,因为它对算法的块大小进行操作。
- MCRYPT_MODE_STREAM 是一种额外的模式,用于包含一些流算法,例如 "WAKE" 或 "RC4".
更新
如果您使用 CBC
模式,请记住像这样设置 iv
:
$size = mcrypt_get_iv_size(MCRYPT_3DES, MCRYPT_MODE_CBC);
$iv = mcrypt_create_iv($size, MCRYPT_DEV_RANDOM);
echo mcrypt_encrypt(MCRYPT_3DES, "secret key", "data", MCRYPT_MODE_CBC, $iv);