significa seguridad que funciona esquema encriptar desencriptar como claves caracteristicas algoritmo asp-classic vbscript aes rijndael rfc2898

asp-classic - seguridad - que significa aes



¿Cómo encriptar en VBScript usando AES? (6)

Alguien escribió un breve tutorial sobre el uso de AES es VBScript: http://www.example-code.com/vbscript/AesIv.asp

El módulo mencionado en ese tutorial se puede encontrar en: http://www.chilkatsoft.com/refdoc/xChilkatCrypt2Ref.html

Estoy buscando encriptar algunos datos usando Rijndael / AES en VBScript usando una clave específica y un valor IV . ¿Hay alguna buena biblioteca de funciones o componentes COM que sería bueno usar?

Miré a CAPICOM ; solo permite una frase de contraseña, y no permitirá establecer claves específicas ni valores IV.


Una opción sería crear una clase contenedora simple en .NET para la clase RijndaelManaged de .NET framework y exponerla a través de COM Interop para que pueda llamarla desde VBScript.


Una respuesta sugirió ajustar la clase RijndaelManaged en COM. También podría incluir alguna otra implementación de AES en COM. Acabo de probar SlowAES , que es una implementación de JavaScript de AES. Envolverlo en COM a través de un Componente de Windows Script lo hace invocable desde VBScript. Yo recomendaría esto solo si no puedes usar el enfoque .NET; Yo diría que el AES para .NET será más rápido que el AES implementado en JavaScript.

En mis pruebas de los COM-wrapped-SlowAEs, utilicé el modo CBC, y el cifrado era completamente compatible con la clase RijndaelManaged en .NET.

Aquí está la CSM; Dejé fuera los 3 archivos .js proporcionados por SlowAES. Debe insertarlos sin cambios donde marqué el archivo.

