解密Base64编码的RabbitMQ消息

时间:2017-05-18 02:19:12

标签: c# encryption rabbitmq masstransit

我正在使用MassTransit 3.4并使用EncryptedSerializer。消息由我的应用程序正确加密和解​​密,但现在我希望能够解码出现在RabbitMQ“_error”队列中的base64编码消息。我想写一些程序,以允许用户发现base64编码和加密消息的内容,我正在努力使消息正确解码。

这是我到目前为止所做的。将RabbitMQ管理UI中的“Payload”位复制/粘贴到我的文本编辑器中,尝试将代码运行到Convert.FromBase64String(text),然后将字节数组传递给one found here之类的解密函数。这个ALMOST有效 - 我以纯文本形式看到Payload的大部分字符,但很多字符都搞砸了。我无法共享整个消息有效负载,但这里是LinqPad的屏幕截图,显示了一些混乱的字符(我添加了红色用于保护)。看到黑色奇怪的人物?而领先的“g”?这是什么交易?

enter image description here

这是我用来获取解密文本的代码片段(我也试过不同的编码无效):

using (Stream msDecrypt = new MemoryStream(cipherText, false))
using (Stream csDecrypt = new CryptoStream(msDecrypt, decryptor, CryptoStreamMode.Read))
using (StreamReader srDecrypt = new StreamReader(csDecrypt, System.Text.Encoding.UTF8, false, 1024, true))
{
    plaintext = srDecrypt.ReadToEnd();
}

如果我尝试使用NewtonSoft BsonReader使用MassTransit样式的解密,当我尝试在CryptoStream对象上调用Dispose时,我得到“CryptographicException:Padding无效且无法删除”:

using (Stream msDecrypt = new MemoryStream(cipherText, false))
using (Stream csDecrypt = new CryptoStream(msDecrypt, decryptor, CryptoStreamMode.Read))
using (var jsonReader = new BsonReader(csDecrypt))
{
    envelope = deserializer.Deserialize<MessageEnvelope>(jsonReader);
}

我在这里做错了什么?

更新:如果我粘贴到Notepad ++中,它会显示很多控制字符。该字符串以gmessageId开头(EOT和STX是控制字符)。有很多STX字符 - 我认为这些字符应该是引号或冒号或者其他东西......我怎样才能将它们转换为正确的符号?

1 个答案:

答案 0 :(得分:0)

第二种方法是正确的;您想要将BsonReader反序列化为MassTransit MessageEnvelope实例。我得到了#34; CryptographicException:填充无效,无法删除&#34;因为我没有通过任何DeserializerSettings ......在MassTransit源代码中,他们初始化反序列化器,如下所示:

JsonSerializerSettings DeserializerSettings = new JsonSerializerSettings
{
    NullValueHandling = NullValueHandling.Ignore,
    DefaultValueHandling = DefaultValueHandling.Ignore,
    MissingMemberHandling = MissingMemberHandling.Ignore,
    ObjectCreationHandling = ObjectCreationHandling.Auto,
    ConstructorHandling = ConstructorHandling.AllowNonPublicDefaultConstructor,
    ContractResolver = new JsonContractResolver(),
    Converters = new List<JsonConverter>(new JsonConverter[]
    {
        new ListJsonConverter(),
        new InterfaceProxyConverter(GreenPipes.Internals.Extensions.TypeCache.ImplementationBuilder),
        new IsoDateTimeConverter {DateTimeStyles = System.Globalization.DateTimeStyles.RoundtripKind},
    })
};

var _deserializer = JsonSerializer.Create(DeserializerSettings);

以前,我只是在做:

var _deserializer = new JsonSerializer();

因此,在正确初始化反序列化器之后,对MessageEnvelope的反序列化工作正常,您可以将其序列化为Json字符串,格式如下:

MassTransit.Serialization.MessageEnvelope envelope;

using (MemoryStream msDecrypt = new MemoryStream(cipherText))
using (Stream csDecrypt = new CryptoStream(msDecrypt, decryptor, CryptoStreamMode.Read))
using (BsonReader jsonReader = new Newtonsoft.Json.Bson.BsonReader(csDecrypt))
{
    envelope = _deserializer.Deserialize<MessageEnvelope>(jsonReader);
}

string output = JsonConvert.SerializeObject(envelope, Newtonsoft.Json.Formatting.Indented);
return output;

这假定为MassTransit 3.4,Newtonsoft.Json 9.0.1(又名Json.NET)和GreenPipes(1.0.6)。在上面的代码中,我已经为这些库中的类添加了完整的命名空间。