【发布时间】:2018-04-26 21:06:56
【问题描述】:
如何在经典 ASP/VBScript 中解密字符串?该字符串来自使用 3DES 加密的 php 应用程序。
【问题讨论】:
标签: vbscript asp-classic
如何在经典 ASP/VBScript 中解密字符串?该字符串来自使用 3DES 加密的 php 应用程序。
【问题讨论】:
标签: vbscript asp-classic
我有一个 DES/TripleDES 的 Javascript 实现。它执行 CBC 和 ECB 模式,并且 填充支持 PKCS7、空格或零。它与符合 RFC2898 的 PBKDF2 集成,因此如果您愿意,它可以从密码生成加密密钥和 IV。您还可以显式设置加密密钥和 IV。
在直接从 Javascript 调用时可用 - 任何浏览器,或从 Rhino,或 WScript.exe,或者可能更接近您的情况,使用 Javascript 的经典 ASP。
我还把它打包成一个 COM 组件,因此可以从任何兼容 COM 的环境中调用它,例如在经典 ASP、Perl 或 VBA 等中运行的 VBScript。
它是一个独立的实现,与 .NET DESCryptoServiceProvider 和 TripleDESCryptoServiceProvider 完全兼容并可互操作。
在这里获取: http://cheeso.members.winisp.net/srcview.aspx?dir=DES
当直接从 Javascript 调用它时,它看起来像这样:
var pbkdf2 = new PBKDF2(password, salt, iterations);
var key = pbkdf2.deriveBytes(8); // use 24 for 3DES
var iv = pbkdf2.deriveBytes(8); // always 8 (==blocksize)
var des = new DES(key,iv);
var plaintext = "Hello. This is a test. of the emergency broadcasting system.";
var ciphertext = des.encrypt(plaintext);
当从 VBScript 调用 COM 组件时,它看起来像这样:
Dim des
set des = CreateObject("Ionic.Com.DES")
des.Password = "This is my password"
des.Mode = "CBC"
des.TripleDES = True
des.Rfc2898Iterations = 1000
Dim result
result = des.EncryptString(plainText)
Dim decrypted
decrypted = des.DecryptBytes(result)
WScript.echo "decrypted : " & decrypted
加密速度很快,但密钥生成速度却不快。
编辑:
您还可以在浏览器中使用 Javascript DES 的东西。
这是一个例子:http://jsbin.com/oguye3
【讨论】:
我会尝试使用 Microsoft 的 CAPICOM。 SDK 中包含一些示例,可助您一臂之力。
旧概览:
http://msdn.microsoft.com/en-us/library/ms995332.aspx
CAPICOM SDK:
http://www.microsoft.com/downloads/en/details.aspx?FamilyID=860ee43a-a843-462f-abb5-ff88ea5896f6
您要查看的示例位于我的机器上:
C:\Program Files (x86)\Microsoft CAPICOM 2.1.0.2 SDK\Samples\html\EncryptedData.htm
【讨论】:
这里有一个 TripleDES JavaScript 实现:http://www.tero.co.uk/des/。它作为 JScript(Microsoft 的经典 ASP 版本的 JavaScript,基本上是 ECMAScript 3)工作,针对 PHP 进行检查,支持 EBC 和 CBC,填充(零、PKCS7(错误)或空格),并且还执行普通 DES。您可以像这样在 Classic ASP VBScript 页面中使用它:
<%@ Language=VBScript %>
<script language="JScript" runat="server">
PASTE DES JAVASCRIPT SOURCE HERE, or include by adding src="..." in previous line
</script>
<%
key = "this is a 24 byte key !!"
message = "This is a test message."
' Use TripleDES (24-byte key) in ECB mode (0, Null iv) with 0 padding
encrypted = des(key, message, 1, 0, Null, 0)
decrypted = des(key, encrypted, 0, 0, Null, 0)
Response.Write "<PRE>"
Response.Write "Key: " & key & vbCrLf
Response.Write "Message(length=" & Len(message) & "): " & message & vbCrLf
Response.Write "Encrypted 3DES ECB: " & stringToHex(encrypted) & vbCrLf
Response.Write "Decrypted 3DES ECB: " & decrypted
Response.Write "</PRE>"
%>
导致:
Key: this is a 24 byte key !!
Message(length=23): This is a test message.
Encrypted 3DES ECB: 0x83af8c3f5507e100b182f90f5f5d834b085ca8439b35eee4
Decrypted 3DES ECB: This is a test message.
如果您使用 PKCS7 填充,请注意 JavaScript 中有一个错误:填充代码。最初的if (padding == 块应包含在if (encrypt) {...} 测试中,des() 的最后两行应替换为:
result += tempresult;
//when decrypting, remove padding for PKCS7 but leave space/zero padding (cannot be distinguished from real trailing spaces/zeroes)
if (!encrypt) {
if (padding == 1) {temp = result.charCodeAt(result.length-1); result = result.substring(0,result.length-temp);} //PKCS7 padding
}
//return the result as an array
return result;
【讨论】: