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