2

我正在尝试订阅 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 的问号),所以我假设这是实际的密码密钥。

4

2 回答 2

3

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

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

于 2015-07-17T00:12:52.277 回答
0

请尝试 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);
}

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

于 2016-06-15T03:22:29.000 回答