9/06/2010

Proyecto AjpdSoft - Encriptar y desencriptar ficheros con CAPICOM y Delphi

Proyecto AjpdSoft - Encriptar y desencriptar ficheros con CAPICOM y Delphi

Explicamos en este artículo 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

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:

http://www.microsoft.com/downloads/details.aspx?FamilyID=860ee43a-a843-462f-abb5-ff88ea5896f6&DisplayLang=es

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":

AjpdSoft Cómo usar CAPICOM en Delphi para obtener los certificados    digitales instalados en un equipo

Leeremos los términos de licencia, si estamos de acuerdo marcaremos "I accept the terms in the License Agreement" y pulsaremos "Next":

AjpdSoft Cómo usar CAPICOM en Delphi para obtener los certificados    digitales instalados en un equipo

Indicaremos en "Location" la carpeta de destino de CAPICOM SDK (pulsando "Browse" podremos cambiarla), pulsaremos "Next" para continuar:

AjpdSoft Cómo usar CAPICOM en Delphi para obtener los certificados    digitales instalados en un equipo

Pulsaremos "Install" para iniciar la instalación definitiva de CAPICOM SDK:

AjpdSoft Cómo usar CAPICOM en Delphi para obtener los certificados    digitales instalados en un equipo

Una vez finalizada la instalación, pulsaremos "Finish":

AjpdSoft Cómo usar CAPICOM en Delphi para obtener los certificados    digitales instalados en un equipo

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:

AjpdSoft Cómo usar CAPICOM en Delphi para obtener los certificados    digitales instalados en un equipo

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:WindowsSystem32 y correctamente registrada con "regsvr32.exe" o AjpdSoft Registro de OCX y DLL como explicamos aquí.

AjpdSoft Cómo usar CAPICOM en Delphi para obtener los certificados    digitales instalados en un equipo

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":

AjpdSoft Registro de la librería capicom.dll en Windows 7

Lo pegaremos en la carpeta del sistema (system32):

AjpdSoft Registro de la librería capicom.dll en Windows 7

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":

AjpdSoft Registro de la librería capicom.dll en Windows 7

Pulsaremos el botón "<<" para seleccionar el fichero capicom.dll:

AjpdSoft Registro de la librería capicom.dll en Windows 7

En "Tipo" seleccionaremos "DLL (*.dll)", buscaremos el fichero "capicom.dll" en la carpeta System32 de Windows y pulsaremos "Abrir":

AjpdSoft Registro de la librería capicom.dll en Windows 7

Pulsaremos en "Registrar":

AjpdSoft Registro de la librería capicom.dll en Windows 7

Si todo es correcto mostrará un mensaje como este:

AjpdSoft Registro de la librería capicom.dll en Windows 7

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 respondier "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:

AjpdSoft Encriptar ficheros con CAPICOM

Abriremos Delphi, crearemos un nuevo proyecto, añadiremos algunos componentes al formulario principal: algunos TEdit, TButton, etc. El formulario quedará de la siguiente forma:

AjpdSoft Cómo usar CAPICOM en Delphi para encriptar y desencriptar  ficheros

Añadiremos el siguiente código:

  • Para el botón "Encriptar":
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":
procedure TForm1.btDesencriptarClick(Sender: TObject);
begin
desencriptar (txtContrasenaDesencriptar.Text, txtFicheroDesencriptar.Text,
txtFicheroDestinoDesencriptado.Text);
end;
  • El procedimiento "desencriptar":
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":
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"):

AjpdSoft La aplicación AjpdSoft Encriptar ficheros con CAPICOM en  funcionamiento

Seleccionaremos el fichero, en nuestro caso "prueba.txt":

AjpdSoft La aplicación AjpdSoft Encriptar ficheros con CAPICOM en  funcionamiento

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":

AjpdSoft La aplicación AjpdSoft Encriptar ficheros con CAPICOM en  funcionamiento

Si la encriptación ha sido correcta mostrará el mensaje:

AjpdSoft La aplicación AjpdSoft Encriptar ficheros con CAPICOM en  funcionamiento

Con el texto: "Fichero encriptado".

Si accedemos a la carpeta de destino, podremos ver el fichero encriptado creado por la aplicación:

AjpdSoft La aplicación AjpdSoft Encriptar ficheros con CAPICOM en  funcionamiento

Si intentamos abrirlo veremos caracteres ilegibles, por lo que el proceso de encriptación se ha realizado correctamente:

AjpdSoft La aplicación AjpdSoft Encriptar ficheros con CAPICOM en  funcionamiento

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":

AjpdSoft La aplicación AjpdSoft Encriptar ficheros con CAPICOM en  funcionamiento

Si todo es correcto mostrará el mensaje:

AjpdSoft La aplicación AjpdSoft Encriptar ficheros con CAPICOM en  funcionamiento

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":

AjpdSoft La aplicación AjpdSoft Encriptar ficheros con CAPICOM en  funcionamiento

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:

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('http://www.ajpdsoft.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.

Artículos relacionados

Créditos

Artículo realizado íntegramente por Alonsojpd miembro fundador del proyecto AjpdSoft.

No hay comentarios: