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

6
我发现在Excel 2010(和2007)中,当您尝试选择更安全的加密类型时,它似乎会默默地忽略您的设置,让您得到一个可以在几秒钟内破解的文件,例如decryptum
这不适用于默认使用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个回答

6
由于Office 2007/2010未启用RC4,您需要手动执行管理员模板中所做的操作。为了证明这一点,在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)Office。这意味着由于未使用RC4,加密默认为标准的、低劣的Excel加密。显然,MSFT也认为RC4非常糟糕,因此在较新的Office客户端中对其使用进行了一些限制。
请参阅以下两篇文章: :在SaveAs例程中,FileFormat并不是罪魁祸首。它只是按照CryptoAPI的指示执行操作。实际上,在Excel 2010 VBA中,您可以使用与Excel 2003略有不同的SaveAs方法而不会产生任何影响(从Excel 2010开始,这是一个隐藏的例程,可以像ActiveWorkbook.[_SaveAs] Filename:="encryption_test.xls", Password:="password"这样访问)。

“你需要手动完成与管理模板完全相同的操作” - 我该怎么做?是否可以通过VBA手动完成? - user533832
1
+1 因为您的评论很有信息量 - 但我仍然希望得到一个比我的实现更简单的答案。例如,仅涉及 HKLM 注册表设置的解决方案将比在我们办公室的每台计算机上安装此管理模板要容易得多(而且我不确定是否可以在 DC 上执行此操作,因为它是 Windows 2000 域)。 - user533832
从decryptum收到的错误是**错误:[抱歉,您上传的文件由Microsoft Strong Cryptographic Provider加密,不受支持。]**请注意,我使用的Excel 2007中的例程是第二个(没有FileFormat:=xlExcel8)。 - Todd Main
1
思考为什么这个操作在你那里失败了,Jack。我认为原因是你在设置加密时,工作簿仍然是xslx格式。首先用“另存为”将其保存为xsl格式,然后设置加密,再设置密码,最后再保存一次。这应该能正常运行。 - Todd Main
显示剩余7条评论

3

Office 2010 的解决方法:

  1. 添加 Office 2010 行政模板 (office14.adm)
  2. 编辑 "用户配置\Administrative Templates\Microsoft Office 2010\Security Settings\Encryption type for password protected Office 97-2003 files" ,将其修改为 "Microsoft Strong Cryptographic Provider,RC4,128" (不包括引号)

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接