Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   Varios (https://www.clubdelphi.com/foros/forumdisplay.php?f=11)
-   -   Traducir esta función de Encriptación de C# a Delphi (https://www.clubdelphi.com/foros/showthread.php?t=96742)

darkamerico 13-06-2024 16:05:06

Traducir esta función de Encriptación de C# a Delphi
 
Saludos amigos,
Estoy realizando la integración mediante un modulo que haré en Delphi a un sistema que está en C#, ellos usan estas funciones para encriptar y decriptar:

Código:

private string Encrypt(string clearText)
{
            string EncryptionKey = "MAKV2SPBNI99212";
            byte[] clearBytes = Encoding.Unicode.GetBytes(clearText);
            using (Aes encryptor = Aes.Create())
            {
                Rfc2898DeriveBytes pdb = new Rfc2898DeriveBytes(EncryptionKey, new byte[] { 0x49, 0x76, 0x61, 0x6e, 0x20, 0x4d, 0x65, 0x64, 0x76, 0x65, 0x64, 0x65, 0x76 });
                encryptor.Key = pdb.GetBytes(32);
                encryptor.IV = pdb.GetBytes(16);
                using (MemoryStream ms = new MemoryStream())
                {
                    using (CryptoStream cs = new CryptoStream(ms, encryptor.CreateEncryptor(), CryptoStreamMode.Write))
                    {
                        cs.Write(clearBytes, 0, clearBytes.Length);
                        cs.Close();
                    }
                    clearText = Convert.ToBase64String(ms.ToArray());
                }
            }
            return clearText;
        }

        private string Decrypt(string cipherText)
        {
            string EncryptionKey = "MAKV2SPBNI99212";
            byte[] cipherBytes = Convert.FromBase64String(cipherText);
            using (Aes encryptor = Aes.Create())
            {
                Rfc2898DeriveBytes pdb = new Rfc2898DeriveBytes(EncryptionKey, new byte[] { 0x49, 0x76, 0x61, 0x6e, 0x20, 0x4d, 0x65, 0x64, 0x76, 0x65, 0x64, 0x65, 0x76 });
                encryptor.Key = pdb.GetBytes(32);
                encryptor.IV = pdb.GetBytes(16);
                using (MemoryStream ms = new MemoryStream())
                {
                    using (CryptoStream cs = new CryptoStream(ms, encryptor.CreateDecryptor(), CryptoStreamMode.Write))
                    {
                        cs.Write(cipherBytes, 0, cipherBytes.Length);
                        cs.Close();
                    }
                    cipherText = Encoding.Unicode.GetString(ms.ToArray());
                }
            }
            return cipherText;
        }

Podría alguien echarme una mano con la unidad con el código Delphi de ellas?.
Muy Agradecido

Americo

darkamerico 13-06-2024 17:17:22

En Imagen
 
Para mejor visualización:



Atte
Americo

marco3k 13-06-2024 19:32:54

Bueno gogleando un poco en www hay convertidores de código y encontré este:
https://www.codeconvert.ai/csharp-to-pascal-converter


y el resultado es este:



Código Delphi [-]
uses
  System.SysUtils,
  System.Classes,
  System.Crypto,
  System.Convert;

function Encrypt(clearText: string): string;
var
  EncryptionKey: string;
  clearBytes: TBytes;
  encryptor: TAesManaged;
  pdb: TRfc2898DeriveBytes;
  ms: TMemoryStream;
  cs: TCryptoStream;
begin
  EncryptionKey := 'MAKV2SPBNI99212';
  clearBytes := TEncoding.Unicode.GetBytes(clearText);
  encryptor := TAesManaged.Create;
  try
    pdb := TRfc2898DeriveBytes.Create(EncryptionKey, [0x49, 0x76, 0x61, 0x6e, 0x20, 0x4d, 0x65, 0x64, 0x76, 0x65, 0x64, 0x65, 0x76]);
    encryptor.Key := pdb.GetBytes(32);
    encryptor.IV := pdb.GetBytes(16);
    ms := TMemoryStream.Create;
    try
      cs := TCryptoStream.Create(ms, encryptor.CreateEncryptor, CryptoStreamMode.Write);
      try
        cs.Write(clearBytes, 0, Length(clearBytes));
      finally
        cs.Free;
      end;
      clearText := TBase64Encoding.UTF8.EncodeToString(ms.ToArray);
    finally
      ms.Free;
    end;
  finally
    encryptor.Free;
  end;
  Result := clearText;
end;

function Decrypt(cipherText: string): string;
var
  EncryptionKey: string;
  cipherBytes: TBytes;
  encryptor: TAesManaged;
  pdb: TRfc2898DeriveBytes;
  ms: TMemoryStream;
  cs: TCryptoStream;
begin
  EncryptionKey := 'MAKV2SPBNI99212';
  cipherBytes := TBase64Encoding.UTF8.DecodeToBytes(cipherText);
  encryptor := TAesManaged.Create;
  try
    pdb := TRfc2898DeriveBytes.Create(EncryptionKey, [0x49, 0x76, 0x61, 0x6e, 0x20, 0x4d, 0x65, 0x64, 0x76, 0x65, 0x64, 0x65, 0x76]);
    encryptor.Key := pdb.GetBytes(32);
    encryptor.IV := pdb.GetBytes(16);
    ms := TMemoryStream.Create;
    try
      cs := TCryptoStream.Create(ms, encryptor.CreateDecryptor, CryptoStreamMode.Write);
      try
        cs.Write(cipherBytes, 0, Length(cipherBytes));
      finally
        cs.Free;
      end;
      cipherText := TEncoding.Unicode.GetString(ms.ToArray);
    finally
      ms.Free;
    end;
  finally
    encryptor.Free;
  end;
  Result := cipherText;
end.


Tendrias que probarlo...

darkamerico 13-06-2024 21:33:19

El código presenta varios errores, de igual modo intente con ChatGPT y ninguno corre.

marco3k 14-06-2024 00:30:12

Cita:

Empezado por darkamerico (Mensaje 556097)
El código presenta varios errores, de igual modo intente con ChatGPT y ninguno corre.

Pues depuralo paso a paso y ahi notaras en que parte falla y asi vas corrigiendo.

marco3k 14-06-2024 00:37:10

Yo empezaría primero de que librerías salen esas funciones en c# y luego ver los tipos de datos son equivalentes. Pude ocurrir que esas librerias no existan en delphi y entonces el traductor puso algunas que cree que seria equivalentes. Y si en el caso esas librerías sólo existen en c# tocara llamarlos desde delphi.

darkamerico 14-06-2024 14:46:26

Cita:

Empezado por marco3k (Mensaje 556099)
Pues depuralo paso a paso y ahi notaras en que parte falla y así vas corrigiendo.

precisamente el problema es que, como dices, estas unidades, no existen en Delphi.

marco3k 14-06-2024 15:09:11

Cita:

Empezado por darkamerico (Mensaje 556137)
precisamente el problema es que, como dices, estas unidades, no existen en Delphi.

Entonces si tienes las fuentes en c# ahi encontraras las librerías en la parte superior del archivo donde estan esas funciones.

Cita:

Podría alguien echarme una mano con la unidad con el código Delphi de ellas?.
Debes identificarlo tu mismo, porque tienes acceso a los fuentes c#. Como viste el convertidor online se equivoco.

Aqui hay un tema al respecto de encriptar y desencriptar en delphi:
https://www.clubdelphi.com/foros/showthread.php?t=79262

darkamerico 14-06-2024 16:04:02

Cita:

Empezado por marco3k (Mensaje 556139)
Entonces si tienes las fuentes en c# ahi encontraras las librerías en la parte superior del archivo donde estan esas funciones.


Debes identificarlo tu mismo, porque tienes acceso a los fuentes c#. Como viste el convertidor online se equivoco.

Aqui hay un tema al respecto de encriptar y desencriptar en delphi:
https://www.clubdelphi.com/foros/showthread.php?t=79262

Gracias amigo


La franja horaria es GMT +2. Ahora son las 07:06:56.

Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi