C++ da Memset ve memcpy fonksiyonlarının Delphi Kullanım

Delphi'de kod yazma ile ilgili sorularınızı bu foruma yazabilirsiniz.
Cevapla
aegean
Üye
Mesajlar: 41
Kayıt: 24 Tem 2019 09:32

C++ da Memset ve memcpy fonksiyonlarının Delphi Kullanım

Mesaj gönderen aegean »

Merhabalar,
Acayıp garip bır sorun ile karsı karsıyayım,
Öncelikle Aes 128 ECB padding ile birlikler codlama encodlama yapmak için günlerdir uğrastım.
ve son günlerde elime C++ ile yapılmıs bir exe tool örnek buldum ki source kodu da var (tabii tam değil includeları tam verilmemiş)
Bu örnek Bir Dll ile link içinde dosyaya yazdıgnız texti başarılı sekilde encode decode ediyor.
(libgcrypt.dll) bu arkadasların guzel bır sıtesı de var ve oradadn da yardım aldımmmmm.
simdi c++ da

Kod: Tümünü seç

int encrypt( unsigned char * outbuf, int outlen, const unsigned char * plain, int plainlen, const char *ciphername )
{
   int rc;
   gcry_error_t err;
   gcry_cipher_hd_t hd; 
   int cipher=GCRY_CIPHER_DES;
   int keylength=16;
   char *lkey;
   char des_key[9], aes_key[17];
   unsigned char iv[33];
   
   MLOG( DEBUG_LOGLVL) "lh_aes_ecb_encrypt( %p, %p, %d)", outbuf, plain, plainlen );

   if (m_IsLoaded == 0)
   {
      rc = loadfuncs();
      MLOG(INFO_LOGLVL)  "loadfuncs rc=%d", rc );
      if (rc != 1) return EC_GCRYPT_LOAD_ERROR;
   }
   if (stricmp (ciphername, AES_STANDARD_NAME)==0) {
       cipher=GCRY_CIPHER_AES;
       keylength=16;
	   lkey=aes_key;
   } else if (stricmp(ciphername, DES_STANDARD_NAME)==0) {
               cipher=GCRY_CIPHER_DES;
               keylength=8;
			   lkey=des_key;

   }
   memset (lkey,0,keylength+1);
   memcpy(lkey,aeskey,keylength);
   memset( iv, 0x00, 33 );
   
   err = fgcry_cipher_open( &hd, cipher, GCRY_CIPHER_MODE_ECB, 0 );
   if (err)
   {
      MLOG( ERROR_LOGLVL ) "Failed opening AES cipher: %s", Mfgcry_strerror(err));
      return EC_ENCRYPT_DECRYPT;
   }

   err = fgcry_cipher_setkey( hd, lkey, keylength );
   if (err)
   {
      MLOG(ERROR_LOGLVL) "Failed setkey: %s", Mfgcry_strerror(err));
      return EC_ENCRYPT_DECRYPT;
   }

   err = fgcry_cipher_setiv( hd, iv, keylength );
   if (err)
   {
      MLOG(ERROR_LOGLVL) "Failed setiv: %s", Mfgcry_strerror(err));
      return EC_ENCRYPT_DECRYPT;
   }
   
   err = fgcry_cipher_encrypt( hd, outbuf, outlen, plain, plainlen );
   if (err)
   {
      MLOG(ERROR_LOGLVL) "Failed encrypt: %s %d ", Mfgcry_strerror(err), err);
      return EC_ENCRYPT_DECRYPT;
   }

   fgcry_cipher_close( hd );
   
                                   
   return EC_SUCCESS;
}
Buradaki Const ları uzun aramalarla buldum programa yerlestirdim fakaaaat
burada bulunan memset yerine fillchar memcpy yerine de copymemory gibi fonsiyonlar kullanmaya baslayınca aa bir baktım benim diger string veya pchar gibi pointerlerin verileri sıfırlanıyor.
yazıgım kodlar pazaryerine dondu yazboz yapmaktan ama sorunu bulamadım
son haliyle rezil olmuş delphi kodumu da vereyim eminim dalga gecersiniz ama lütfen su fillchar kullanmadan c nin memset ve memcpy gibi fonksiyonunu kullanma sansım varmı? veya ben acayıp bir yanlıs yapıyorumda artık kor oldum goremıyormuyum
aesxx.zip
(47.17 KiB) 67 kere indirildi

