问题标签 [cryptostream]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
1 回答
127 浏览

c# - ReadAsync 正在清空流

所以,我让这段代码在客户端/服务器程序之间的通信上工作得很好。通信是通过一个字节缓冲区完成的,该缓冲区有两个元素,一个指定后面有多少字节的 int 和“有效负载”。如果我使用调试器单步执行并检查。当我的代码到达该行时

await cStream.ReadAsync(bytes, 0, 4);

如果我检查可用的字节数,它会显示 32。一旦我跨过这一行,它就会说可用的字节数为 0。如果我直接从 _stream(我的 TcpClient 的 NetworkStream)读取,那么代码就可以正常工作。

完整的代码是

0 投票
0 回答
41 浏览

c# - 如何在使用 CryptoStream 时抛出而不导致 CryptoGraphicException

我正在读取一个加密文件,并且想在密码不正确时抛出一个特定的错误。由于使用不正确的密码解密只会成功但返回乱码数据,我想确定密码是否正确。

我这样做的方法是向加密文件写入一个“魔法值”;假设我将值写入MaGiC文件。每当我解密文件时,我都会确保前 5 个字节包含MaGiC. 如果不是,用于解密文件的密码一定是错误的,所以我抛出一个InvalidPasswordException.

为简洁起见,我遗漏了很多东西(算法、密钥、IV、块大小、填充、模式等)。对于这种特殊情况,可能重要的是:我正在使用PKCS7填充(但我很确定所有填充都会导致所描述的问题)。

现在,在调用端,我编写了如下代码:

然而,令我惊讶的InvalidPasswordException是并没有被抓住;我确实得到了一个异常,但类型为CryptographicException填充无效,无法删除。.

当我调试问题时,我看到InvalidPasswordException被抛出。我也想我知道发生了什么InvalidPasswordException抛出,using导致CryptoStream被处理,并且CryptoStream确定由于我们不在流的末尾,剩下的必须是“填充”,然后导致异常。或者至少是类似的东西。

要“强制”抛出我的异常,我可以执行以下操作:

或者:

然而,我希望有一个更优雅的解决方案。有没有办法可以初始化CryptoStream不扔处置?还是一种CryptoStream干净地“关闭”而不扔的方法?我已经尝试过Close()Clear()等等,但是所有这些方法也导致CryptoGraphicExceptiontry { ... } catch { ... }在扔掉自己的InvalidPasswordException.

0 投票
1 回答
249 浏览

c# - C# PasswordDeriveBytes:似乎 Salt 无关紧要

可能我误解了什么。以下代码通过 CryptDeriveKey 使用两种不同的盐生成两个相等的密钥。

那是控制台结果:

盐1:21 3e 18 a3 9a 8b 5f

--> 关键 da 89 ea 3d 91 08 20 98 20 e9 dc 45 d5 97 10 7f 8f 4a 52 15 26 68 ef 83

salt2:9e 分贝 4c 2b 49 b4 24

--> 关键 da 89 ea 3d 91 08 20 98 20 e9 dc 45 d5 97 10 7f 8f 4a 52 15 26 68 ef 83

我的错误是什么?

0 投票
2 回答
277 浏览

c# - 内部 using 语句关闭后,外部 using 语句中声明的 MemoryStream 如何仍然可用?

Microsoft 文档在此页面上有以下代码:

https://docs.microsoft.com/en-us/dotnet/api/system.security.cryptography.cryptostream?view=netframework-4.7

最内部的“使用”语句假设 Dispose csEncrypt,而后者又假设 Dispose msEncrypt 流。但是,在最内部的 using 语句范围之后,msEncrypt 仍然存在并被使用(调用它的 ToArray())。

