Php 从mcrypt_解密输出的额外字符
我需要一对PHP脚本中的对称加密和解密。我正在使用mcrypt_加密和crypt_解密。为了测试这一点,我有以下代码: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
$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�������������������