Csharp/C#教程:在.Net中获取CryptoStream的长度分享


在.Net中获取CryptoStream的长度

我正在研究加密/解密文件的软件。 我希望能够在加密后猜测数据的长度,但我不能使用CryptoStream.Length(它会抛出NotSupportedException)。 有什么方法可以猜测吗?

我正在使用RijndaelManaged(.Net Framework 4.0)

这说明它比我更好https://www.obviex.com/Articles/CiphertextSize.aspx

从那里:

在最通用的情况下,密文的大小可以计算为:

CipherText = PlainText + Block – (PlainText MOD Block)

其中CipherText,PlainText和Block分别表示密文,明文和加密块的大小。 基本上,所得到的密文大小被计算为扩展到下一个块的明文的大小。 如果使用填充并且明文的大小是块大小的精确倍数,则将添加一个包含填充信息的额外块。

假设您要使用具有128位(16字节)块大小和PKCS#7填充的Rijndael加密算法来加密九位数的社会安全号码(SSN)。 (为了说明的目的,假设在加密之前从SSN值中删除破折号,以便“123-45-6789”变为“123456789”,并将该值视为字符串,而不是数字。)如果SSN中的数字定义为ASCII字符,则密文的大小可以计算为:

CipherText = 9 + 16 – (9 MOD 16)= 9 + 16 – 9 = 16(字节)

请注意,如果明文值的大小是块大小的精确倍数,则包含填充信息的额外块将附加到密文。 例如,如果要加密16位信用卡号(定义为16个字符的ASCII字符串),则密文的大小为:

CipherText = 16 + 16 – (16 MOD 16)= 16 + 16 – 0 = 32(字节)

这取决于你使用的密码…通常长度与原始流的长度相同…最坏的情况是它被填充到密码的块长度的倍数

这是我与RijndaelManaged的代码:

MemoryStream textBytes = new MemoryStream(); string password = @"myKey123"; // Your Key Here UnicodeEncoding UE = new UnicodeEncoding(); byte[] key = UE.GetBytes(password); FileStream fsInput = new FileStream(@"C:myEncryptFile.txt", FileMode.Open); RijndaelManaged RMCrypto = new RijndaelManaged(); CryptoStream cs = new CryptoStream(fsInput, RMCrypto.CreateDecryptor(key, key), CryptoStreamMode.Read); cs.CopyTo(textBytes); cs.Close(); fsInput.Close(); string myDecriptText = Encoding.UTF8.GetString(textBytes.ToArray()); 

您可以使用此函数来获取长度和数据。

上述就是C#学习教程:在.Net中获取CryptoStream的长度分享的全部内容,如果对大家有所用处且需要了解更多关于C#学习教程,希望大家多多关注—计算机技术网(www.ctvol.com)!

 public static int GetLength(CryptoStream cs, out byte[] data) { var bytes = new List(); int b; while ((b = cs.ReadByte()) != -1) bytes.Add((byte)b); data = bytes.ToArray(); return data.Length; } 

本文来自网络收集,不代表计算机技术网立场,如涉及侵权请联系管理员删除。

ctvol管理联系方式QQ:251552304

本文章地址:https://www.ctvol.com/cdevelopment/955608.html

(0)
上一篇 2021年11月21日
下一篇 2021年11月21日

精彩推荐