在Windows操作系统中,加密文件系统(EFS)是一项内置的文件加密功能,能够对NTFS分区上的文件进行加密,只有拥有对应私钥的用户才能解密访问。C#可以通过调用Windows提供的原生API来实现对EFS文件的编程式加密与解密操作,无需依赖第三方库。
EFS操作的核心API说明
Windows系统提供了两个核心函数用于EFS文件操作,分别是EncryptFile和DecryptFile,这两个函数属于advapi32.dll动态链接库,我们需要通过平台调用(P/Invoke)技术在C#中声明这两个函数。
函数声明要求
两个函数的参数和返回值定义如下:
- EncryptFile:接收一个字符串参数表示文件路径,返回布尔值表示操作是否成功,失败时可通过
Marshal.GetLastWin32Error()获取错误码 - DecryptFile:参数和返回值规则与EncryptFile一致,用于解密已经被EFS加密的文件
C#实现文件加密操作
首先需要在C#类中声明这两个外部函数,之后就可以直接调用实现加密功能。
函数声明代码
using System;
using System.Runtime.InteropServices;
public class EfsFileHelper
{
// 声明加密文件API
[DllImport("advapi32.dll", SetLastError = true, CharSet = CharSet.Auto)]
private static extern bool EncryptFile(string filePath);
// 声明解密文件API
[DllImport("advapi32.dll", SetLastError = true, CharSet = CharSet.Auto)]
private static extern bool DecryptFile(string filePath);
}
加密文件实现方法
封装加密方法,同时处理操作异常和错误提示:
public class EfsFileHelper
{
[DllImport("advapi32.dll", SetLastError = true, CharSet = CharSet.Auto)]
private static extern bool EncryptFile(string filePath);
[DllImport("advapi32.dll", SetLastError = true, CharSet = CharSet.Auto)]
private static extern bool DecryptFile(string filePath);
/// <summary>
/// 加密指定路径的文件
/// </summary>
/// <param name="filePath">要加密的文件完整路径</param>
/// <returns>操作是否成功</returns>
public static bool EncryptFileByEfs(string filePath)
{
try
{
// 调用系统API加密文件
bool result = EncryptFile(filePath);
if (!result)
{
// 获取操作失败的错误码
int errorCode = Marshal.GetLastWin32Error();
throw new Exception($"文件加密失败,错误码:{errorCode}");
}
return true;
}
catch (Exception ex)
{
Console.WriteLine($"加密文件时发生异常:{ex.Message}");
return false;
}
}
}
C#实现文件解密操作
解密操作的实现逻辑和加密类似,直接调用DecryptFile函数即可,同样需要处理错误情况。
public class EfsFileHelper
{
[DllImport("advapi32.dll", SetLastError = true, CharSet = CharSet.Auto)]
private static extern bool EncryptFile(string filePath);
[DllImport("advapi32.dll", SetLastError = true, CharSet = CharSet.Auto)]
private static extern bool DecryptFile(string filePath);
/// <summary>
/// 解密指定路径的EFS加密文件
/// </summary>
/// <param name="filePath">要解密的文件完整路径</param>
/// <returns>操作是否成功</returns>
public static bool DecryptFileByEfs(string filePath)
{
try
{
bool result = DecryptFile(filePath);
if (!result)
{
int errorCode = Marshal.GetLastWin32Error();
throw new Exception($"文件解密失败,错误码:{errorCode}");
}
return true;
}
catch (Exception ex)
{
Console.WriteLine($"解密文件时发生异常:{ex.Message}");
return false;
}
}
}
调用示例与注意事项
实际调用时只需要传入文件的完整路径即可,以下是调用示例:
class Program
{
static void Main(string[] args)
{
string targetFile = @"C:testdata.txt";
// 加密文件
bool encryptSuccess = EfsFileHelper.EncryptFileByEfs(targetFile);
Console.WriteLine($"加密结果:{encryptSuccess}");
// 解密文件
bool decryptSuccess = EfsFileHelper.DecryptFileByEfs(targetFile);
Console.WriteLine($"解密结果:{decryptSuccess}");
}
}
操作注意事项
- EFS仅支持NTFS文件系统的分区,FAT32分区无法使用此功能
- 执行加密解密操作的用户需要有对应文件的控制权限,否则会操作失败
- 加密后的文件只有加密者本人和具备恢复代理权限的用户可以解密,其他用户无法访问
- 如果文件已经被加密,再次调用加密函数不会重复加密,系统会自动忽略该操作
- 网络路径上的文件如果所在服务器支持EFS,也可以进行加密操作,但需要对应的访问权限
常见错误码说明
操作失败时可以通过错误码判断具体原因,以下是常见错误码的含义:
| 错误码 | 含义说明 |
|---|---|
| 5 | 访问被拒绝,当前用户没有操作该文件的权限 |
| 2 | 指定的文件路径不存在 |
| 87 | 参数错误,通常是传入的文件路径格式不正确 |
| 1359 | 当前分区不是NTFS格式,不支持EFS操作 |
C#EFS文件加密文件解密EncryptFile修改时间:2026-07-03 07:36:53