我有几个加密的文件,使用的是PowerShell脚本,使用的是ConvertTo-SecureString,使用的AES-256如下所示:

$secretKey = "thisIsAnExampleButNotTheRealKey2"
$cleBytes = [System.Text.Encoding]::UTF8.GetBytes($secretKey)
$aes = New-Object System.Security.Cryptography.AesCryptoServiceProvider
$aes.Key = $cleBytes
$aes.GenerateIV()
$texteBytes = [System.Text.Encoding]::UTF8.GetBytes($texteAChiffrer)
$chiffreBytes = $aes.CreateEncryptor().TransformFinalBlock($texteBytes, 0, $texteBytes.Length)
$cryptedText = [Convert]::ToBase64String($chiffreBytes)
Write-Output "encrypted Text: $cryptedText"

在我的C#应用程序中,我必须解密这些文件. 我使用这个方法:

public static string UncryptAES(string cryptedText, byte[] key, byte[] initVector)
{
  using (Aes aes算法 = Aes.Create())
  {
    aes算法.Key = key;
    // how to compute the initVector instead of passing it as a parameter?
    aes算法.IV = initVector;
    ICryptoTransform decryptor = aes算法.CreateDecryptor(aes算法.Key, aes算法.IV);

    using (var msDecrypt = new MemoryStream(Convert.FromBase64String(cryptedText)))
    {
      using (var csDecrypt = new CryptoStream(msDecrypt, decryptor, CryptoStreamMode.Read))
      {
        using (var srDecrypt = new StreamReader(csDecrypt))
        {
          return srDecrypt.ReadToEnd();
        }
      }
    }
  }
}

我了解到,初始向量在加密完成后由PowerShell以随机数的形式生成,并与加密数据一起存储. 如何计算初始向量?

推荐答案

ixe013's helpful answer非常相似的另一种方法是将IV和加密的字节数组连接起来,并将新的字节数组转换为base64:

$cryptedText = [Convert]::ToBase64String($aes.IV + $chiffreBytes)

然后,您可以使用与this answer中完全相同的方法,就我个人而言,我将使用ArraySegment<T>Span<T>和一些newer C#功能,如simple using statement:

using System;
using System.IO;
using System.Security.Cryptography;
using System.Text;

public static class DecryptClass
{
    public static string UncryptAES(string cryptedText, byte[] key)
    {
        // Can use `Span<T>` here instead if .NET Core 2.1+ and C# 7.2+
        // Span<byte> span = Convert.FromBase64String(cryptedText);
        ArraySegment<byte> segment = Convert.FromBase64String(cryptedText);
        using Aes aes = Aes.Create();
        aes.IV = segment.Slice(0, 16).ToArray();
        aes.Key = key;
        using MemoryStream mem = new();
        using (CryptoStream cryptoStream = new(mem, aes.CreateDecryptor(), CryptoStreamMode.Write))
        using (BinaryWriter writer = new(cryptoStream))
        {
            writer.Write(segment.Slice(16).ToArray(), 0, segment.Count - 16);
        }
        return Encoding.UTF8.GetString(mem.ToArray());
    }
}

Csharp相关问答推荐

Rx.Net -当关闭序列被触发时如何聚合消息并发出中间输出?

错误401未授权ASP.NET Core.使用JWT创建身份验证/授权

FileStream. FlushAsync()是否确保文件被写入磁盘?

安装附加的. exe与Visual Studio

SortedSet.Remove()不会删除SortedSet.Min返回的元素

获取具有AutoFaces的所有IOptions对象的集合

使用预定义对象减少Task.Run/Factory.StartNew中的关闭开销

异步实体框架核心查询引发InvalidOperation异常

反序列化私有成员

如何使用MailKit删除邮箱?

在C#.NET项目中启动时,如何等待提升的PowerShell进程退出?

WinUI 3中DoubleCollection崩溃应用程序类型的依赖属性

{ or ; expected error如何解决此问题

如何消除Visual Studio错误,因为它不识别集合表达式的新C#12语法?

仅在ASP.NETCore应用程序中的附加单独端口上公开一组终结点

SharpZipLib在文件名前加上目录名,生成tar.gz

如何在Cake脚本中设置MSBuild.exe的绝对路径

在Unity C#中按键点击错误的参数

使用免费的DotNet库从Azure函数向Azure文件共享上的现有Excel文件追加行

.NET6最小API:操作.MapGet之后的响应