Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/291.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 从mcrypt_解密输出的额外字符_Php_Encryption_Mcrypt - Fatal编程技术网

Php 从mcrypt_解密输出的额外字符

Php 从mcrypt_解密输出的额外字符,php,encryption,mcrypt,Php,Encryption,Mcrypt,我需要一对PHP脚本中的对称加密和解密。我正在使用mcrypt_加密和crypt_解密。为了测试这一点,我有以下代码: $encrypted_token = mcrypt_encrypt(MCRYPT_RIJNDAEL_256, $ENCRYPTION_SECRET, $refresh_token, MCRYPT_MODE_ECB); $encrypted_encoded_token=base64_encode($encrypted_token); echo "\nEncrypted Toke

我需要一对PHP脚本中的对称加密和解密。我正在使用mcrypt_加密和crypt_解密。为了测试这一点,我有以下代码:

$encrypted_token = mcrypt_encrypt(MCRYPT_RIJNDAEL_256, $ENCRYPTION_SECRET, $refresh_token, MCRYPT_MODE_ECB);

$encrypted_encoded_token=base64_encode($encrypted_token);
echo "\nEncrypted Token: " . $encrypted_encoded_token . "\n";
为了测试这一点,我在同一个PHP脚本中执行以下操作:

$decoded_refresh_token = base64_decode($encrypted_encoded_token);

$decrypted = mcrypt_decrypt(MCRYPT_RIJNDAEL_256, $ENCRYPTION_SECRET, $decoded_refresh_token, MCRYPT_MODE_ECB);
echo "\nDecrypted Token After decrypt: " . $decrypted . "\n";
我的输入$refresh\u标记是一个长字符串,看起来像这样(仅更长):

解密后解密的令牌如下所示:

AQCNKTZhaWTmUl3WvHOtlkv2Vc-Ybkl24D5Zp1lZPLBraTxrr-YQhErXrI2IWWEIWk5lnBc1k�������������������
我的$ENCRYPTION\u密码长度为32个字符。base64_编码和解码是因为我是json_在Post中编码和解码令牌


我做错了什么?

这些额外的字符实际上是字节值为零的。PHP的mcrypt使用
0..n-1
字节的零填充,其中
n
是块大小。换句话说,如果明文已经是块大小的倍数,那么它不会填充。否则,它将填充到块大小

现在您使用的是
MCRYPT_RIJNDAEL_256
,它不是AES,而是块大小为256位的RIJNDAEL。因此,添加的字节数为0..31字节。如果您将它们视为字符串,它们将被转换为问号或删除,具体取决于您查看字符串的方式。在mcrypt的C库中,当零终止以null结尾的字符串时,这可能更有意义

现在的特别标准是PKCS#7填充,它增加了填充字节的
1..blocksize
。如果
x
是填充字节数,则
x
也是添加的字节值。PKCS#7填充是确定性的,即无论纯文本的值如何,您始终可以取消填充。零填充的行为方式基本相同,除非纯文本末尾包含零个字符。但是,对于可打印字符串(ASCII、拉丁语或UTF-8格式)而言,情况并非如此


最后,要删除填充,只需执行
rtrim(纯文本,“\0”)
,您将得到原始字符串。

您查看了这些额外字符是什么吗?e、 g.如果它们是空的,那么它们很可能是在填充加密添加的字符,以使字符串达到加密算法所要求的块大小。@MarcB对不起,我怎么知道这些字符是什么?使用
ord(substr($decrypted,32,1))
或任何偏移量。看看这个字符的值是多少。
AQCNKTZhaWTmUl3WvHOtlkv2Vc-Ybkl24D5Zp1lZPLBraTxrr-YQhErXrI2IWWEIWk5lnBc1k�������������������