mcrypt加密将一串'%00'添加到字符串的末尾
||
使用OAuth并使用以下函数(使用我们称为\'foo \'的字符串)加密密钥(实际上是OAuth令牌)
public function encrypt( $text )
{
// add end of text delimiter
$data = mcrypt_encrypt( MCRYPT_RIJNDAEL_128, $this->key, $text, MCRYPT_MODE_ECB, $this->iv );
return base64_encode( $data );
}
当我使用逆函数对其进行解密时,最终得到:
功能:
public function decrypt( $text )
{
$text = base64_decode( $text );
return mcrypt_decrypt( MCRYPT_RIJNDAEL_128, $this->key, $text, MCRYPT_MODE_ECB, $this->iv );
}
结果:
foo%00%00%00%00%00%00%00%00%00%00%00%00%00%00
编辑:
多看一点,我意识到它实际上是URL编码为%00,这意味着我的字符串以某种方式被空字符填充了吗?所以我目前正在使用trim()摆脱它们,但是我想了解为什么会这样。
没有找到相关结果
已邀请:
3 个回复
淘圃跺枯替
鞋扣蚊冈借
夏瓤跋棘
表示您正在使用ECB(块密码操作模式)。可以针对块密码操作模式或针对流密码操作模式来处理分组密码。常见的分组密码模式是ECB和CBC,常见的流密码模式是CTR,通常称为计数器模式操作。 “ 5”是AES的实现。 AES是Rijndael密码,具有128位的块大小,以及三种可能的密钥大小:128、192和256位。因此,如果您使用分组密码模式的加密,则需要将每个128位(16个字节)的纯文本分开。当然,这给您留下了一个问题,即当最后一个块不是16个字节时该怎么办。 PHP的ѭ6或多或少由用户自己决定。如果块未满到块大小,则使用“ 7”个有值字符填充。如果输入是字符串,这很好;您可以简单地从返回的字符串中将
字符减去
。但是,如果输入是以
字符结尾的二进制数据,则该字符将丢失(+当然是从字符串的开头和结尾开始的任何其他字符)。当然,您也可以将加密后的字符串的长度与明文一起发送。 对于更好的方案,您只需要查看PKCS#7填充。可以在ѭ6comments的注释部分找到用于实现填充的多个代码段。
当前似乎不支持AES的流模式,因此,如果要保留PHP mcrypt库,则不选择该选项。