【问题标题】:Triple DES decryption in classic ASP?经典 ASP 中的三重 DES 解密?
【发布时间】:2018-04-26 21:06:56
【问题描述】:

如何在经典 ASP/VBScript 中解密字符串?该字符串来自使用 3DES 加密的 php 应用程序。

【问题讨论】:

    标签: vbscript asp-classic


    【解决方案1】:

    我有一个 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

    【讨论】:

    【解决方案2】:

    我会尝试使用 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

    【讨论】:

      【解决方案3】:

      这里有一个 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;
      

      【讨论】:

        猜你喜欢
        • 2012-05-06
        • 2015-03-30
        • 2011-10-22
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-06-22
        • 1970-01-01
        相关资源
        最近更新 更多