Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/278.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# AES加密仅适用于磁盘上0字节大小的小文件_C#_Encryption_Cryptography_Aes - Fatal编程技术网

C# AES加密仅适用于磁盘上0字节大小的小文件

C# AES加密仅适用于磁盘上0字节大小的小文件,c#,encryption,cryptography,aes,C#,Encryption,Cryptography,Aes,我感兴趣的是,为什么加密/解密只能在磁盘文件上使用较小的0字节大小的文件,而停止使用较大的文件,这样会出现错误输入数据不是一个完整的块,并且索引超出了数组的范围。 我使用ECDiffieHellmancing在两侧生成相同的对称密钥。 在加密端交换密钥: 接收方交换: using (ECDiffieHellmanCng receivingMode = new ECDiffieHellmanCng()) { receivingMode.KeyDerivationFunction =

我感兴趣的是,为什么加密/解密只能在磁盘文件上使用较小的0字节大小的文件,而停止使用较大的文件,这样会出现错误
输入数据不是一个完整的块
,并且
索引超出了数组的范围


我使用ECDiffieHellmancing在两侧生成相同的对称密钥。

在加密端交换密钥:

接收方交换:

using (ECDiffieHellmanCng receivingMode = new ECDiffieHellmanCng())
{
     receivingMode.KeyDerivationFunction = ECDiffieHellmanKeyDerivationFunction.Hash;
     receivingMode.HashAlgorithm = CngAlgorithm.Sha256;
     receiversPublicKey = receivingMode.PublicKey.ToByteArray();

     CngKey secretKey = CngKey.Import(sendersPublicKey, CngKeyBlobFormat.EccPublicBlob);
     receiversKey = receivingMode.DeriveKeyMaterial(CngKey.Import(sendersPublicKey, CngKeyBlobFormat.EccPublicBlob));
     byte[] decryptedFile = new byte[50000000];
     Decryption(encryptedFile, ivFile, out decryptedFile); 
}
加密/解密方法:

private void Encryption(byte[] key, byte[] unencryptedMessage,out byte[] encryptedMessage, out byte[] iv)
{
     using (Aes aes = new AesCryptoServiceProvider())
     {
           aes.Key = key;
           iv = aes.IV;

           // Encrypt the message
           using (MemoryStream ciphertext = new MemoryStream())
           using (CryptoStream cs = new CryptoStream(ciphertext, aes.CreateEncryptor(), CryptoStreamMode.Write))
           {
               cs.Write(unencryptedMessage, 0, unencryptedMessage.Length);
               cs.Close();
               encryptedMessage = ciphertext.ToArray();
           }
      }
}

private void Decryption(byte[] encryptedMessage, byte[] iv, out byte[] decryptedMessage)
{
      using (Aes aes = new AesCryptoServiceProvider())
      {
           aes.Key = receiversKey;
           aes.IV = iv;
           // Decrypt the message
           using (MemoryStream decryptedBytes = new MemoryStream())
           {
                using (CryptoStream cs = new CryptoStream(decryptedBytes, aes.CreateDecryptor(), CryptoStreamMode.Write))
                {
                    cs.Write(encryptedMessage, 0, encryptedMessage.Length);
                    cs.Close();
                    decryptedMessage = decryptedBytes.ToArray();
                }
            }
       }
}

AES是一种分组密码,要求输入为块大小的倍数,AES为16字节。简单的解决方案是使用PKCS#7(née PKCS#5)填充选项,填充将在加密时透明地添加,在解密时删除

private void Encryption(byte[] key, byte[] unencryptedMessage,out byte[] encryptedMessage, out byte[] iv)
{
     using (Aes aes = new AesCryptoServiceProvider())
     {
           aes.Key = key;
           iv = aes.IV;

           // Encrypt the message
           using (MemoryStream ciphertext = new MemoryStream())
           using (CryptoStream cs = new CryptoStream(ciphertext, aes.CreateEncryptor(), CryptoStreamMode.Write))
           {
               cs.Write(unencryptedMessage, 0, unencryptedMessage.Length);
               cs.Close();
               encryptedMessage = ciphertext.ToArray();
           }
      }
}

private void Decryption(byte[] encryptedMessage, byte[] iv, out byte[] decryptedMessage)
{
      using (Aes aes = new AesCryptoServiceProvider())
      {
           aes.Key = receiversKey;
           aes.IV = iv;
           // Decrypt the message
           using (MemoryStream decryptedBytes = new MemoryStream())
           {
                using (CryptoStream cs = new CryptoStream(decryptedBytes, aes.CreateDecryptor(), CryptoStreamMode.Write))
                {
                    cs.Write(encryptedMessage, 0, encryptedMessage.Length);
                    cs.Close();
                    decryptedMessage = decryptedBytes.ToArray();
                }
            }
       }
}