MemoryStream to String,返回MemoryStream而不添加任何字节(编码等)

时间:2015-05-28 21:58:49

标签: c# arrays string encryption

好的,我发现了一些文章herehere,但他们并没有做我需要做的事情,而且我遇到了一些麻烦。

我收到一段加密的数据作为内存流。我需要以某种方式将内存流写入文件(我编写模型的方式,因为字符串最好),然后从文件中检索字符串并将其作为内存流发送到要解密的服务。我只是使用流读取器将内存流存储为字符串,并使用编码将字符串读入内存。

问题是我收到错误,说我的加密数据已损坏。我认为这意味着我以某种方式改变了字节。

以下是将内存流读入字符串的代码:

using (StreamReader reader = new StreamReader(dataKeyResponse.CiphertextBlob))
{
    encryptedDataKey = reader.ReadToEnd();
}

以下是将从文件中检索到的字符串读取到内存流中的代码:

MemoryStream mStream = new MemoryStream(ASCIIEncoding.Default.GetBytes(encryptedKey));

我认为执行它的步骤是ASCIIEncoding,但后来我实现了the workaround from above,将字节数组转换为内存流,并得到了相同的错误。

byte[] bytes = new byte[encryptedKey.Length*sizeof (char)];
System.Buffer.BlockCopy(encryptedKey.ToCharArray(), 0, bytes, 0, bytes.Length);

string decryptedKey;
using (MemoryStream mStream = new MemoryStream())
{
    mStream.Write(bytes, 0, bytes.Length);
    var decryptRequest = new DecryptRequest()
    {CiphertextBlob = mStream};
    var decryptResponse = client.Decrypt(decryptRequest);
    using (StreamReader reader = new StreamReader(decryptResponse.Plaintext))
    {
        decryptedKey = reader.ReadToEnd();
    }
}

我假设(1)某些事情以某种方式改变数据,而不是其他一些错误; (2)它在流中 - >字符串或字符串 - >流转换,而不是字符串 - >文件或字符串< - 文件转换; (3)进出数据的完美副本将解决问题 - 进入的数据应该是“明文”加密版本;也许有一种期望我编码流入和出去的流(编码甚至改变了数据?我从它所做的post判断)。

确认字节应该等效进入和退出,或者在文件中捕获内存流的方法,并将其发送回去而不改变任何内容将是非常棒的。

1 个答案:

答案 0 :(得分:13)

假设您的MemoryStream包含以下输入数据:[0x01,0x02,0x03,0x04] 当您使用streamreader读取它时,字符串的二进制表示形式为:[0x00,0x01,0x00,0x02,0x00,0x03,0x00,0x04],因为字符串对字符使用两个字节表示。之后你要做的是为你的“bytes”变量而不是4分配8个字节,并用第二个(修改过的)数据填充它。您可以使用Convert.ToBase64String()来获取字符串表示,也可以使用FromBase64String()来解析它。像这样:

var testData = new byte[] { 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08 };
var inputStream = new MemoryStream(testData);

var inputAsString = Convert.ToBase64String(inputStream.ToArray());
Console.WriteLine(inputAsString);

var outputStream = new MemoryStream(Convert.FromBase64String(inputAsString));

var result = BitConverter.ToString(outputStream.ToArray());           
Console.WriteLine(result);