Delphi Can

Orjinalini görmek için tıklayınız: AES Şifreleme Hakkında
Şu anda (Arşiv) modunu görüntülemektesiniz. Orjinal Sürümü Görüntüle internal link
Sayfalar: 1 2 3
Aşağıda örnek kodu paylaştığım PHP de aslında tek satırda bu işin ne kadar kolay olduğunu göreceksiniz. Şimdilik bunu kullanarak Delphi tarafına json olarak aktarıyorum ama bu çözümü kullanmak da istemiyorum. Delphi tarafında gerek forumda gerekse nette yaptığım araştırmalarda elde ettiğim kodların hiçbirisi bana nedense doğru çözümü vermedi. Denediğim kodlar bir türlü doğru şifreleme yapmıyor. AES-256-ECB olarak aşağıdaki gibi bana doğru şifreleme yapacak Delphi kodu aramaya devam ediyorum. Netice elde edebilirsem bunu da paylaşacağım.

function encrypt( $key, $plain ) {

    echo "\n iv=\t\t(binary as hex)\t". bin2hex( $iv ). "\tlength=". strlen( $iv );

    // By default OpenSSL already returns Base64, but it could be changed 
    // to binary with the 4th parameter, if we want.

$iv= '';

    $encryptedData= base64_encode ( openssl_encrypt( $plain, CIPHER, $key, $options=OPENSSL_RAW_DATA, $iv) );

    echo "\n encrypted=\t(Base64)\t". $encryptedData;

    // The encrypted data already came in Base64 - no need to encode it
    // again in Base64. Just concatenate it with the initialization
    // vector, which is the only part that should also be encoded to
    // Base64. And now we have a 7bit-safe ASCII text, which could be
    // easily inserted into emails.

    return $encryptedData;
}
Xor-el - CryptoLib4Pascal kütüphanesinde var AES şifreleme fakat delphi yeni sürümlerde hiç denemedim.
https://github.com/Xor-el/CryptoLib4Pascal
Örnek veri ve sonuç var mı?

Şu olabilir.
AES-256-ECB ile Key:=1234567890123456 veri:="test"
için sonucu paylaşır mısınız?
[attachment=2572]

[attachment=2573]

Android, iOS, Windows, macOS ve Linux platformlarında çalışıyor. Harici bir kütüphane kullanılmadı.
(13-02-2024, Saat: 12:48)tmrksmt Adlı Kullanıcıdan Alıntı: [ -> ]Aşağıda örnek kodu paylaştığım PHP de aslında tek satırda bu işin ne kadar kolay olduğunu göreceksiniz. ....

Tüm programlama dillerinde "base64" şifrelemesi (ki, key olmadan bu bir şifreleme değildir) hazır birer fonksiyondur. Kolay olması buradan geliyor. 

Eklediğim dll'i import edebilseydiniz, paylaştığınız php kodu gibi 3-5 satırdan ibaret basit bir Delphi kodu olacacaktı.
(13-02-2024, Saat: 14:08)engerex Adlı Kullanıcıdan Alıntı: [ -> ]Örnek veri ve sonuç var mı?

Şu olabilir.
AES-256-ECB ile Key:=1234567890123456 veri:="test"
için sonucu paylaşır mısınız?

verdiğiniz veriler ile aşağıdaki sonucu verdi bana,

KEY        : 1234567890123456 (16)
IV(bos)         :  (0)
DATA       : test (4)

ECB        : dfa12e17 (4)
CBC        : c6585d93 (4)

ECB_BASE64 : 36EuFw== (8)
CBC_BASE64 : xlhdkw== (8)

yada ;

KEY : 1234567890123456 (16)
IV(bos) : (0)
DATA : test (4)

ECB : 61bc9ce8 (4)
CBC : 50f83875 (4)

ECB_BASE64 : Ybyc6A== (8)
CBC_BASE64 : UPg4dQ== (8)
(09-02-2024, Saat: 19:43)3ddark Adlı Kullanıcıdan Alıntı: [ -> ]Bursa'daki şifreleme kütüphanesine bakın
https://github.com/MHumm/DelphiEncryptionCompendium
https://github.com/Delphier/TAES

https://github.com/Delphier/TAES
@3ddark paylaştığı linkteki örneği aşağıdaki gibi değiştirdiğimde : "zsBwXiUHqbiAFRun5ZwEHA=="
Bunu bir kontrol eder misin?
Kod:
 OriginalText := TEncoding.ANSI.GetBytes('test');
 Key := TEncoding.ANSI.GetBytes('12345678901234561234567890123456'); // 256 bits-32 bytes
 IV := TEncoding.ANSI.GetBytes(''); // 16 bytes

 EncryptedText := TAES.Encrypt(OriginalText, Key, 256, IV, cmECB, pmPKCS7);
 Memo1.Text := TNetEncoding.Base64.EncodeBytesToString(EncryptedText);
