我有一些工作正常的加密代码。为了使它有点偷偷摸摸,我想在加密后调整字节数组,并在解密前在另一侧取消调整。这样,如果有人获得我的加密密钥,也许他们也不知道为什么它不起作用。
然而,无论何时我操纵字节都会破坏事物,这对我来说意味着我没有正确修改字符串字节数组。这是我的实现,如下所示。它为了测试目的而直接进行加密和解密。
$string = "My Test String";
$size = mcrypt_get_iv_size(MCRYPT_RIJNDAEL_256, MCRYPT_MODE_CBC);
$iv = mcrypt_create_iv($size, MCRYPT_RAND);
$key = pack('H*', encryptKey());
$result = mcrypt_encrypt(MCRYPT_RIJNDAEL_256, $key, addpadding($string), MCRYPT_MODE_CBC, $iv);
$ordVal = ord($result[5]);
if($ordVal == 0)
{
$ordVal = 255;
}
else
{
$ordVal--;
}
//$result[5] = $ordVal;
$data = base64_encode($iv . $result);
$str = base64_decode($data);
if(!str)
{
dieEncrypted("Unable to base64 decode string");
}
$ivSize = mcrypt_get_iv_size(MCRYPT_RIJNDAEL_256, MCRYPT_MODE_CBC);
$iv = substr($str,0,$ivSize);
$str = substr($str,$ivSize);
$ordVal = ord($str[5]);
if($ordVal == 255)
{
$ordVal = 0;
}
else
{
$ordVal++;
}
//$str[5] = $ordVal;
$key = pack('H*', encryptKey());
$result = mcrypt_decrypt(MCRYPT_RIJNDAEL_256, $key, $str, MCRYPT_MODE_CBC, $iv);
if(!$result)
{
dieEncrypted("Unable to unencrypt string");
}
$result = strippadding($result);
echo "The result is: $result|";
答案 0 :(得分:0)
如果$iv[5]
确实是一个数字字符(0-9),它应该可以工作。但除此之外,它不会因为php将字母/字符转换为数字,因此添加1是有意义的。字母数字转换为0,因此结果将始终为0 + 1 = 1,这不是您想要的。
如果要将ascii代码增加1,请尝试此操作。
$iv[5] = ord($iv[5]) + 1;
// undo it
$iv[5] = chr($iv[5]) - 1;
答案 1 :(得分:0)
让我们忽视这样一个事实,即默默无闻的安全措施不起作用并回答你的问题。
猜测: 255 + 1 = 256(或单字节字符为0)。这将改变以零结尾的字符串长度。
尝试使用base64编码实际字节数组,然后对其进行解码,这样就不会丢失任何内容。
答案 2 :(得分:0)
好的,我想出来了。看起来这个数据的字符串格式是这样的,你不能操纵单个字符。也许它的多字节字符或其他东西。无论如何解决方案是如上所述编码到base64,然后使用翻转逻辑执行字节操作,因为base64不是线性的。这结合了第二个答案中提到的ord \ chr解决方案。因此,以这种方式组合起来的两个答案似乎都可以解决问题。谢谢大家!