Tag: aes

RijndaelManaged的AES OFB加密

我需要通过OFB模式下的加密消息从C#应用程序通信到另一个应用程序。 我知道RijndaelManaged不支持AES OFB模式。 有没有比我更有经验的人知道使用OFB模式加密/解密的任何其他方法?

C#AES-128 CFB错误

我目前以这种方式设置RijndaelManaged(由于服务器如何处理加密,IV和Key是相同的)。 服务器也使用CFB8作为模式,我是否正确设置了它? public static RijndaelManaged GenerateAES(byte[] key) { RijndaelManaged cipher = new RijndaelManaged(); cipher.Mode = CipherMode.CFB; cipher.Padding = PaddingMode.None; cipher.KeySize = 128; cipher.Key = key; cipher.IV = key; return cipher; } 我这样写数据:ICryptoTransform e = GenerateAES(key).CreateEncryptor(); using(CryptoStream stream = new CryptoStream(BaseStream, e, CryptoStreamMode.Write)) { stream.WriteByte(b); stream.FlushFinalBlock(); } BaseStream是我打开的NetworkStream,’b’是我发送给我的函数的值。 当我尝试对流进行0x00(作为测试)时,我收到此错误: System.Security.Cryptography.CryptographicException: Length of the data to encrypt […]

Aes解密器给出空字符串

我有AES加密/解密的问题。 注释的代码工作,但有时给出错误“填充无效,无法删除”所以我更改它,因为它在这里解释填充无效,无法删除exception,而使用“AesManaged”解密字符串C# 但是当我尝试它时,解密过程中的代码会给出一个空字符串。 我不知道哪里弄错了。 两个静态函数bytesToString和stringToBytes与加密无关,我在其他地方使用它们。 密钥长度和块大小是OKAY。 我在debbuger中找到了这个: “’csEncrypt.Length’引发了’System.NotSupportedException’类型的exception” 我在3.5 .NET Visual STudio 2008上工作 这是来自调试器的prtscr,因为你可以看到离开块后加密的是0字节长,而cryptostream有一些例外 从调试器打印屏幕 怎么解决? 请给我一些线索。 static class Aes { public static string bytesToHexString(byte[] key) { return BitConverter.ToString(key).Replace(“-“, String.Empty); } public static byte[] stringToBytes(string key) { return Enumerable.Range(0, key.Length) .Where(x => x % 2 == 0) .Select(x => Convert.ToByte(key.Substring(x, 2), 16)) .ToArray(); } public […]

AES-Encrypt-then-MAC一个带.NET的大文件

我想在.NET中以最有效的方式加密大文件(比方说64 GB)。 我将如何实现这个: 创建AesManaged实例以加密文件流(读取64 GB) 将此流保存到磁盘(因为它在内存中保持较大)(写入64 GB) 创建HMACSHA512实例以计算保存文件的哈希值(读取64 GB) 使用iv将加密数据保存到磁盘(读写64 GB) 简化的C#代码: using (var aesManaged = new AesManaged()) { using (var msEncrypt = File.OpenWrite(@”C:\Temp\bigfile.bin.tmp”)) { using (var csEncrypt = new CryptoStream(msEncrypt, encryptor, CryptoStreamMode.Write)) { File.OpenRead(@”C:\Temp\bigfile.bin”).CopyTo(csEncrypt); new MemoryStream(iv).CopyTo(csEncrypt); } } } using (var hmac = new HMACSHA512(hmacKey)) { hmacHash = hmac.ComputeHash(File.OpenRead(@”C:\Temp\bigfile.bin.tmp”)); } byte[] headerBytes; using (var […]

AES解密失败,“填充无效,无法删除”

我正在使用Java编写的服务器进行跨平台应用程序,所以我最终使用C#for Windows。 我终于在这两种语言中克服了BigIntegers不同字节的所有障碍(Java:big endian,C#:little),所以我也成功地进行了密钥交换。 现在这就是问题所在,在Java中我使用AES/CBC/PKCS5Padding进行加密,但在C#中没有可用的PKCS5, 但正如我在其他post中读到的这个主题在SO上,PKCS7被告知与PKCS5相同或者Java确实使用PKCS7而不是PKCS5。 我不知道什么是正确的。 所以这是代码: using (System.Security.Cryptography.RijndaelManaged rijndael = new System.Security.Cryptography.RijndaelManaged()) { byte[] iv = new byte[16]; for (int i = 0; i < 16; i++) iv[i] = 0; rijndael.Padding = PaddingMode.PKCS7; rijndael.Mode = CipherMode.CBC; rijndael.Key = Sys.PrivateKey; rijndael.KeySize = 128; rijndael.BlockSize = 128; rijndael.IV = iv; Sys.LogWrite("Decrypt input bytes length: " […]