Aşağıdaki uygulama için https://fundementals.sourceforge.net/dl.html adresindeki Cipher sınıflarından yararlandım. AES için sadece cCipherAES.pas dosyasını kullanmak yetiyor ve son derece basit bir yapısı var. Fakat sadece 16 bayt lık veri için örnek hazırlamışlar ve 128bit. AesEncrypter adında yeni bir sınıf hazırlayarak 128/256 bit özelliği ekledim. Base64 ve Hex çıktıları verebiliyor. Standart olarak ECB yani elektronik kod kitaplığı kullanıyor. AES için 256 bit şifreleme yapacaksanız 32, 128 bit şifreleme yapacaksanız 16 baytlık özel anahtar belirtmeniz gerekiyor. Doğruluk testi için şifrelenmiş metni mümkün mertebe Copy to Clipboard butonu ile kopyalayın. Memo kontrolünün Wrap özelliğini kapatıp, Horizontal özelliğini açsamda metni bölümleme yapmaya devam etti. Bu durumda direk CRLF karakterleri ekleniyor.

Doğrulama için https://anycript.com/ adresini kullandım.

a3mrWJZ.png


JSON ifadesinin AES 256 Bit ile şifreleme örneği.
procedure TForm1.Button3Click(Sender: TObject);
var
 AESEncrypter: TAESEncrypter;
 SecretKey: Utf8String;
 EncText: Utf8String;
 JObject: TJSONObject;
 EncryptedText: String;
begin
 JObject := TJSONObject.Create
   .AddPair('username', TJSONString.Create('delphi.developer'))
   .AddPair('hash', TJSONString.Create('ed8e44a5eea79ac15208241091261124d67a81239689a243e0f88565c8c0f5cd'));
 EncText := JObject.ToJSON;
 JObject.Free;

 SecretKey := 'AAAAAAAAAAAAAAAABBBBBBBBBBBBBBBB';
 AESEncrypter := TAESEncrypter.Create(bt256, SecretKey, EncText);
 try
   EncryptedText := AESEncrypter.GetBase64String;
 finally
   AESEncrypter.Free;
 end;
end;


AES şifrelemede 128bit yahut 256bit anahtar kullansanız dahi, veri 16 baytlık yani 128 bitlik bloklar halinde şifreleniyor.
Buradan hareketle sizin şifreleme metniniz 16 bayt dan fazla ise Padding yani byte dolguları eklemeniz gerekiyor. Ve bunların belli bir dizilimi var.
AesEncrypter sınıfını yazarken bunları ayarlamak durumunda kaldım. Bu işlemlerin nasıl yapıldığını https://www.youtube.com/watch?v=3OTMLUEPZUc animasyonlu olarak ilgili youtube videosu ile keşfedebildim. İlgilenenler için son derece yararlı olabilir.

AesEncryper uygulama ve sınıflarına ait tüm kodlar makale ekinde mevcuttur.
Öncelikle tüm cevap yazan arkadaşlara çok teşekkür ederim.

(14-02-2024, Saat: 01:42)delphi.developer Adlı Kullanıcıdan Alıntı: [ -> ]Aşağıdaki uygulama için https://fundementals.sourceforge.net/dl.html adresindeki Cipher sınıflarından yararlandım. AES için sadece cCipherAES.pas dosyasını kullanmak yetiyor ve son derece basit bir yapısı var. Fakat sadece 16 bayt lık veri için örnek hazırlamışlar ve 128bit. AesEncrypter adında yeni bir sınıf hazırlayarak 128/256 bit özelliği ekledim. Base64 ve Hex çıktıları verebiliyor. Standart olarak ECB yani elektronik kod kitaplığı kullanıyor. AES için 256 bit şifreleme yapacaksanız 32, 128 bit şifreleme yapacaksanız 16 baytlık özel anahtar belirtmeniz gerekiyor. Doğruluk testi için şifrelenmiş metni mümkün mertebe Copy to Clipboard butonu ile kopyalayın. Memo kontrolünün Wrap özelliğini kapatıp, Horizontal özelliğini açsamda metni bölümleme yapmaya devam etti. Bu durumda direk CRLF karakterleri ekleniyor.

Doğrulama için https://anycript.com/ adresini kullandım.

a3mrWJZ.png


JSON ifadesinin AES 256 Bit ile şifreleme örneği.
procedure TForm1.Button3Click(Sender: TObject);
var
 AESEncrypter: TAESEncrypter;
 SecretKey: Utf8String;
 EncText: Utf8String;
 JObject: TJSONObject;
 EncryptedText: String;