微软文档明确指出:“当 StreamWriter.Dispose 被调用时,StreamWriter 对象在提供的 Stream 对象上调用 Dispose()。”。后者意味着 csEncrypt 也被处置/关闭,这反过来又关闭了 msEncrypt ( https://referencesource.microsoft.com/#mscorlib/system/security/cryptography/cryptostream.cs,23052627697efb77CryptoStream 可以离开基础流打开?)。

然后请解释我们如何仍然可以调用“msEncrypt.ToArray();” 在最里面的 using 语句的范围结束之后?

0 投票
1 回答
65 浏览

vb.net - 在 FlushFinalBlock() 之后调用 Dispose() 函数?

我有以下代码:

在 Fortify 扫描后,他们报告我需要释放 cs CryptoStream 对象。

据我所知, FlushFinalBlock() 方法可以完成这项工作。

我也需要调用 disponse() 函数吗?或者可能是一个假阳性问题?

0 投票
1 回答
155 浏览

c# - 当文本少于 15 个字符时,将 CryptoStream 转换为 using 声明会使内存流为空

使用 C# 加密文本时遇到一个奇怪的问题。ReSharper(我同意)建议替换using此代码中的块:

到这个简化的(注意使用声明而不是块):

嗯..第一个效果很好,它能够加密文本。然而,第二个不起作用!theencryptedData是空的,因此它产生一个空的encryptedText

我看不出问题。为什么?


更新 1 感谢 Emanuel 的回答,只有当要加密的文本大于 15 个字符时,我才能使其工作。这真是奇怪。在 15 个字符以下,只有带有“老式” using 块的代码才能工作,而不是使用 using 声明的代码。

我在 Github 的这个示例 repo 中重现了这个问题。

即使这个问题与 AesManaged (我不知道)有关,为什么第一种方法会成功,而第二种方法对于任何 15 个或更少字符的文本会失败?

这是代码:

这是执行的结果:

0 投票
0 回答
187 浏览

c# - 如何将 CryptoStream 与 Span/ReadOnlySpan 一起使用?

大多数示例使用 MemoryStream 和 CryptoStream 来使用 RijndaelManaged 进行加密/解密,所以我尽可能地简化它,并最终使用以下函数来解密缓冲区。

它正在工作,但是我的应用程序现在正在处理很多 ReadOnlySpan,并且必须使用“ToArray()”分配一个新缓冲区才能加密/解密它们,这感觉很奇怪,因为大多数 Streams 现在都能够使用 Span in他们的 Read 和 Write 方法。

是否有与上述类似的方法(即使它需要更多步骤)允许在不分配额外缓冲区的情况下使用 CryptoStream?

0 投票
0 回答
268 浏览

c# - CryptoStream.Read 的数组边界错误

我有一个服务器/客户端系统,它加密服务器(python)上的图像并在客户端(c#)上解密它们。加密部分工作得很好,除了尝试解密几个块长的信息(例如,图像,而不是“Hello World”字符串)。

因此,当我尝试通过 CryptoStream 解密加密图像时 - 有时它可以工作,但由于某种原因 - 有时它不会。

这是图像的解密过程:

如果它有帮助,即使在执行以下操作时我也会遇到相同的错误:

这是用于加密的python代码:

例外

有时我会收到此错误:System.ArgumentException: Offset and length were out of bounds for the array or count is greater than the number of elements from index to the end of the source collection.

完整的堆栈跟踪:

注意Project.Crypto.DecryptBytesFromBytes是解密函数。

有谁知道它为什么会发生,我该如何解决?如果需要更多信息,请告诉我。

这是我在函数文档中找到的Read()

顺便说一句,我使用 CBC 模式和零填充。

我想澄清最后一件事——我做这整个过程只是为了我可以获取加密的字节,然后把它们变成解密的字节。如果有另一种方法可以在 c# 中将字节解密为字节,请告诉我。

0 投票
1 回答
102 浏览

c# - 无法解析压缩、加密、解密、解压流实现

我一直在与链式 using 语句作斗争,并且无法解决一长串实施问题中的最新问题。我需要压缩,然后加密生成的 IV 并将其附加到选定的文件中。这一切似乎都正常工作,但是我无法解除这个过程。在查看了几个类似的堆栈帖子和文章后,我仍然无法让它工作,现在正在寻求更直接的帮助。

最新抛出的错误是System.IO.InvalidDataException: 'Found invalid data while decoding.'解密流似乎没有按预期运行,这使解压缩流变得异常。

对于那些喜欢指出其他类似堆栈问题并在不提供支持的情况下投票关闭/复制的人,以下是我首先处理的线程和帖子,每个都没有成功。 https://docs.microsoft.com/en-us/dotnet/standard/security/walkthrough-creating-a-cryptographic-application https://docs.microsoft.com/en-us/dotnet/api/system.security .cryptography.rijndaelmanaged?redirectedfrom=MSDN&view=netcore-3.1 链接 GZipStream/DeflateStream 和 CryptoStream (AES) 在读取 DeflateStream/GZipStream 到 CryptoStream 时中断,反之亦然 https://docs.microsoft.com/en-us/dotnet/api/ system.io.compression.gzipstream?redirectedfrom=MSDN&view=netcore-3.1#code-snippet-2 如何修复“解码时发现无效数据”。 使用 C# 压缩/解压缩字符串

0 投票
1 回答
190 浏览

c# - “CryptoStream”的最佳重载没有名为“leaveOpen”的参数

cryptostream中有一个名为leaveOpen的变量,它在 **windows ** 中可用,但在xamarin中不可用。如果为 true,则流不会自动关闭。

在此处输入图像描述

在此处输入图像描述

所以我的问题是Xamarin中没有的论点。那么问题是什么,如何解决呢?我有很多选择,但我只想使用它。