Convert.FromBase64String表现得很奇怪

时间:2018-03-27 14:05:43

标签: c# unity3d

我有以下代码

String[] recievedChunks = received_data.Split('|');
String sb = "";

foreach (String chunck in recievedChunks)
{
    sb+=(Cryptography.RSA.decrypt(globals.serverPrivateKey, chunck));
}

//sb = H4sIAAAAAAAAAG2MywrCQAxF/yXrUqjuulMXUlwI/kGcibU4L5IUkdJ/N1oXCq4mc+69ZwIXUARayNzXifSaRWuXY8Tkpd6TdkrxRFJyEoIKPpENetLBMmPvp53+qjwq1t3S8ySOh6JDTtZqVusX41zwHAjaCwYhk5m7qSBhNAab7c5KhQdnv6axQBTdbVkojzZQRk8/4FHsXlVwJ+Qv91wBk4xBzXs8wPwEOn1v+/wAAAA=

Debug.Log("dodecrypt" + sb);

Debug.Log(Convert.FromBase64String("H4sIAAAAAAAAAG2MywrCQAxF/yXrUqjuulMXUlwI/kGcibU4L5IUkdJ/N1oXCq4mc+69ZwIXUARayNzXifSaRWuXY8Tkpd6TdkrxRFJyEoIKPpENetLBMmPvp53+qjwq1t3S8ySOh6JDTtZqVusX41zwHAjaCwYhk5m7qSBhNAab7c5KhQdnv6axQBTdbVkojzZQRk8/4FHsXlVwJ+Qv91wBk4xBzXs8wPwEOn1v+/wAAAA="));

Debug.Log(Convert.FromBase64String(sb));

最后一行给我错误:

  

FormatException:输入不是有效的Base-64字符串,因为它包含非基本64个字符,两个以上的填充字符或填充字符中的非法字符。   有什么想法吗?

调试输出

dodecrypt H4sIAAAAAAAAAG2MywrCQAxF/yXrUqjuulMXUlwI/kGcibU4L5IUkdJ/N1oXCq4mc+69ZwIXUARayNzXifSaRWuXY8Tkpd6TdkrxRFJyEoIKPpENetLBMmPvp53+qjwq1t3S8ySOh6JDTtZqVusX41zwHAjaCwYhk5m7qSBhNAab7c5KhQdnv6axQBTdbVkojzZQRk8/4FHsXlVwJ+Qv91wBk4xBzXs8wPwEOn1v+/wAAAA=
UnityEngine.Debug:Log(Object)
GameClient:writeSocketReturnCrypted(String) (at 
Assets/Src/Networking/GameClient.cs:221)
Assets.Src.Networking.Commands.GetItem.GetItem:getItem(Int32) (at 
Assets/Src/Networking/Commands/GetItem/GetItem.cs:15)
GameClient:Update() (at Assets/Src/Networking/GameClient.cs:76)

System.Byte[]
UnityEngine.Debug:Log(Object)

FormatException: The input is not a valid Base-64 string as it contains a 
non-base 64 character, more than two padding characters, or an illegal 
character among the padding characters.

2 个答案:

答案 0 :(得分:0)

基本64位编码的字符串以4对为单位进行评估。您必须提供一个可分为4的字符数。最后添加填充字符(=)将执行:

byte[] b = Convert.FromBase64String("H4...==");

另一个问题是你正在阅读大块的内容。始终确保每个块最终都有适量的字符,否则您的程序将无法正确解码。

答案 1 :(得分:0)

我理解您的代码的方式是,您有一个|分隔的基本64位编码的RSA加密数据块。您的输入放在一起的方式可以通过多种方式构建,因为解密工作但解码失败,我猜这样做是这样的:

  1. Base64编码所有数据
  2. 将(已编码的)数据拆分为块
  3. 加密每个块
  4. 使用|
  5. 加入这些块

    然而,您的解密/解码过程与此序列不匹配:

    1. |
    2. 拆分块
    3. 解密块
    4. 将解密的base64阻塞在一起
    5. 解码生成的字符串。
    6. 确保解密/解码过程与加密/编码过程相同,但以反向顺序。现在你可能在=的中间有几个sb,这就是它适用于单个块(第二个Log)而不是整个concated base64字符串的原因(因为它&#39} ; s无效 - 您不能随意加入base64编码的字符串。)