操纵二进制字符串中的字节

时间:2014-09-08 04:31:30

标签: php

我有一些工作正常的加密代码。为了使它有点偷偷摸摸,我想在加密后调整字节数组,并在解密前在另一侧取消调整。这样,如果有人获得我的加密密钥,也许他们也不知道为什么它不起作用。

然而,无论何时我操纵字节都会破坏事物,这对我来说意味着我没有正确修改字符串字节数组。这是我的实现,如下所示。它为了测试目的而直接进行加密和解密。

$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|"; 

3 个答案:

答案 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解决方案。因此,以这种方式组合起来的两个答案似乎都可以解决问题。谢谢大家!