Тройная дешифровка DES в классическом ASP?

#vbscript #asp-classic

#vbscript — файл #asp-классический #vbscript

Вопрос:

Как я могу расшифровать строку в классическом ASP / VBScript? Строка взята из php-приложения, которое использует шифрование 3DES.

Ответ №1:

У меня есть Javascript-реализация DES / TripleDES. Он поддерживает режимы CBC и ECB, а для заполнения поддерживает PKCS7, пробелы или нули. Он интегрирован с PBKDF2, совместимым с RFC2898, так что он может генерировать ключи шифрования и IV из паролей, если хотите. Вы также можете явно задать ключ шифрования и IV.

Его можно использовать при вызове непосредственно из Javascript — любого браузера, или из Rhino, или WScript.exe , или, может быть, ближе к вашему случаю, классический ASP с использованием Javascript.

Я также упаковал его как COM-компонент, поэтому его можно вызвать из любой COM-совместимой среды, такой как VBScript, работающий в классическом ASP, или Perl, или VBA, и т.д.

Это независимая реализация, которая полностью совместима с .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);
  

При вызове COM-компонента из VBScript это выглядит следующим образом:

 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       : " amp; decrypted
  

Шифрование выполняется довольно быстро, но генерация ключа — нет.


Редактировать:

вы также можете использовать содержимое Javascript DES в браузере.
вот пример: http://jsbin.com/oguye3

Комментарии:

1. Привет, Чизо, у тебя есть какая-нибудь рабочая ссылка для cheeso.members.winisp.net/srcview.aspx?dir=DES ?. Заранее спасибо

2. @NicoGrunfeld это недоступно на машине Wayback web.archive.org (там есть только страница, но нет ссылок на исходные файлы). Аналогичная реализация JavaScript находится здесь: web.archive.org/web/20151002201926/http://www.laynetworks.com /…

Ответ №2:

Я бы попробовал использовать CAPICOM от Microsoft. В комплект 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 Файлы (x86) Microsoft CAPICOM 2.1.0.2 SDKSampleshtmlEncryptedData.htm

Ответ №3:

Здесь есть тройная реализация JavaScript:http://www.tero.co.uk/des /. Он работает как JScript (классическая версия JavaScript от Microsoft для ASP, в основном ECMAScript 3), проверяется на PHP, поддерживает EBC и CBC, заполнение (нули, PKCS7 (багги) или пробелы), а также выполняет обычный DES. Вы можете использовать это на классической странице 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: " amp; key amp; vbCrLf
Response.Write "Message(length=" amp; Len(message) amp; "): " amp; message amp; vbCrLf
Response.Write "Encrypted 3DES ECB: " amp; stringToHex(encrypted) amp; vbCrLf
Response.Write "Decrypted 3DES ECB: " amp; 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: padding есть ошибка. Начальный if (padding == блок должен быть заключен в if (encrypt) {...} тест, а последние две строки des() следует заменить на:

   result  = tempresu<

  //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 resu<