<?xml version="1.0"?> <!-- // // Ionic.COM.SlowAES.wsc // // This is a Windows Script Component that exposes the SlowAES // encryption engine via COM. This AES can be used from any // COM-capable environment, including Javascript or VBScript. // // // This code is licensed under the Microsoft Public License. See the // accompanying License.txt file for details. // // Copyright 2009 Dino Chiesa // --> <package> <component id="Ionic.Com.SlowAES"> <comment> SlowAES is a Javascript implementation of AES. See http://code.google.com/p/slowaes. This is a COM package for SlowAES. </comment> <?component error="true" debug="true"?> <registration description="WSC Component for SlowAES" progid="Ionic.Com.SlowAES" version="1.00" classid="{ba78383f-1bcc-4df6-9fb9-61cd639ebc94}" remotable="False"> <!-- boilerplate registration/unregistration logic --> <script language="VBScript"> <![CDATA[ strComponent = "Ionic SlowAES" Function Register MsgBox strComponent & " - registered." End Function Function Unregister MsgBox strComponent & " - unregistered." End Function ]]> </script> </registration> <public> <method name="EncryptString"> <parameter name="plainText"/> </method> <method name="DecryptBytes"> <parameter name="cipherText"/> </method> <method name="DecryptBytesToString"> <parameter name="cipherText"/> </method> <method name="DecryptHexString"> <parameter name="hexStringCipherText"/> </method> <method name="DecryptCommaDelimitedStringToString"> <parameter name="cipherText"/> </method> <property name="Key"> <put/> </property> <property name="Mode"> <put/> <get/> </property> <property name="IV"> <put/> <get/> </property> <property name="KeySize"> <put/> <get/> </property> </public> <script language="JavaScript"> <![CDATA[ // ...insert slowAES code here... // // defaults var _keysize = slowAES.aes.SIZE_128; var _mode = slowAES.modeOfOperation.CBC; var _iv = [0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0]; var _key; /* * byteArrayToHexString * convert a byte array to hex string. */ function byteArrayToHexString(a) { try { hexcase } catch(e) { hexcase=0; } var hex_tab = hexcase ? "0123456789ABCDEF" : "0123456789abcdef"; var r= ""; for (var i = 0; i < a.length; i++) { var b = hex_tab.charAt((a[i] >> 4) & 0x0F) + hex_tab.charAt(a[i] & 0x0F); r+= b; } return r; } /* * hexStringToByteArray * convert a string of hex byts to a byte array */ function hexStringToByteArray(s) { var r= Array(s.length/2); for (var i = 0; i < s.length; i+=2) { r[i/2] = parseInt(s.substr(i,2),16); } return r; } function EncryptString(plainText) { var bytesToEncrypt = cryptoHelpers.convertStringToByteArray(plainText); var result = slowAES.encrypt(bytesToEncrypt, _mode, _key, _keysize, _iv); return result[''cipher'']; } function DecryptBytesToString(cipherText) { var d = DecryptBytes(cipherText); var s = cryptoHelpers.convertByteArrayToString(d); s[cipherText.length]= 0; return s; } function DecryptHexString(hexStringCipherText) { var cipherText = hexStringToByteArray(hexStringCipherText); return DecryptBytesToString(cipherText); } function DecryptCommaDelimitedStringToString(cipherText) { var c = []; var atoms = cipherText.split(","); for (i=0; i < atoms.length; i++) { c.push(parseInt(atoms[i], 10)); } var d = DecryptBytes(c); return cryptoHelpers.convertByteArrayToString(d); } function DecryptBytes(cipherText) { if (cipherText == undefined) return null; var originalSize = cipherText.length; var result = slowAES.decrypt(cipherText, originalSize, _mode, _key, _keysize, _iv); return result; } function put_Key(keyString) { _key = hexStringToByteArray(keyString); } function put_KeySize(size) { if (size == 128) _keysize = slowAES.aes.keySize.SIZE_128; else if (size == 192) _keysize = slowAES.aes.keySize.SIZE_192; else if (size == 256) _keysize = slowAES.aes.keySize.SIZE_256; else throw "Unsupported key size. Must be one of { 128, 192, 256 }."; } function get_KeySize() { if (_keysize == slowAES.aes.keySize.SIZE_128) return 128; else if (_keysize == slowAES.aes.keySize.SIZE_192) return 192; else if (_keysize == slowAES.aes.keySize.SIZE_256) return 256; else return -1; } function put_IV(ivString) { _iv = hexStringToByteArray(ivString); } function get_IV() { return byteArrayToHexString(_iv); } function put_Mode(mode) { if (mode == "CBC") _mode= slowAES.modeOfOperation.CBC; else if (mode == "OFB") _mode= slowAES.modeOfOperation.OFB; else if (mode == "CFB") _mode= slowAES.modeOfOperation.CFB; else throw "Unsupported mode. Must be one of {CBC, OFB, CFB}"; } function get_Mode() { if (_mode == slowAES.modeOfOperation.CBC) return "CBC"; if (_mode == slowAES.modeOfOperation.OFB) return "OFB"; if (_mode == slowAES.modeOfOperation.CFB) return "CFB"; return "???"; } ]]> </script> </component> </package>

Guárdelo en un archivo llamado SlowAES.wsc. Regístrelo con "regsvr32 SlowAES.wsc". Aquí hay un código de VBScript que usa el componente.