使用SharpAESCrypt加密字符串

我决定在C#中使用SharpAESCrypt AES加密实现。 根据他们的文档( https://www.aescrypt.com/sharp_aes_crypt.html ),您应该能够使用静态方法,提供密码字符串,纯文本输入流和输出流。 我从输出流中获得的数据似乎都是零。 我怀疑我做错了将字符串转换为流并返回。 任何人都可以看到下面代码明显错误的任何内容吗? (它编译并运行,但newByteArray最后填充0) private void encryptMemStream() { byte[] byteArray = Encoding.UTF8.GetBytes(DecryptedTB.Text); using (MemoryStream plainText = new MemoryStream(byteArray)) { using (MemoryStream encryptedData = new MemoryStream()) { //plainText.Write(byteArray, 0, byteArray.Length); SharpAESCrypt.Encrypt(PasswordTB.Text, plainText, encryptedData); encryptedData.Position = 0; byte[] newByteArray = new byte[encryptedData.Length]; newByteArray = encryptedData.ToArray(); EncryptedTB.Text = Encoding.UTF8.GetString(newByteArray); } } } 编辑:此代码的本机实现使用fileStreams,但它也应该与MemoryStreams一起使用。 […]

Rijndael填充错误

您好我正在尝试通过Rijaendal加密/解密字符串。 我根本无法弄清楚为什么解密会爆炸。 我总是以不正确的填充错误结束。 抛弃我的一件事是我的加密结果,我将其作为HEX数组返回。 它的长度为14个字节。 在我的解密函数中,相同的字节数组在从HEX转换时最终具有16个字节。 任何帮助,将不胜感激: using System; using System.Collections.Generic; using System.Linq; using System.Text; namespace rjandal { class Program { static void Main(string[] args) { string DataForEncrypting = “this is a test”; string key = string.Empty; string iv = string.Empty; using (System.Security.Cryptography.RijndaelManaged rmt = new System.Security.Cryptography.RijndaelManaged()) { rmt.KeySize = 256; rmt.BlockSize = 128; rmt.Mode […]

为我的AES方法创建一个字节数组的字符数是多少?

我在这里使用AES方法: http : //msdn.microsoft.com/en-us/library/system.security.cryptography.rijndaelmanaged.aspx 我想要一个字符串值,我将转换为字节数组并将其传递给AES加密方法。 字符串应该有多少个字符来生成方法所需的正确字节数组大小? static byte[] encryptStringToBytes_AES(string plainText, byte[] Key, byte[] IV) { // Check arguments. if (plainText == null || plainText.Length <= 0) throw new ArgumentNullException("plainText"); if (Key == null || Key.Length <= 0) throw new ArgumentNullException("Key"); if (IV == null || IV.Length <= 0) throw new ArgumentNullException("Key"); // Declare the stream […]

将IV添加到CryptoStream的开头

我正在现有的文件管理程序中实现本地加密。 我可以找到的大部分示例代码(如Microsoft)都演示了如何直接写入文件,但我需要做的是提供一个在程序中其他地方使用的流: CryptoStream GetEncryptStream(string filename) { var rjndl = new RijndaelManaged(); rjndl.KeySize = 256; rjndl.BlockSize = 256; rjndl.Mode = CipherMode.CBC; rjndl.Padding = PaddingMode.PKCS7; // Open read stream of unencrypted source fileStream: var fileStream = new FileStream(filename, FileMode.Open); /* Get key and iv */ var transform = rjndl.CreateEncryptor(key, iv); // CryptoStream in *read* mode: var cryptoStream […]

我应该如何为AES加密数据库条目派生密钥和初始化向量?

我已经构建了一个CMS系统,允许用户在我的客户端的Intranet应用程序上创建和管理在线表单。 当然,表单处理的一些数据可能需要加密,例如,如果系统用于构建处理工资细节或其他任何内容的表单。 所以我使用AESManaged类在进入我们的应用程序db之前对这种数据进行对称加密。 一切都很好,但现在,在发布之前,我可以做一个关于shared secret和salt的转向。 我最初的想法是通过将包含加密字段的Form的(基于GUID的)ID与问题的(再次,基于GUID的)ID相结合来创建(动态) shared secret ,该字段是以下答案: FormId:QuestionId 我的Salt目前以相同的方式生成,只有Guids顺序颠倒了。 QuestionID:FormID. 我是新手,所以不确定这是一个明智的策略,还是我应该以其他方式做到这一点?