使用php加密和解密

时间:2014-05-13 08:57:42

标签: php encryption

我有以下代码用于加密

$key="company";
$value['service_id']="edit_details";
$encrypted_string=trim(base64_encode(mcrypt_encrypt(MCRYPT_RIJNDAEL_256, $key, $value['service_id'], MCRYPT_MODE_ECB, mcrypt_create_iv(mcrypt_get_iv_size(MCRYPT_RIJNDAEL_256, MCRYPT_MODE_ECB), MCRYPT_RAND))));

我用下面的代码进行解密

$key="company";
$serviceId=$encrypted_string;
$decrypted_string=trim(mcrypt_decrypt(MCRYPT_RIJNDAEL_256, $key, base64_decode($serviceId), MCRYPT_MODE_ECB, mcrypt_create_iv(mcrypt_get_iv_size(MCRYPT_RIJNDAEL_256, MCRYPT_MODE_ECB), MCRYPT_RAND)));

我没有收到原始字符串edit_details。

我不知道这有什么不妥。

2 个答案:

答案 0 :(得分:1)

由于您使用的是ECB,因此根本不需要初始化向量(IV)。只需删除它:

$key="company";
$value['service_id']="edit_details";
$encrypted_string=trim(base64_encode(mcrypt_encrypt(MCRYPT_RIJNDAEL_256, $key, $value['service_id'], MCRYPT_MODE_ECB)));

$decrypted_string=trim(mcrypt_decrypt(MCRYPT_RIJNDAEL_256, $key, base64_decode($serviceId), MCRYPT_MODE_ECB));

在其他模式(如CBC)中,当需要IV时,您应该使用相同的 IV进行加密和解密。将其与加密数据一起传递,如manual page

所示

这个wikipedia article解释了不同的块模式是如何工作的。

答案 1 :(得分:-1)

因此,如果您按$_GET使用此值

$encrypted_string = trim(urlencode(base64_encode(mcrypt_encrypt(MCRYPT_RIJNDAEL_256, $key, $value['service_id'], MCRYPT_MODE_ECB, mcrypt_create_iv(mcrypt_get_iv_size(MCRYPT_RIJNDAEL_256, MCRYPT_MODE_ECB), MCRYPT_RAND)))));

传输base64_encoded数据时,如果数据包含?+/等字符,则可能会损坏数据。因此,传输数据时需要urlencode()