当前位置: 首页 > news >正文

C# 加密和解密 PDF:设置密码、AES 加密及操作权限

文章目录

    • PDF 加密包含哪些内容
      • 用户密码
      • 所有者密码
      • 加密算法
      • 文档权限
    • 安装 PDF 处理库
    • 使用 C# 加密 PDF
    • 设置 PDF 操作权限
    • 不设置打开密码,仅限制 PDF 权限
    • 使用 C# 解密 PDF
    • 处理密码错误
    • 判断 PDF 是否受密码保护
    • 使用时需要注意的问题
      • 不要将生产密码直接写在代码中
      • 用户密码和所有者密码不要相同
      • 加密前保留原始文件
      • PDF 权限不能替代完整的数据保护
    • 总结

PDF 常用于保存合同、财务报表、项目资料和内部文件。对于包含敏感信息的文档,仅限制文件下载或存放位置往往不够,还需要直接对 PDF 设置密码和访问权限。

PDF 加密通常可以实现以下功能:

  • 设置文档打开密码
  • 设置权限管理密码
  • 限制打印、复制和编辑
  • 使用 AES 等算法加密文档内容
  • 移除 PDF 密码和权限限制

本文将通过 C# 示例介绍如何加密和解密 PDF,并演示密码设置、加密算法选择和文档权限控制。

PDF 加密包含哪些内容

在编写代码之前,需要先了解 PDF 加密中的几个基本概念。

用户密码

用户密码也称为打开密码。

设置用户密码后,用户必须输入正确密码才能打开并查看 PDF。它主要用于控制文档的访问权限。

所有者密码

所有者密码也称为权限密码。

它主要用于管理 PDF 的打印、复制、编辑、批注和表单填写等操作权限。拥有所有者密码的用户通常可以更改或移除这些限制。

在实际使用中,用户密码和所有者密码应设置为不同的值。

加密算法

PDF 常见的加密算法包括 RC4 和 AES。

加密算法常见密钥长度适用场景
RC440 位、128 位兼容较旧的 PDF 软件
AES128 位、256 位常规业务文档和敏感文件
AES-256256 位对安全性要求较高的文档

对于新项目,通常优先选择 AES-256。只有在需要兼容旧版 PDF 阅读器或历史系统时,才考虑使用 RC4。

文档权限

除了设置打开密码,还可以限制用户打开 PDF 后执行的操作,例如:

  • 是否允许打印
  • 是否允许复制内容
  • 是否允许修改文档
  • 是否允许填写表单
  • 是否允许添加批注

需要注意的是,PDF 权限主要依赖阅读器软件执行。它可以限制常规的打印、复制和编辑操作,但无法彻底阻止截图、拍照或通过其他工具提取内容。

安装 PDF 处理库

下面的示例使用 Spire.PDF for .NET 处理 PDF 加密、权限设置和解密。

可以通过 NuGet 安装:

Install-PackageSpire.PDF

安装完成后,在代码中引入相关命名空间:

usingSpire.Pdf;usingSpire.Pdf.Security;

使用 C# 加密 PDF

下面的示例为 PDF 设置用户密码和所有者密码,使用 AES-256 加密,并禁止打印和复制内容。