begin
 JObject := TJSONObject.Create
   .AddPair('username', TJSONString.Create('delphi.developer'))
   .AddPair('hash', TJSONString.Create('ed8e44a5eea79ac15208241091261124d67a81239689a243e0f88565c8c0f5cd'));
 EncText := JObject.ToJSON;
 JObject.Free;

 SecretKey := 'AAAAAAAAAAAAAAAABBBBBBBBBBBBBBBB';
 AESEncrypter := TAESEncrypter.Create(bt256, SecretKey, EncText);
 try
   EncryptedText := AESEncrypter.GetBase64String;
 finally
   AESEncrypter.Free;
 end;
end;


AES şifrelemede 128bit yahut 256bit anahtar kullansanız dahi, veri 16 baytlık yani 128 bitlik bloklar halinde şifreleniyor.
Buradan hareketle sizin şifreleme metniniz 16 bayt dan fazla ise Padding yani byte dolguları eklemeniz gerekiyor. Ve bunların belli bir dizilimi var.
AesEncrypter sınıfını yazarken bunları ayarlamak durumunda kaldım. Bu işlemlerin nasıl yapıldığını https://www.youtube.com/watch?v=3OTMLUEPZUc animasyonlu olarak ilgili youtube videosu ile keşfedebildim. İlgilenenler için son derece yararlı olabilir.

AesEncryper uygulama ve sınıflarına ait tüm kodlar makale ekinde mevcuttur.

Kardeşim Allah razı olsun tam istediğim gibi doğru şifreleme yapan kolay bir çözüm sunmuşsun. İşimi gördü sağol, varol... 
Diğer arkadaşlara da çok teşekkür ederim.
(14-02-2024, Saat: 01:42)delphi.developer Adlı Kullanıcıdan Alıntı: [ -> ]Aşağıdaki uygulama için https://fundementals.sourceforge.net/dl.html adresindeki Cipher sınıflarından yararlandım. AES için sadece cCipherAES.pas dosyasını kullanmak yetiyor ve son derece basit bir yapısı var. Fakat sadece 16 bayt lık veri için örnek hazırlamışlar ve 128bit. AesEncrypter adında yeni bir sınıf hazırlayarak 128/256 bit özelliği ekledim. Base64 ve Hex çıktıları verebiliyor. Standart olarak ECB yani elektronik kod kitaplığı kullanıyor. AES için 256 bit şifreleme yapacaksanız 32, 128 bit şifreleme yapacaksanız 16 baytlık özel anahtar belirtmeniz gerekiyor. Doğruluk testi için şifrelenmiş metni mümkün mertebe Copy to Clipboard butonu ile kopyalayın. Memo kontrolünün Wrap özelliğini kapatıp, Horizontal özelliğini açsamda metni bölümleme yapmaya devam etti. Bu durumda direk CRLF karakterleri ekleniyor.

Doğrulama için https://anycript.com/ adresini kullandım.

a3mrWJZ.png


JSON ifadesinin AES 256 Bit ile şifreleme örneği.
procedure TForm1.Button3Click(Sender: TObject);
var
 AESEncrypter: TAESEncrypter;
 SecretKey: Utf8String;
 EncText: Utf8String;
 JObject: TJSONObject;
 EncryptedText: String;
begin
 JObject := TJSONObject.Create
   .AddPair('username', TJSONString.Create('delphi.developer'))
   .AddPair('hash', TJSONString.Create('ed8e44a5eea79ac15208241091261124d67a81239689a243e0f88565c8c0f5cd'));
 EncText := JObject.ToJSON;
 JObject.Free;

 SecretKey := 'AAAAAAAAAAAAAAAABBBBBBBBBBBBBBBB';
 AESEncrypter := TAESEncrypter.Create(bt256, SecretKey, EncText);
 try
   EncryptedText := AESEncrypter.GetBase64String;
 finally
   AESEncrypter.Free;
 end;
end;


AES şifrelemede 128bit yahut 256bit anahtar kullansanız dahi, veri 16 baytlık yani 128 bitlik bloklar halinde şifreleniyor.
Buradan hareketle sizin şifreleme metniniz 16 bayt dan fazla ise Padding yani byte dolguları eklemeniz gerekiyor. Ve bunların belli bir dizilimi var.
AesEncrypter sınıfını yazarken bunları ayarlamak durumunda kaldım. Bu işlemlerin nasıl yapıldığını https://www.youtube.com/watch?v=3OTMLUEPZUc animasyonlu olarak ilgili youtube videosu ile keşfedebildim. İlgilenenler için son derece yararlı olabilir.

AesEncryper uygulama ve sınıflarına ait tüm kodlar makale ekinde mevcuttur.

Hocam verdiğiniz örnek gerçekten çok güzel çalışıyor eline sağlık fakat geri dönüştürmeyi bulamadım şifreli veriyi nasıl geri çözümleyebilirim yardımlarınızı bekliyorum.
Sayfalar: 1 2 3