'' '' '' byteArrayToHexString'' '' convert a byte array to hex string.'' '' '' Function byteArrayToHexString(a) Dim r,b,i r = "" For i = 0 To UBound(a) b = Hex( (a(i) And &HF0) / 16) & Hex(a(i) And &HF) r= r & b Next byteArrayToHexString= r End Function '' '' '' hexStringToByteArray'' '' convert a string of hex byts to a byte array'' '' '' Function hexStringToByteArray(s) Dim r() ReDim r(Len(s)/2-1) Dim x For i = 0 To Len(s)-2 Step 2 x= "&H" & Mid(s,i+1,2) r(i/2) = CInt(x) Next hexStringToByteArray= r End Function Function DemoEncryption() WScript.echo "Testing Ionic.Com.SlowAES..." WScript.echo "key: " & byteArrayToHexString(key) WScript.echo "iv: " & byteArrayToHexString(iv) WScript.echo "key length: " & keyLengthInBytes & " bytes" WScript.echo "key length: " & (keyLengthInBytes*8) & " bits" WScript.echo "plaintext: " & plaintext WScript.echo "plaintext.length: " & Len(plaintext) WScript.echo "instantiate Ionic.Com.SlowAES" Dim aes set aes = CreateObject("Ionic.Com.SlowAES") WScript.echo "keysize" aes.KeySize = keyLengthInBytes * 8 WScript.echo "key" aes.Key = byteArrayToHexString(key) WScript.echo "iv " aes.IV= byteArrayToHexString(iv) WScript.echo "mode " aes.Mode = "CBC" WScript.echo "encrypting... " Dim result result= aes.EncryptString(plaintext) '' result is a comma-separated string '' '' if we Eval() on it we convert it to an array '' Dim expr expr = "Array(" & result & ")" result= Eval( expr ) WScript.echo "Cryptotext/Eval: " & byteArrayToHexString(result) WScript.echo "Cryptotext.length: " & UBound(result)+1 WScript.echo "decrypting... " Dim decrypted ''The javascript way to do this is to pass the byte array.'' '' Like so:'' '' var decrypted = aes.DecryptBytesToString(result);'' '' '' ''This does not work from VBScript. So, convert to a hexstring,'' ''pass the hex string, and then convert back, in the COM component.'' decrypted= aes.DecryptHexString(byteArrayToHexString(result)) WScript.echo "decrypted: " & decrypted End Function dim plaintext, iv, key, keyLengthInBytes plaintext= "Hello. This is a test. of the emergency broadcasting system." '' iv must be a hexstring representation of an array of bytes, length=16'' iv = hexStringToByteArray("feedbeeffeedbeefbaadf00dbaadf00d") '' key must be a hexstring representation of an array of bytes, length=16 or 32'' key = hexStringToByteArray("cafebabe0099887766554433221100AA") keyLengthInBytes= UBound(key)+1 If Err.Number <> 0 Then Err.Clear Call DemoEncryption If (Err.Number <> 0) Then WScript.echo("Error: " & Err.Description)

Si también desea una capacidad de derivación de clave basada en contraseña, puede tomar el código JavaScript muy sucinto para PBKDF2 aquí , y crear otro WSC para eso , sin demasiados problemas.

EDITAR : Hice lo que describí: tomé la fuente de PBKDF2 y la integé en el código para SlowAES. También produje una segunda implementación independiente en C # que usa las bibliotecas de clases .NET incorporadas para realizar la derivación RFC 2898-key y el cifrado AES.

El resultado es 3 aplicaciones de prueba, una en C #, una en JavaScript y otra en VBScript. La fuente está disponible . Todos toman el mismo conjunto de argumentos. Cada uno de ellos usa una función de derivación de clave compatible con RFC 2898 . Puede especificar la contraseña, sal , IV y texto sin formato, así como el número de iteraciones de RFC 2898 para usar en PBKDF2 . Puede verificar fácilmente que el texto cifrado sea el mismo para cada uno de estos programas de prueba. Tal vez este ejemplo sea útil para alguien.


Sé que esta pregunta es antigua y OP desapareció, pero vale la pena señalar para los futuros usuarios de vb6 que VbCorLib ahora admite la criptografía, incluida la temida Rijndael.

Enlace: http://vbcorlib.blogspot.com/


Una vieja pregunta: ¡eso nunca envejece! Una forma es declarar las clases de cifrado dentro de vbscript, sin necesidad de objetos externos externos o envoltorios. El siguiente ejemplo toma una cadena, encripta y descifra usando la clase administrada Rijndael:

''----------------------------------------------------- Dim obj,arr,i,r,str,enc,asc dim bytes,bytesd,s,sc,sd set obj=WScript.CreateObject("System.Security.Cryptography.RijndaelManaged") Set asc = CreateObject("System.Text.UTF8Encoding") s="This is a private message" bytes=asc.GetBytes_4(s) obj.GenerateKey() obj.GenerateIV() set enc=obj.CreateEncryptor() set dec=obj.CreateDecryptor() bytec=enc.TransformFinalBlock((bytes),0,lenb(bytes)) sc=asc.GetString((bytec)) msgbox sc byted=dec.TransformFinalBlock((bytec),0,lenb(bytec)) sd=asc.GetString((byted)) msgbox sd ''-----------------------------------------------------

Mejor,


Aquí está mi solución. Guarda la clave de cifrado y el vector de inicialización en un archivo para que puedan reutilizarse.

Dim objAes, objAesEncryptor, objAesDecryptor, objUtf8Encoder Dim objStream, objFileSystem Dim strMyTextInUtf8, strMyEncyptedInUtf8, strMyText, strEncryptedInAnsi, strDecryptedInAnsi Dim strMyAesKeyFilename,strMyAesIvFilename Const adTypeBinary = 1 Const adSaveCreateOverWrite = 2 Const adSaveCreateNotExist = 1 '' https://.com/questions/270510/how-to-encrypt-in-vbscript-using-aes#28129895 Set objAes=WScript.CreateObject("System.Security.Cryptography.RijndaelManaged") Set objUtf8Encoder = CreateObject("System.Text.UTF8Encoding") strMyText = "This is a private message" strMyTextInUtf8=objUtf8Encoder.GetBytes_4(strMyText) strMyAesKeyFilename = "c:/Temp/objAes.Key" ''objAes.Key strMyAesIvFilename = "c:/Temp/objAes.IV" ''objAes.IV Set objFileSystem = CreateObject("Scripting.FileSystemObject") set objStream = createobject("Adodb.Stream") objStream.Type = adTypeBinary objStream.open If (objFileSystem.FileExists(strMyAesKeyFilename) And objFileSystem.FileExists(strMyAesKeyFilename)) Then objStream.LoadFromFile strMyAesKeyFilename objAes.Key = objStream.Read objStream.Close objStream.Open objStream.LoadFromFile strMyAesIvFilename objAes.IV = objStream.Read Else objAes.GenerateKey() objAes.GenerateIV() objStream.write objAes.Key objStream.savetofile strMyAesKeyFilename, adSaveCreateOverWrite objStream.Close objStream.open objStream.write objAes.IV objStream.savetofile strMyAesIvFilename, adSaveCreateOverWrite objStream.Close End IF Set objAesEncryptor = objAes.CreateEncryptor() Set objAesDecryptor = objAes.CreateDecryptor() strMyEncyptedInUtf8 = objAesEncryptor.TransformFinalBlock((strMyTextInUtf8),0,lenb(strMyTextInUtf8)) strEncryptedInAnsi = objUtf8Encoder.GetString((strMyEncyptedInUtf8)) WScript.Echo "Encrypted In Ansi: " & strEncryptedInAnsi strMyDecyptedInUtf8 = objAesDecryptor.TransformFinalBlock((strMyEncyptedInUtf8),0,lenb(strMyEncyptedInUtf8)) strDecryptedInAnsi = objUtf8Encoder.GetString((strMyDecyptedInUtf8)) WScript.Echo "Decrypted In Ansi: " & strDecryptedInAnsi

La ejecución del script se ve así:

c:/Temp>cscript //nologo TestAesCipher2.vbs Encrypted In Ansi: M!???↔???I?!?Q?%&↑?M?n?(?/??o? Decrypted In Ansi: This is a private message c:/Temp>cscript //nologo TestAesCipher2.vbs Encrypted In Ansi: M!???↔???I?!?Q?%&↑?M?n?(?/??o? Decrypted In Ansi: This is a private message