Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/apache/8.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
C# 字符串数组的字节操作_C#_Php - Fatal编程技术网

C# 字符串数组的字节操作

C# 字符串数组的字节操作,c#,php,C#,Php,这个问题是我之前解决的问题的后续: 在这个问题上,我解释说我在php和c#之间有一个有效的加密通信。我添加了一个小的字节调整来增加模糊度。然而,我注意到,大约50分之一的用户无法理解加密内容。这让我相信我的字节更改和字节还原代码并不能解释某些边缘情况 请注意,我用同一条消息反复测试了这一点,因此唯一改变的是IV,它每次都随机化并附加在加密数据之前 下面是我在PHP端所做的工作,它对响应进行加密。这个想法是将角色滚动5次,以考虑base64的限制 $data = getEncryptedBase

这个问题是我之前解决的问题的后续:

在这个问题上,我解释说我在php和c#之间有一个有效的加密通信。我添加了一个小的字节调整来增加模糊度。然而,我注意到,大约50分之一的用户无法理解加密内容。这让我相信我的字节更改和字节还原代码并不能解释某些边缘情况

请注意,我用同一条消息反复测试了这一点,因此唯一改变的是IV,它每次都随机化并附加在加密数据之前

下面是我在PHP端所做的工作,它对响应进行加密。这个想法是将角色滚动5次,以考虑base64的限制

$data = getEncryptedBase64Data();
$ordVal = ord($data[strlen($data)-5]);
if($ordVal == 65)//'A'
{
    $ordVal = 47;//'/'
}
else if($ordVal == 48)//'0'
{
    $ordVal = 122;//'z'
}
else if($ordVal == 47)//'/'
{
    $ordVal = 45;//'+'
}
else if($ordVal == 45) //'+'
{
    $ordVal = 57;//'9'
}
else //B through z and 1 through 9
{
    $ordVal--;
}
$data[strlen($data)-5] = chr($ordVal);
return $data;
下面是我在C端所做的工作,它在从http响应获取Base64字符串后解密响应

string webText = //The content from the http response
byte[] decoded = Utils.FromBase64ServerString(webText);
//do decryption
其中,FromBase64ServerString定义为

//Roll the 5th last bit to make things harder to decrypt
    char[] chars = s.ToCharArray();
    char ordinal = chars[chars.Length - 5];
    if(ordinal == 'z')
    {
        ordinal = '0';
    }
    else if(ordinal == '+')
    {
        ordinal = '/';
    }
    else if(ordinal == '/')
    {
        ordinal = 'A';
    }
    else if(ordinal == '9')
    {
        ordinal = '+';
    }
    else
    {
        ordinal++;
    }
    chars[chars.Length - 5] = ordinal;
    return Convert.FromBase64CharArray(chars,0,chars.Length);
总结 -加密代码本身运行良好 -在加密之后和解密之前添加一个字节inc\dec来反转它只会导致大约5%的时间出现问题。
-删除字节篡改并让它整天来回发送垃圾邮件不会导致任何错误。

我认为您一定遇到了冲突。如果序数--产生一个特殊字符,那么如果正确,您将无法反转。

我认为出现问题的原因是
否则如果($ordVal==45)
在PHP代码中,
+
的正确值是43而不是45(45是
-
字符),这会导致C端错误地解码字符串。将PHP代码更改为以下代码段应该可以解决这个问题

$data = getEncryptedBase64Data();
$ordVal = ord($data[strlen($data)-5]);
if($ordVal == 65)//'A'
{
    $ordVal = 47;//'/'
}
else if($ordVal == 48)//'0'
{
    $ordVal = 122;//'z'
}
else if($ordVal == 47)//'/'
{
    $ordVal = 43;//'+'
}
else if($ordVal == 43) //'+'
{
    $ordVal = 57;//'9'
}
else //B through z and 1 through 9
{
    $ordVal--;
}
$data[strlen($data)-5] = chr($ordVal);
return $data;

这并不能帮助您解决问题,但Base64不是加密,而是编码。加密转换数据,以便只有知道秘密的人才能解密和查看它。编码是将数据转换成另一种形式,以便可以无误地传输数据。我希望您没有发送使用base64编码的敏感数据。如上所述,我的最终数据是IV+加密的base64 encoded;)您加密的唯一值是A-Z、A-Z、0-9、“+”和“/”?或者你是在处理整个ASCII表?它的base64编码值正在被篡改,因此整个ASCII表在这种情况下不适用。即使你能做到这一点,它实际上也没有添加任何有意义的内容。要么你的加密增加了足够的安全性,要么没有。增加一点默默无闻真的不会有帮助。非常感谢。我不敢相信我忽略了这一点。我一直在寻找一个非常高层次的问题;)结果证明上面的人是正确的,不过还是谢谢你的意见。