【问题标题】:PubNub throwing "CryptographicException:Padding is invalid and cannot be removed"PubNub 抛出“CryptographicException:填充无效且无法删除”
【发布时间】:2015-07-12 10:51:49
【问题描述】:

我正在尝试订阅 RingCentral 服务,以便在有新电话时收到通知。我正在使用 PubNub C# Nuget 包。通知订阅工作正常,然后我使用以下连接到 PubNub:

var pn = new Pubnub("", "sub-c-...", "sec-c-ZDNlYjY0OWMtGHFmOC00OTg2LWJjMTMtYjBkMzgzOWRmMzUz", "SJG...==", false);
pn.Subscribe<string>("412276449514272_46d8dac5", u => Debug.WriteLine("u:" + u), c => Debug.WriteLine("c:" + c), e => Debug.WriteLine("e:" + e));

但是,当拨打电话时,Pubnub 会向我的代码发送通知,但 Pubnub 代码崩溃并显示“CryptographicException:Padding is invalid and cannot be removed”。有人有这方面的经验吗?

密码密钥SJG...== 似乎是base64,但将其解码为字符串不起作用(只会产生带有ASCII 和UTF8 的问号),所以我假设这是实际的密码密钥。

【问题讨论】:

  • 不确定问题,但您现在需要重新生成您的密钥并更改您的加密密钥,因为您已经将它暴露给全世界。我删除了它,但现在有点晚了。您能否将此问题发布到 support@pubnub.com,我们将私下处理此问题并在不暴露任何敏感数据的情况下发回任何解决方案?也无需将您的密钥发送给我们,因为我们将其保存在您的帐户中。只需发送您的子密钥。
  • @CraigConover 谢谢,但不要害怕 - 我已经先调整了它们。
  • 很高兴知道。您提交支持了吗?
  • @CraigConover 是的,案例 #13877,谢谢。

标签: c# pubnub ringcentral


【解决方案1】:

RingCentral API 使用带有 ECB 模式和标准 PKCS7 填充的 128 位 AES。密钥和密码采用 Base64 编码。

RingCentral 加密与 Pubnub 不同,因此您不应向 PubNub 客户端提供加密密钥。相反,您应该使用上述设置手动解码 PubNub 消息。

【讨论】:

    【解决方案2】:

    请尝试 RingCentral SDK 1.0.0。在 1.0.0 中,BouncyCastle 用于对消息进行解密。这里有一些代码供您参考:

    private object Decrypt(string dataString)
    {
       var key = Convert.FromBase64String(subscriptionInfo.DeliveryMode.EncryptionKey);
       var keyParameter = ParameterUtilities.CreateKeyParameter("AES", key);
       var cipher = CipherUtilities.GetCipher("AES/ECB/PKCS7Padding");
       cipher.Init(false, keyParameter);
    
       var data = Convert.FromBase64String(dataString);
       var memoryStream = new MemoryStream(data, false);
       var cipherStream = new CipherStream(memoryStream, cipher, null);
    
       var bufferSize = 1024;
       var buffer = new byte[bufferSize];
       var length = 0;
       var resultStream = new MemoryStream();
       while ((length = cipherStream.Read(buffer, 0, bufferSize)) > 0)
       {
           resultStream.Write(buffer, 0, length);
       }
       var resultBytes = resultStream.ToArray();
       var result = Encoding.UTF8.GetString(resultBytes, 0, resultBytes.Length);
       return JsonConvert.DeserializeObject(result);
    }
    

    解密会自动为您处理,因此您无需自己进行。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-05-31
      • 1970-01-01
      • 2016-07-18
      • 2014-06-17
      • 1970-01-01
      • 2021-03-15
      • 2011-12-25
      相关资源
      最近更新 更多