usingSpire.Pdf;usingSpire.Pdf.Security;namespaceEncryptPdf{internalclassProgram{staticvoidMain(){PdfDocumentpdf=newPdfDocument();try{// 加载原始 PDFpdf.LoadFromFile("sample.pdf");// 设置用户密码和所有者密码PdfSecurityPolicysecurityPolicy=newPdfPasswordSecurityPolicy("user123","owner456");// 使用 AES-256 加密securityPolicy.EncryptionAlgorithm=PdfEncryptionAlgorithm.AES_256;// 默认允许所有操作securityPolicy.DocumentPrivilege=PdfDocumentPrivilege.AllowAll;// 禁止打印和复制内容securityPolicy.DocumentPrivilege.AllowPrint=false;securityPolicy.DocumentPrivilege.AllowContentCopying=false;// 应用加密策略pdf.Encrypt(securityPolicy);// 保存加密后的 PDFpdf.SaveToFile("EncryptedPDF.pdf",FileFormat.PDF);}finally{pdf.Dispose();}}}}

运行代码后,将生成EncryptedPDF.pdf

打开该文件时,需要输入用户密码user123。文档可以正常查看,但打印和复制操作会受到限制。

设置 PDF 操作权限

PDF 操作权限由PdfDocumentPrivilege控制。

常用属性如下:

属性作用
AllowPrint是否允许打印
AllowContentCopying是否允许复制内容
AllowModifyContents是否允许修改文档
AllowFillFormFields是否允许填写表单
AllowAll允许所有操作
ForbidAll禁止所有受控操作

例如,允许打印和填写表单,但禁止复制和修改内容:

securityPolicy.DocumentPrivilege=PdfDocumentPrivilege.AllowAll;securityPolicy.DocumentPrivilege.AllowContentCopying=false;securityPolicy.DocumentPrivilege.AllowModifyContents=false;

如果希望用户只能查看文档,可以禁止所有受控操作:

securityPolicy.DocumentPrivilege=PdfDocumentPrivilege.ForbidAll;

具体权限应根据文档用途设置。例如,电子表单通常需要允许填写表单字段,而内部只读资料则可以限制打印、复制和修改。

不设置打开密码,仅限制 PDF 权限

有些 PDF 不需要在打开时输入密码,只需要限制打印、复制或编辑。

这种情况下,可以将用户密码设置为空字符串,只保留所有者密码。

usingSpire.Pdf;usingSpire.Pdf.Security;namespaceRestrictPdfPermissions{internalclassProgram{staticvoidMain(){PdfDocumentpdf=newPdfDocument();try{pdf.LoadFromFile("sample.pdf");PdfSecurityPolicysecurityPolicy=newPdfPasswordSecurityPolicy(string.Empty,"owner456");securityPolicy.EncryptionAlgorithm=PdfEncryptionAlgorithm.AES_256;securityPolicy.DocumentPrivilege=PdfDocumentPrivilege.AllowAll;securityPolicy.DocumentPrivilege.AllowPrint=false;securityPolicy.DocumentPrivilege.AllowContentCopying=false;pdf.Encrypt(securityPolicy);pdf.SaveToFile("RestrictedPDF.pdf",FileFormat.PDF);}finally{pdf.Dispose();}}}}

生成的RestrictedPDF.pdf可以直接打开,但打印和复制功能会受到限制。

使用 C# 解密 PDF

解密 PDF 时,需要使用正确密码加载文件,然后移除加密设置。

如果需要同时移除操作权限限制,通常应使用所有者密码加载 PDF。

usingSpire.Pdf;namespaceDecryptPdf{internalclassProgram{staticvoidMain(){PdfDocumentpdf=newPdfDocument();try{// 使用所有者密码加载 PDFpdf.LoadFromFile("EncryptedPDF.pdf","owner456");// 移除加密和权限限制pdf.Decrypt();// 保存解密后的文件pdf.SaveToFile("DecryptedPDF.pdf",FileFormat.PDF);}finally{pdf.Dispose();}}}}

运行后生成的DecryptedPDF.pdf不再需要输入密码,原有的打印和复制限制也会被移除。

处理密码错误

当密码错误、文件损坏或加密方式不受支持时,加载 PDF 可能会抛出异常。

可以使用try-catch进行处理:

usingSystem;usingSpire.Pdf;namespaceDecryptPdf{internalclassProgram{staticvoidMain(){PdfDocumentpdf=newPdfDocument();try{pdf.LoadFromFile("EncryptedPDF.pdf","wrongPassword");pdf.Decrypt();pdf.SaveToFile("DecryptedPDF.pdf");}catch(Exceptionex){Console.WriteLine($"PDF 解密失败:{ex.Message}");}finally{pdf.Dispose();}}}}

在实际应用中,可以记录完整异常信息,但面向最终用户时,建议只显示简洁提示,例如:

密码错误,或者无法读取该 PDF 文件。

判断 PDF 是否受密码保护

在加载 PDF 之前,可以先判断文件是否设置了密码保护:

usingSystem;usingSpire.Pdf;namespaceCheckPdfProtection{internalclassProgram{staticvoidMain(){stringfilePath="sample.pdf";boolisProtected=PdfDocument.IsPasswordProtected(filePath);Console.WriteLine(isProtected?"PDF 已设置密码保护":"PDF 未设置密码保护");}}}

这一方法适合用于批量处理程序,根据检测结果决定使用普通方式加载,还是使用密码加载。

使用时需要注意的问题

不要将生产密码直接写在代码中

示例中为了便于演示,将密码直接写在代码里。实际项目中,密码更适合从以下位置读取:

  • 环境变量
  • 加密配置文件
  • 用户输入
  • 密钥管理服务
  • 企业内部凭据系统

同时,应避免将密码输出到日志中。

用户密码和所有者密码不要相同

用户密码用于打开文件,所有者密码用于管理文档权限。

如果两个密码完全相同,知道打开密码的用户也可能获得更高权限。因此,所有者密码通常应设置得更复杂,并由文档管理员保管。

加密前保留原始文件

建议将加密结果保存为新文件,而不是直接覆盖原始 PDF。

例如:

sample.pdf EncryptedPDF.pdf

这样可以避免因密码配置错误、兼容性问题或文件损坏导致原始文档无法恢复。

PDF 权限不能替代完整的数据保护

禁止打印和复制只能限制常规操作,无法防止截图、拍照或 OCR 识别。

对于敏感程度较高的文档,可以结合水印、数字签名、下载控制和访问审计等措施。

总结

使用 C# 可以完成 PDF 的常见安全处理,包括:

  • 设置打开密码和所有者密码
  • 使用 AES-256 加密 PDF
  • 限制打印、复制和修改
  • 创建无需打开密码但带权限限制的 PDF
  • 移除 PDF 密码和权限设置
  • 判断 PDF 是否受密码保护

实际项目中,还需要根据文档用途选择合适的权限,并重点处理密码存储、异常处理和原始文件备份问题。

http://www.jsqmd.com/news/1304929/

相关文章:

  • AG-Grid实战:从基础配置到高级功能,打造高性能企业级表格
  • 基于51单片机的电压表系统设计与实现:TLC1543 ADC与LCD1602显示
  • DLSS Swapper终极指南:3分钟学会智能切换DLSS版本,免费提升游戏性能
  • ai免费写论文实用吗?实测3款AI写作辅助平台,结果有好有坏!
  • 豆包知识问答配置失效?92%的团队踩中这4类语义对齐盲区,立即自查!
  • codex cli 源码教程 | 第一篇:Codex CLI 不只是一个 CLI
  • 深入理解 Linux 匿名管道:从进程间通信到内核级实现
  • 西门子840D/828D数控系统数据采集方案:OPC UA、NC变量与PLC通讯实战
  • 连锁酒店中央热水机组选什么牌子靠谱?:【芬尼】恒温续航 - 松梢月冷
  • Cursor Free VIP终极指南:5个简单步骤永久免费使用AI编程助手
  • C语言学习笔记(十)——指针基础与数组指针应用
  • 什么是三维数字沙盘?
  • 人害怕未知:本质是不知道下一步在哪里。
  • 豆包多轮意图漂移难题如何破局:从BERT-Whitening到动态对话图谱的5阶演进路径
  • 串口通信实战:从硬件连接到协议设计,打通电脑间数据传输
  • 进程间通信(IPC)核心机制解析与实战选型指南
  • 亲测合规\踩雷,体制内写稿效率翻倍
  • Verilog异或运算实战:格雷码、奇偶校验与奇数分频
  • 什么是 CSS?
  • 毕业论文终检前夕,如何快速搞定高重灾区与AI嫌疑句?
  • 一个人做多个公众号矩阵:如何优雅地规避平台的“一锅端”风险?
  • 2026年ES柜源头实力工厂甄选:五折柜/电控柜/控制柜/配电柜供应厂家全解析 - 优企名品
  • 【新闻】687个!本周艾为官网新增6个应用方案
  • 彻底解决Python文件读取UnicodeDecodeError:从编码原理到实战方案
  • 电机控制技术解析:从FOC到DTC,深入理解磁场定向与直接转矩控制
  • 醴陵市外墙漏水怎么处理_2026湖南东部湘东丘陵城市漏水维修流程教程与精选 - 雨婺虹房屋维修
  • 2026年聚醚消泡剂厂家实力排行榜,水性涂料/发酵/工业清洗专用聚醚消泡剂源头工厂精选推荐! - 优企名品
  • 如何在Obsidian中轻松管理电子表格?终极Excel插件完全指南
  • DedeCMS文件上传漏洞深度修复:从代码加固到服务器防线的三层防御方案
  • 8月更新:ChatGPT Pro、Plus 与 Codex 如何改变软件产品从想法到落地的速度(GPT-5.6与AI产品工程技术分享)