如何从VBA在Excel 2010中创建安全的受密码保护的.xls文件

时间:2011-02-22 14:24:43

标签: excel vba encryption ms-office office-2010

我发现在Excel 2010(和2007)中,当您尝试选择一种更安全的加密类型时,它似乎默默地忽略您的设置,为您留下一个文件,可以在几秒钟内在{{ 3}}例如。

这不适用于默认情况下AES加密的新文件格式,只有当您保存为97-2003格式时才会这样。

这是我在工作簿中创建的宏:

Sub enc()
  Me.SetPasswordEncryptionOptions _
    PasswordEncryptionProvider:= "Microsoft Strong Cryptographic Provider", _
    PasswordEncryptionAlgorithm:= "RC4", _
    PasswordEncryptionKeyLength:=128, _
    PasswordEncryptionFileProperties:=True
  Me.SaveAs _
    Filename:="encryption_test.xls", _
    FileFormat:=xlExcel8, _
    Password:="password"
End Sub

通过省略FileFormat参数,可以很容易地使用这些加密设置将Excel 2003输出(正确)输出:

Sub enc()
  Me.SetPasswordEncryptionOptions _
    PasswordEncryptionProvider:= "Microsoft Strong Cryptographic Provider", _
    PasswordEncryptionAlgorithm:= "RC4", _
    PasswordEncryptionKeyLength:=128, _
    PasswordEncryptionFileProperties:=True
  Me.SaveAs _
    Filename:="encryption_test.xls", _
    Password:="password"
End Sub
然后

decryptum无法像我期望的那样解密。

我做错了什么或者这是一个错误?如果它是一个错误,我该如何解决它?

我在下面为Excel 2010添加了各种解决方案,但我希望能有更简单的东西,最好是适用于2007年的东西。

2 个答案:

答案 0 :(得分:8)

这是因为RC4未启用Office 2007/2010 - 您必须手动执行与管理模板完全相同的操作。

为了证明这一点,在Excel 2010中,执行上面的例程,然后打开“encryption_test.xls”文件并按 Alt + F11 转到VBE 。然后运行以下命令(按 Ctrl + G 首先打开立即窗口):

Sub CheckEncryption()
    Dim aw As Workbook: Set aw = ActiveWorkbook
    With aw
        Debug.Print .PasswordEncryptionAlgorithm
        Debug.Print .PasswordEncryptionFileProperties
        Debug.Print .PasswordEncryptionKeyLength
        Debug.Print .PasswordEncryptionProvider
    End With
End Sub

您可能会看到的值是1) Office Standard ,2) False ,3) 40 和4) 办公室。这意味着RC4没有被使用;加密默认为标准 - 和crummy / old - Excel加密。显然RC4被MSFT认为是非常糟糕的,所以在新的Office客户端中使用它有点蹒跚。

见这两篇文章:

脚注FileFormat例程的SaveAs部分不是此处的罪魁祸首。它只是在做CryptoAPI告诉它要做的事情。实际上,从Excel 2010 VBA开始,您可以使用Excel 2003的SaveAs,它稍有不同,并没有什么区别(从Excel 2010开始,它是一个可以像ActiveWorkbook.[_SaveAs] Filename:="encryption_test.xls", Password:="password"一样访问的隐藏例程。)

答案 1 :(得分:3)

Office 2010的解决方法:

  1. 添加office 2010管理模板(office14.adm)
  2. 编辑“用户配置\管理模板\ Microsoft Office 2010 \安全设置\加密密码保护的Office 97-2003文件的加密类型”到“Microsoft Strong Cryptographic Provider,RC4,128”(不带引号)