eğer vakti olupta bakabilecek ve bır fıkır verebilecek arkadaslara simdiden tesekkur ederim
(pointer değiskenlerin cogunu denedim son c deki benzeri olarak pchar kullandım ama program bu haliyle dogru sonuc vermiyor )
bu da dll dosyaları
libgcryp.zip
(274.16 KiB) 66 kere indirildi
aegean
Üye
Mesajlar: 41
Kayıt: 24 Tem 2019 09:32

Re: C++ da Memset ve memcpy fonksiyonlarının Delphi Kullanım

Mesaj gönderen aegean »

Merhaba hatta ben buradan su yukarıda bahsettigim tool u da vereyim belki baska ugrasan olur
burada hem bana kaynak olan c source var hem de calısan Tool var
C++.zip
(347.62 KiB) 82 kere indirildi
ertank
Kıdemli Üye
Mesajlar: 1650
Kayıt: 12 Eyl 2015 12:45

Re: C++ da Memset ve memcpy fonksiyonlarının Delphi Kullanım

Mesaj gönderen ertank »

Merhaba,

Alternatif kütüphanelerden önce Delphi ile bir çözüm aramanız daha doğru diye düşünüyorum.

Kullandığınız Delphi sürümünü belirtmemişsiniz. Aşağıdaki kütüphane Delphi 10.2 Tokyo ve üzerini destekler. Her üç kütüphaneyi de almanız gerekli.
https://github.com/Xor-el/CryptoLib4Pascal
https://github.com/Xor-el/HashLib4Pascal
https://github.com/Xor-el/SimpleBaseLib4Pascal

Kütüphane çok fazla dizinden oluşuyor. Birçoğunu search path olarak tanımlamanız gerekecek. Örnek kullanım aşağıdaki gibidir. Kolaylık olması için proje dosyası da ekledim. Proje içindeki Key ve IV değerleri demodur. Onları gerçek uygulamanızda kullanmayın.

Kod: Tümünü seç

function TForm1.EncryptAES(const Key, IV: TBytes; const PlainText: string; out CryptBase64Text: string): Boolean;
var
  Cipher: IBufferedCipher;
  KeyParametersWithIV: IParametersWithIV;
  Buf: TBytes;
  CryptBytes: TBytes;
begin
  try
    Cipher := TCipherUtilities.GetCipher('AES/ECB/PKCS7PADDING');
    KeyParametersWithIV := TParametersWithIV.Create(TParameterUtilities.CreateKeyParameter('AES', Key), IV);
    Cipher.Init(True, KeyParametersWithIV); // init encryption cipher
    Buf := TEncoding.ANSI.GetBytes(PlainText);
    CryptBytes := Cipher.DoFinal(Buf);
    CryptBase64Text := TBase64.Encode(CryptBytes);
  except
    Exit(False);
  end;
  Result := True;
end;

function TForm1.DecryptAES(const Key, IV: TBytes; const CryptBase64Text: string; out PlainText: string): Boolean;
var
  Cipher: IBufferedCipher;
  KeyParametersWithIV: IParametersWithIV;
  Buf: TBytes;
  PlainBytes: TBytes;
begin
  try
    Cipher := TCipherUtilities.GetCipher('AES/ECB/PKCS7PADDING');
    KeyParametersWithIV := TParametersWithIV.Create(TParameterUtilities.CreateKeyParameter('AES', Key), IV);
    Cipher.Init(False, KeyParametersWithIV); // init encryption cipher
    Buf := TBase64.Decode(CryptBase64Text);
    PlainBytes := Cipher.DoFinal(Buf);
    PlainText := TEncoding.ANSI.GetString(PlainBytes);
  except
    Exit(False);
  end;
  Result := True;
end;
Key uzunluğu 128bit veya 256bit olmasını belirler. 16Byte uzunluk 128bit anlamına gelir. 32byte uzunluk 256bit anlamına gelir.
IV her zaman 16 byte uzunluktadır.

Padding farklı ise kütüphane birden fazla padding desteklemektedir. Size uygun olanı kullanabilirsiniz.

Bu şekilde ek DLL veya harici dosya ihtiyacı olmadan işlemlerinizi gerçekleştirebilirsiniz.

Bu kütüphane dışında da yine pascal çözümleri mevcuttur. Bazıları padding işlemini sizin yapmanızı bekler. Bazıları ise yukarıdaki kütüphane gibi RSA ve elliptic curve desteği dahi verir.

