C# 字符串数组的字节操作
这个问题是我之前解决的问题的后续: 在这个问题上,我解释说我在php和c#之间有一个有效的加密通信。我添加了一个小的字节调整来增加模糊度。然而,我注意到,大约50分之一的用户无法理解加密内容。这让我相信我的字节更改和字节还原代码并不能解释某些边缘情况 请注意,我用同一条消息反复测试了这一点,因此唯一改变的是IV,它每次都随机化并附加在加密数据之前 下面是我在PHP端所做的工作,它对响应进行加密。这个想法是将角色滚动5次,以考虑base64的限制C# 字符串数组的字节操作,c#,php,C#,Php,这个问题是我之前解决的问题的后续: 在这个问题上,我解释说我在php和c#之间有一个有效的加密通信。我添加了一个小的字节调整来增加模糊度。然而,我注意到,大约50分之一的用户无法理解加密内容。这让我相信我的字节更改和字节还原代码并不能解释某些边缘情况 请注意,我用同一条消息反复测试了这一点,因此唯一改变的是IV,它每次都随机化并附加在加密数据之前 下面是我在PHP端所做的工作,它对响应进行加密。这个想法是将角色滚动5次,以考虑base64的限制 $data = getEncryptedBase
$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表在这种情况下不适用。即使你能做到这一点,它实际上也没有添加任何有意义的内容。要么你的加密增加了足够的安全性,要么没有。增加一点默默无闻真的不会有帮助。非常感谢。我不敢相信我忽略了这一点。我一直在寻找一个非常高层次的问题;)结果证明上面的人是正确的,不过还是谢谢你的意见。