Cómo encriptar y desencriptar ficheros mediante los algoritmos RC2, RC4, DES, 3DES y AES. Mostramos y explicamos el código fuente de la aplicación AjpdSoft Encriptar ficheros con CAPICOM. Explicamos qué es CAPICOM y cómo descargarlo y registrarlo. Mostramos cómo usar CAPICOM con Borland Delphi.
- Qué es CAPICOM, para qué sirve.
- Descarga e instalación de Microsoft CAPICOM SDK.
- Registro de la librería capicom.dll en Windows 7.
- Cómo usar CAPICOM en Delphi para encriptar y desencriptar ficheros.
- La aplicación AjpdSoft Encriptar ficheros con CAPICOM en funcionamiento.
- Anexo.
Qué es CAPICOM, para qué sirve
CAPICOM es un control ActiveX o una librería (según el caso) de Microsoft que proporciona una interfaz COM para Microsoft CryptoAPI (también llamada Cryptographic Application Programming Interface, Microsoft Cryptography API, ó CAPI). CAPICOM permite usar un conjunto de funciones de CryptoAPI para permitir a los desarrolladores de aplicaciones incorporar de forma sencilla la funcionalidad de firma digital y encriptación en sus aplicaciones. Debido a que utiliza COM, los desarrolladores de aplicaciones pueden acceder a esta funcionalidad en una serie de entornos de programación tales como Microsoft Visual Basic, Visual Basic Script, Active Server Pages (ASP), Microsoft JScript, C + +, Delphi, Java, PHP y otros.
CAPICOM se puede empaquetar como un control ActiveX, para ser instalado en los navegadores y permitir a los desarrolladores Web utilizarla en aplicaciones basadas en Web (ASP, PHP, etc.). Además, CAPICOM cuenta con un SDK (kit de desarrollo de software o Software Development Kit) con las librerías necesarias para que sea usado por lenguajes de programación para desarrollar aplicaciones de escritorio (Delphi, Visual Basic .Net, Visual Basic, etc.).
De esta forma, con CAPICOM podremos implementar la utilidad de uso de certificados digitales en nuestras aplicaciones casi sin esfuerzo, pues todas las funciones necerias para el acceso a estos certificados ya están implementadas y listas para ser usadas.
Descarga e instalación de Microsoft CAPICOM SDK
En primer lugar deberemos descargar e instalar el SDK de CAPICOM (Platform SDK Redistributable: CAPICOM), disponible gratuitamente en: [[Ya no está disponible]].
Instalaremos CAPICOM SDK ejecutando el fichero descargado capicom_dc_sdk.msi, se iniciará el asistente de instalación de CAPICOM 2.1.0.2 SDK, pulsaremos «Next»:
Leeremos los términos de licencia, si estamos de acuerdo marcaremos «I accept the terms in the License Agreement» y pulsaremos «Next»:
Indicaremos en «Location» la carpeta de destino de CAPICOM SDK (pulsando «Browse» podremos cambiarla), pulsaremos «Next» para continuar:
Pulsaremos «Install» para iniciar la instalación definitiva de CAPICOM SDK:
Una vez finalizada la instalación, pulsaremos «Finish»:
En realidad, la instalación de CAPICOM 2.1.0.2 SDK lo único que hace es descomprimir una carpeta en la carpeta de destino con los siguientes ficheros y subcarpetas:
La carpeta que más nos interesa es «Lib» que contiene la librería «capicom.dll» necesaria para el funcionamiento de nuestra aplicación. Esta librería deberá estar en la carpeta del sistema, en C:\Windows\System32 y correctamente registrada con «regsvr32.exe» o AjpdSoft Registro de OCX y DLL como explicamos aquí.
Registro de la librería capicom.dll en Windows 7
Una vez descargado e instalado el software CAPICOM SDK copiaremos el fichero «capicom.dll» ubicado en la carpeta de instalación de CAPICOM, en la subcarpeta «LibX86»:
Lo pegaremos en la carpeta del sistema (system32):
A continuación registraremos la librería capicom.dll o bien usando regsvr32.exe o bien utilizando AjpdSoft Registro de OCX y DLL, abriremos AjpdSoft Registro de OCX y DLL ejecutando el fichero «registroOCX.exe» en modo administrador, pulsando con el botón derecho sobre el fichero descargado y seleccionando «Ejecutar como administrador»:
Pulsaremos el botón «<<» para seleccionar el fichero capicom.dll:
En «Tipo» seleccionaremos «DLL (*.dll)», buscaremos el fichero «capicom.dll» en la carpeta System32 de Windows y pulsaremos «Abrir»:
Pulsaremos en «Registrar»:
Si todo es correcto mostrará un mensaje como este:
Con el texto:
El proceso de registro ha finalizado con el siguiente resultado:
Registrados: 1.
No registrados: 0
Nota: si tenemos activado el control de cuentas de usuario (UAC) de Windows 7, es posible que nos muestre algún mensaje de confirmación al que tendremos que responder «Sí».
Cómo usar CAPICOM en Delphi para encriptar y desencriptar ficheros
Para encriptar y desencriptar ficheros mediante el lenguaje de programación Delphi y la herramienta de Microsoft CAPICOM, necesitaremos la librería capicom.dll correctamente registrada y el fichero CAPICOM_TLB.pas, que podremos descargar del ejemplo de este artículo:
Abriremos Delphi, crearemos un nuevo proyecto, añadiremos algunos componentes al formulario principal: algunos TEdit, TButton, etc. El formulario quedará de la siguiente forma:
Añadiremos el siguiente código:
- Para el botón «Encriptar»:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 |
procedure TForm1.btEncriptarClick(Sender: TObject); begin if txtAlgoritmoEncriptacion.Text = 'RC2' then algoritmo := CAPICOM_ENCRYPTION_ALGORITHM_RC2 else if txtAlgoritmoEncriptacion.Text = 'RC4' then algoritmo := CAPICOM_ENCRYPTION_ALGORITHM_RC4 else if txtAlgoritmoEncriptacion.Text = 'DES' then algoritmo := CAPICOM_ENCRYPTION_ALGORITHM_DES else if txtAlgoritmoEncriptacion.Text = '3DES' then algoritmo := CAPICOM_ENCRYPTION_ALGORITHM_3DES else if txtAlgoritmoEncriptacion.Text = 'AES' then algoritmo := CAPICOM_ENCRYPTION_ALGORITHM_AES; if txtTamanoDatosEncriptar.Text = '256 bits' then tamanoDatosAlgoritmo := CAPICOM_ENCRYPTION_KEY_LENGTH_256_BITS else if txtTamanoDatosEncriptar.Text = '192 bits' then tamanoDatosAlgoritmo := CAPICOM_ENCRYPTION_KEY_LENGTH_192_BITS else if txtTamanoDatosEncriptar.Text = '128 bits' then tamanoDatosAlgoritmo := CAPICOM_ENCRYPTION_KEY_LENGTH_128_BITS else if txtTamanoDatosEncriptar.Text = '56 bits' then tamanoDatosAlgoritmo := CAPICOM_ENCRYPTION_KEY_LENGTH_56_BITS else if txtTamanoDatosEncriptar.Text = '40 bits' then tamanoDatosAlgoritmo := CAPICOM_ENCRYPTION_KEY_LENGTH_40_BITS; encriptar(txtContrasena.Text, txtFicheroEncriptar.Text, txtFicheroDestinoEncriptado.Text); end; |
- Para el botón «Desencriptar»:
1 2 3 4 5 |
procedure TForm1.btDesencriptarClick(Sender: TObject); begin desencriptar (txtContrasenaDesencriptar.Text, txtFicheroDesencriptar.Text, txtFicheroDestinoDesencriptado.Text); end; |
- El procedimiento «desencriptar»:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 |
procedure desencriptar (contrasena : string; ficheroDesencriptar : string; ficheroDestino : string); var EncryptedData: IEncryptedData; Buffer: WideString; FileStm: TFileStream; begin //Crear objeto EncryptedData EncryptedData := CoEncryptedData.Create; //Establecemos la contraseña EncryptedData.SetSecret(contrasena, CAPICOM_SECRET_PASSWORD); //Cargamos el fichero a desencriptar FileStm := TFileStream.Create(ficheroDesencriptar, fmOpenRead or fmShareDenyWrite); try pointer(Buffer):= SysAllocStringByteLen(nil, FileStm.Size); FileStm.ReadBuffer(Pointer(Buffer)^, FileStm.Size); finally FileStm.Free; end; //Desencriptamos el fichero en memoria EncryptedData.Decrypt(Buffer); Buffer := EncryptedData.Content; //Guardamos el fichero desencriptado en memoria en el fichero destino FileStm:= TFileStream.Create(ficheroDestino, fmCreate or fmShareDenyWrite); try FileStm.WriteBuffer(Pointer(Buffer)^, SysStringByteLen(PWideChar(Buffer))); finally FileStm.Free; end; MessageDlg('Fichero desencriptado.', mtInformation, [mbok], 0); end; |
- El procedimiento «encriptar»:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 |
procedure encriptar (contrasena : string; ficheroEncriptar : string; ficheroDestino : string); var EncryptedData: IEncryptedData; Buffer: WideString; FileStm: TFileStream; begin //rear objeto EncryptedData EncryptedData := CoEncryptedData.Create; // Indicamos el algoritmo de encriptación a usar EncryptedData.Algorithm.Name := algoritmo; //Establecemos el tamaño del algoritmo de encriptación EncryptedData.Algorithm.KeyLength := tamanoDatosAlgoritmo; //Establecemos la contraseña EncryptedData.SetSecret(contrasena, CAPICOM_SECRET_PASSWORD); FileStm := TFileStream.Create(ficheroEncriptar, fmOpenRead or fmShareDenyWrite); try Pointer(Buffer):= SysAllocStringByteLen (nil, FileStm.Size); FileStm.ReadBuffer(Pointer(Buffer)^, FileStm.Size); EncryptedData.Content:= Buffer; finally FileStm.Free; end; //Encriptar fichero Buffer:= EncryptedData.Encrypt(CAPICOM_ENCODE_BINARY); //Guardar fichero encritado en fichero destino FileStm := TFileStream.Create(ficheroDestino, fmCreate or fmShareDenyWrite); try FileStm.WriteBuffer(Pointer(Buffer)^, SysStringByteLen(PWideChar(Buffer))); finally FileStm.Free; end; MessageDlg('Fichero encriptado.', mtInformation, [mbok], 0); end; |
El código fuente completo de la aplicación puede verse aquí.
La aplicación AjpdSoft Encriptar ficheros con CAPICOM en funcionamiento
Para probar la aplicación crearemos un fichero cualquiera con un texto, por jemplo «Prueba de encriptación de fichero por AjpdSoft». Crearemos este fichero de texto plano y lo guardaremos. A continuación ejecutaremos el fichero encriptarFicheros.exe (no necesita instalación pero sí necesita la DLL capicom.dll en el sistema correctamente registrada como explicamos aquí).
Para encriptar un fichero, en primer lugar, lo seleccionaremos pulsando el botón «…» (o bien escribiremos la ruta y nombre en «Fichero a Encriptar»):
Seleccionaremos el fichero, en nuestro caso «prueba.txt»:
La aplicación establecerá como fichero de destino encriptado el seleccionado, añadiendo el texto «ENCRIPTADO» al principio, si no se indica otro fichero de destino, será en éste donde se guarde el fichero origen encriptado. En «Contraseña» introduciremos la contraseña para la encriptación que será necesaria para la desencriptación posterior, sin esta contraseña no será posible desencriptar el fichero. En «Algoritmo» seleccionaremos el algoritmo de encriptación, seleccionaremos el Tamaño y pulsaremos «Encriptar»:
Si la encriptación ha sido correcta mostrará el mensaje:
Con el texto: «Fichero encriptado».
Si accedemos a la carpeta de destino, podremos ver el fichero encriptado creado por la aplicación:
Si intentamos abrirlo veremos caracteres ilegibles, por lo que el proceso de encriptación se ha realizado correctamente:
Para desencriptar un fichero, el proceso es similar, pero en «Desencriptar fichero», aunque para este proceso no es necesario indicar el algoritmo de encriptación previo. Para desencriptar el fichero lo seleccionaremos pulsando en el botón «…» de «Fichero a desencriptar», en «Contraseña» introduciremos la contraseña con la que lo encriptamos y pulsaremos el botón «Desencriptar»:
Si todo es correcto mostrará el mensaje:
Con el texto: «Fichero desencriptado».
Si abrimos el fichero desencriptado, podremos ver que el texto ya es legible nuevamente «Prueba de encriptación de fichero por AjpdSoft»:
Por supuesto, en el ejemplo hemos encriptado y desencriptado un fichero de texto plano, pero AjpdSoft Encriptar ficheros con CAPICOM se puede usar para encriptar y desencriptar cualquier tipo de fichero (mp3, txt, doc, xls, mdb, rar, zip, jpg, pdf, html, tif, asp, php, exe, com, bat, etc.).
Anexo
Código fuente source code aplicación AjpdSoft Encriptar ficheros con CAPICOM
A continuación os mostramos el código fuente (source code) completo en Borland Delphi 6 de la aplicación AjpdSoft Encriptar ficheros con CAPICOM:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 |
unit UnidadMenuPrincipal; interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls, shellapi, activex, CAPICOM_TLB, Buttons, ComCtrls; type TForm1 = class(TForm) GroupBox1: TGroupBox; Label1: TLabel; txtContrasena: TEdit; txtFicheroEncriptar: TEdit; Label2: TLabel; txtFicheroDestinoEncriptado: TEdit; Label3: TLabel; txtAlgoritmoEncriptacion: TComboBox; Label4: TLabel; LWEB: TLabel; GroupBox2: TGroupBox; Label5: TLabel; Label6: TLabel; Label7: TLabel; txtContrasenaDesencriptar: TEdit; txtFicheroDesencriptar: TEdit; txtFicheroDestinoDesencriptado: TEdit; btEncriptar: TBitBtn; btDesencriptar: TBitBtn; btSelFicEncriptar: TBitBtn; BitBtn1: TBitBtn; bSelFicDes: TBitBtn; BitBtn3: TBitBtn; dlAbrir: TOpenDialog; txtTamanoDatosEncriptar: TComboBox; Label9: TLabel; btSalir: TBitBtn; StatusBar1: TStatusBar; procedure LWEBClick(Sender: TObject); procedure btEncriptarClick(Sender: TObject); procedure btDesencriptarClick(Sender: TObject); procedure btSelFicEncriptarClick(Sender: TObject); procedure txtFicheroEncriptarChange(Sender: TObject); procedure bSelFicDesClick(Sender: TObject); procedure txtFicheroDesencriptarChange(Sender: TObject); procedure btSalirClick(Sender: TObject); private { Private declarations } public { Public declarations } end; var Form1: TForm1; implementation {$R *.dfm} var algoritmo: CAPICOM_ENCRYPTION_ALGORITHM = CAPICOM_ENCRYPTION_ALGORITHM_RC2; tamanoDatosAlgoritmo: CAPICOM_ENCRYPTION_KEY_LENGTH = CAPICOM_ENCRYPTION_KEY_LENGTH_MAXIMUM; procedure encriptar (contrasena : string; ficheroEncriptar : string; ficheroDestino : string); var EncryptedData: IEncryptedData; Buffer: WideString; FileStm: TFileStream; begin //rear objeto EncryptedData EncryptedData := CoEncryptedData.Create; // Indicamos el algoritmo de encriptación a usar EncryptedData.Algorithm.Name := algoritmo; //Establecemos el tamaño del algoritmo de encriptación EncryptedData.Algorithm.KeyLength := tamanoDatosAlgoritmo; //Establecemos la contraseña EncryptedData.SetSecret(contrasena, CAPICOM_SECRET_PASSWORD); FileStm := TFileStream.Create(ficheroEncriptar, fmOpenRead or fmShareDenyWrite); try Pointer(Buffer):= SysAllocStringByteLen (nil, FileStm.Size); FileStm.ReadBuffer(Pointer(Buffer)^, FileStm.Size); EncryptedData.Content:= Buffer; finally FileStm.Free; end; //Encriptar fichero Buffer:= EncryptedData.Encrypt(CAPICOM_ENCODE_BINARY); //Guardar fichero encritado en fichero destino FileStm := TFileStream.Create(ficheroDestino, fmCreate or fmShareDenyWrite); try FileStm.WriteBuffer(Pointer(Buffer)^, SysStringByteLen(PWideChar(Buffer))); finally FileStm.Free; end; MessageDlg('Fichero encriptado.', mtInformation, [mbok], 0); end; procedure desencriptar (contrasena : string; ficheroDesencriptar : string; ficheroDestino : string); var EncryptedData: IEncryptedData; Buffer: WideString; FileStm: TFileStream; begin //Crear objeto EncryptedData EncryptedData := CoEncryptedData.Create; //Establecemos la contraseña EncryptedData.SetSecret(contrasena, CAPICOM_SECRET_PASSWORD); //Cargamos el fichero a desencriptar FileStm := TFileStream.Create(ficheroDesencriptar, fmOpenRead or fmShareDenyWrite); try pointer(Buffer):= SysAllocStringByteLen(nil, FileStm.Size); FileStm.ReadBuffer(Pointer(Buffer)^, FileStm.Size); finally FileStm.Free; end; //Desencriptamos el fichero en memoria EncryptedData.Decrypt(Buffer); Buffer := EncryptedData.Content; //Guardamos el fichero desencriptado en memoria en el fichero destino FileStm:= TFileStream.Create(ficheroDestino, fmCreate or fmShareDenyWrite); try FileStm.WriteBuffer(Pointer(Buffer)^, SysStringByteLen(PWideChar(Buffer))); finally FileStm.Free; end; MessageDlg('Fichero desencriptado.', mtInformation, [mbok], 0); end; procedure TForm1.LWEBClick(Sender: TObject); begin ShellExecute(Handle, Nil, PChar('https://www.proyectoa.com'), Nil, Nil, SW_SHOWNORMAL); end; procedure TForm1.btEncriptarClick(Sender: TObject); begin if txtAlgoritmoEncriptacion.Text = 'RC2' then algoritmo := CAPICOM_ENCRYPTION_ALGORITHM_RC2 else if txtAlgoritmoEncriptacion.Text = 'RC4' then algoritmo := CAPICOM_ENCRYPTION_ALGORITHM_RC4 else if txtAlgoritmoEncriptacion.Text = 'DES' then algoritmo := CAPICOM_ENCRYPTION_ALGORITHM_DES else if txtAlgoritmoEncriptacion.Text = '3DES' then algoritmo := CAPICOM_ENCRYPTION_ALGORITHM_3DES else if txtAlgoritmoEncriptacion.Text = 'AES' then algoritmo := CAPICOM_ENCRYPTION_ALGORITHM_AES; if txtTamanoDatosEncriptar.Text = '256 bits' then tamanoDatosAlgoritmo := CAPICOM_ENCRYPTION_KEY_LENGTH_256_BITS else if txtTamanoDatosEncriptar.Text = '192 bits' then tamanoDatosAlgoritmo := CAPICOM_ENCRYPTION_KEY_LENGTH_192_BITS else if txtTamanoDatosEncriptar.Text = '128 bits' then tamanoDatosAlgoritmo := CAPICOM_ENCRYPTION_KEY_LENGTH_128_BITS else if txtTamanoDatosEncriptar.Text = '56 bits' then tamanoDatosAlgoritmo := CAPICOM_ENCRYPTION_KEY_LENGTH_56_BITS else if txtTamanoDatosEncriptar.Text = '40 bits' then tamanoDatosAlgoritmo := CAPICOM_ENCRYPTION_KEY_LENGTH_40_BITS; encriptar(txtContrasena.Text, txtFicheroEncriptar.Text, txtFicheroDestinoEncriptado.Text); end; procedure TForm1.btDesencriptarClick(Sender: TObject); begin desencriptar (txtContrasenaDesencriptar.Text, txtFicheroDesencriptar.Text, txtFicheroDestinoDesencriptado.Text); end; procedure TForm1.btSelFicEncriptarClick(Sender: TObject); begin dlAbrir.Title := 'Seleccione el fichero a encriptar'; if dlAbrir.Execute then txtFicheroEncriptar.Text := dlAbrir.FileName; end; procedure TForm1.txtFicheroEncriptarChange(Sender: TObject); begin if FileExists (txtFicheroEncriptar.Text) then begin txtFicheroDestinoEncriptado.Text := IncludeTrailingPathDelimiter (ExtractFilePath(txtFicheroEncriptar.Text)) + 'ENCRIPTADO--' + ExtractFileName (txtFicheroEncriptar.Text); end; end; procedure TForm1.bSelFicDesClick(Sender: TObject); begin dlAbrir.Title := 'Seleccione el fichero a desencriptar'; if dlAbrir.Execute then txtFicheroDesencriptar.Text := dlAbrir.FileName; end; procedure TForm1.txtFicheroDesencriptarChange(Sender: TObject); begin if FileExists (txtFicheroDesencriptar.Text) then begin txtFicheroDestinoDesencriptado.Text := IncludeTrailingPathDelimiter (ExtractFilePath(txtFicheroDesencriptar.Text)) + 'DESENCRIPTADO--' + ExtractFileName (txtFicheroDesencriptar.Text); end; end; procedure TForm1.btSalirClick(Sender: TObject); begin Close; end; end. |