Geliştiricisi Wolfgang Ehrhardt vefat eden ancak sitesi arşivlenmiş aşağıdaki pascal tabanlı kütüphane WinCE cihazlarda dahi çalışmaktadır. Ancak kullanımı biraz daha uğraştırıcıdır.
https://web.archive.org/web/20190628091 ... index.html
aegean
Üye
Mesajlar: 41
Kayıt: 24 Tem 2019 09:32

Re: C++ da Memset ve memcpy fonksiyonlarının Delphi Kullanım

Mesaj gönderen aegean »

@ertank hocam tesekkur ederim.
derhal deneyecegim, ama bazı eksik bilgieri de vereyim tam yazmamısım kusuruma bakmayın Aes 128 Ecb pkcs7 padding(16 bytlik)
Delphi versiyon ise 10.4 tekrar tesekkürler.
aegean
Üye
Mesajlar: 41
Kayıt: 24 Tem 2019 09:32

Re: C++ da Memset ve memcpy fonksiyonlarının Delphi Kullanım

Mesaj gönderen aegean »

@ertank hocam denedim fakat malesef calıstıramadım

Kod: Tümünü seç

    
    KeyParametersWithIV := TParametersWithIV.Create(TParameterUtilities.CreateKeyParameter('AES', Key), iv);
    Cipher.Init(True, KeyParametersWithIV); // init encryption cipher
kodunda Cipher.init asamasında

EArgumentCryptoLibException
Invalid Parameter Passed to AES Init - "TParametersWithIV"

hatası olusuyor
simdi aes128 ecb ile normalde iv kullanmıyoruz yani işleyiste iv bilgisi gitmiyor ama yukarıda denemelerını yaptıgım Dll li diger ornekte iv 32 byte ve içeriği 32 * $00 olarak gidiyor
ben sizin tarifiniz üzerine 16 byte olması için 16 tane $00 (yani c ile 0x00) gonderdim olmadı sonra nil denedim olmadı sonra 16 tane 0 gonderdim hatta key in aynısını gonderdim olmadı hatam nerde acaba ?
tesekkur ederim
aegean
Üye
Mesajlar: 41
Kayıt: 24 Tem 2019 09:32

Re: C++ da Memset ve memcpy fonksiyonlarının Delphi Kullanım

Mesaj gönderen aegean »

Pardon Hocam yaptıgım örneği de gondermem lazım tabi

Kod: Tümünü seç

procedure TForm1.Button1Click(Sender: TObject);
var
  key   :string;
  plain :string;
  coded :string;
  I     :string;
  key1 , iv: Tbytes;
  son : boolean;
  x : integer;
begin

  if length(keytext.Text)=16 then begin
    key:=keytext.Text;
  end else begin
    showmessage('Dogru Key giriniz');
    keytext.SetFocus;
    refresh;
    exit;
  end;

  if memotext.Text>'' then begin
    plain:=memotext.text;
  end else begin
    showmessage('Encode edilecek text yok lütfen girin');
    memotext.SetFocus;
    refresh;
    exit;
  end;

  //EncryptAES(const Key, IV: TBytes; const PlainText: string; out CryptBase64Text: string): Boolean;
  for x := 1 to 16 do I:=I+#00;

  key1:= TEncoding.unicode.GetBytes(key);
  Iv  := TEncoding.unicode.GetBytes(I);

  son := EncryptAES(key1 , iv, plain, coded);
  if son then begin
     memo2.text:=coded;
  end else memo2.Lines.Add('Basarısız  '+coded);

End;


function TForm1.EncryptAES(const Key, IV: TBytes; const PlainText: string; out CryptBase64Text: string): Boolean;
var
  Cipher: IBufferedCipher;
  KeyParametersWithIV: IParametersWithIV;
  Buf: TBytes;
  CryptBytes: TBytes;
begin
  try
    Cipher := TCipherUtilities.GetCipher('AES/ECB/PKCS7PADDING');
    KeyParametersWithIV := TParametersWithIV.Create(TParameterUtilities.CreateKeyParameter('AES', Key), iv);
    Cipher.Init(True, KeyParametersWithIV); // init encryption cipher
    Buf := TEncoding.ANSI.GetBytes(PlainText);
    CryptBytes := Cipher.DoFinal(Buf);
    CryptBase64Text := TBase64.Encode(CryptBytes);
  except on e:exception do begin
        memo3.Lines.Add(e.ClassName+' '+e.Message);
        e.CleanupInstance;
        Exit(False);
     end;
  end;
  Result := True;
end;
ertank
Kıdemli Üye
Mesajlar: 1650
Kayıt: 12 Eyl 2015 12:45

Re: C++ da Memset ve memcpy fonksiyonlarının Delphi Kullanım

