我发现在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年的东西。
答案 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的解决方法: