我有以下代码用于加密
$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。
我不知道这有什么不妥。
答案 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()
。