Mesaj gönderen ertank »

Önceki kodlarda AES-CBC kodunu sadece GetChiper kısmını değiştirerek paylaşmışım. Aşağıdaki şekilde deneyebilir misiniz?

Kod: Tümünü seç

function Encrypt(const KeyBytes: TBytes; const PlainText: string; out CryptBase64Text: string): Boolean;
var
  Cipher: IBufferedCipher;
  KeyParameter: IKeyParameter;
  Buf: TBytes;
  CryptBytes: TBytes;
begin
  try
    Cipher := TCipherUtilities.GetCipher('AES/ECB/PKCS7PADDING');
    KeyBytes := TEncoding.UTF8.GetBytes(Key);
    KeyParameter := TParameterUtilities.CreateKeyParameter('AES', KeyBytes);
    Cipher.Init(True, KeyParameter); // init encryption cipher
    Buf := TEncoding.UTF8.GetBytes(PlainText);
    CryptBytes := Cipher.DoFinal(Buf);
    CryptBase64Text := TBase64.Encode(CryptBytes);
  except
    on E: Exception do
    begin
      Exit(False);
    end;
  end;
  Result := True;
end;

function Decrypt(const KeyBytes: TBytes; const CryptText: string; out PlainText: string): Boolean;
var
  Cipher: IBufferedCipher;
  KeyParameter: IKeyParameter;
  Buf: TBytes;
  PlainBytes: TBytes;
begin
  try
    Cipher := TCipherUtilities.GetCipher('AES/ECB/PKCS7PADDING');
    KeyParameter := TParameterUtilities.CreateKeyParameter('AES', KeyBytes);
    Cipher.Init(False, KeyParameter); // init decryption cipher
    Buf := TBase64.Decode(CryptText);
    PlainBytes := Cipher.DoFinal(Buf);
    PlainText := TEncoding.UTF8.GetString(PlainBytes);
  except
    on E: Exception do
    begin
      Exit(False);
    end;
  end;
  Result := True;
end;
aegean
Üye
Mesajlar: 41
Kayıt: 24 Tem 2019 09:32

Re: C++ da Memset ve memcpy fonksiyonlarının Delphi Kullanım

Mesaj gönderen aegean »

@ertank hocam Cok tesekkür ederim hemen deneyeceğim
iyi günler iyi çalısmalar dilerim
aegean
Üye
Mesajlar: 41
Kayıt: 24 Tem 2019 09:32

Re: C++ da Memset ve memcpy fonksiyonlarının Delphi Kullanım

Mesaj gönderen aegean »

@ertank hocam muhtesem oldu cok tesekkur ederim.
bu kutuphane cok iyiymis co az kod ile muhtesem sonuc veriyor
sizi rahatszı etmek istemem ama son bir sorum olsa size
aynı örneklerde DES için işlem yapmak istesem .getcipher('?????') parametresini ve key init i nasil yapmak lazım
yoksa DES için yapı değişiyormu ?

Özür dileyerek https://github.com/Xor-el/CryptoLib4Pascal sayfasında zaten DES algoritmasının olmadıgını sonradan gördüm
sadece DES için de bir tavsiyeniz olurmu diye sorumu değiştireyim
İyi günler iyi calsımalar dilerim Yardımlarınız için tekrar cok tesekkür ederim
ertank
Kıdemli Üye
Mesajlar: 1650
Kayıt: 12 Eyl 2015 12:45

Re: C++ da Memset ve memcpy fonksiyonlarının Delphi Kullanım

Mesaj gönderen ertank »

Eğer kendiniz DES kullanmayı planlıyor iseniz, kullanmayın. Günümüzde artık güvenilir değildir. Bu sebepten CryptoLib4Pascal içinde yok.

Zorunluluğunuz var ise DES için Delphi 10.4 ile Tools -> GetIt içindeki LockBox VCL and FMX 2021.05 kütüphanesini yükleyerek kullanabilirsiniz.
aegean
Üye
Mesajlar: 41
Kayıt: 24 Tem 2019 09:32

Re: C++ da Memset ve memcpy fonksiyonlarının Delphi Kullanım

Mesaj gönderen aegean »

Hocam tabiki kendim için değil ben kendim için Aes CBC 256 kulanırım bunlar programını yazdıgım endustrının uluslararası standardı oldugu için mecburen kullandıgım türler Tavsiyeniz için teşekkürler oradan deneyeyim
Yardımlarınız için teşekkür ederim iyi günler dilerim
Cevapla