إذا كنت تتطلع إلى القيام بالتشفير في Pascal على ARM أو PowerPC أو غيرها من المنصات الغريبة ، فقد وصلت إلى المكان الصحيح. إذا كنت من مستخدمي Delphi أو ترغب في استخدام أصفار أكثر حداثة وخوارزميات التجزئة مثل SHA-3 ، فيرجى إلقاء نظرة على مستودع DEC الرسمي.
Compendium Delphi Encryption (DEC) عبارة عن مكتبة تشفير لـ Delphi و C ++ Builder و Pascal Free. تم تطويره في الأصل من قبل Hagen Reddmann ، تم التوافق مع Delphi 2009 بواسطة Arvid Winkelsdorf ، وقد تم نقله الآن إلى Pascal Free.
تم إجراء التغييرات التالية فيما يتعلق بإصدار 2008:
تم اختبار البيئات التالية:
من الناحية الفنية ، يجب أن تكون Delphi 7+ و FPC 2.6+ متوافقة (ربما تغييرات بسيطة للغاية مطلوبة للإصدارات القديمة).
تم ترخيص هذا المشروع بموجب ترخيص معهد ماساتشوستس للتكنولوجيا/Freeware. أنت حر في استخدام المكتبة للاستخدام الشخصي والتجاري ولكن على مسؤوليتك الخاصة. انظر الترخيص للحصول على التفاصيل.
يتكون DEC بشكل أساسي من الوحدات التالية:
علاوة على ذلك ، يتم تضمين مشروع Dectest ، والذي يوفر حالات اختبار لجميع الخوارزميات.
يحتوي DEC الأصلي أيضًا على وحدات ASN1 و TypeInfoex - تلك ليست مطلوبة للوظائف الأساسية لـ DEC ولم يتم نقلها. إذا كنت في حاجة إليها ، فيرجى الحصول عليها من إصدار أقدم.
تحقق من deccipher.pas لمزيد من التفاصيل حول هذه الأوضاع.
const
STATIC_KEY: array[0..15] of Byte = (0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15);
var
IV: array[0..15] of Byte;
Plaintext: Binary;
Ciphertext: TBytes;
begin
RandomSeed;
Plaintext := 'abcdefghijklmnopqrstuvwxyz';
with TCipher_Rijndael.Create do
try
Mode := cmCBCx;
RandomBuffer(IV, 16);
Init(STATIC_KEY, 16, IV, 16);
SetLength(Ciphertext, Length(Plaintext));
Encode(Plaintext[1], Ciphertext[0], Length(Plaintext));
Done; // only needed when same object will be used for further operations
FillChar(Plaintext[1], Length(Plaintext), 0);
Decode(Ciphertext[0], Plaintext[1], Length(Ciphertext));
Assert(Plaintext = 'abcdefghijklmnopqrstuvwxyz');
finally
Free;
end;
end;
ملاحظة: إذا لم يكن النص العادي مبطنًا ، فسيقوم DEC بتوفير آخر كتلة مقطوعة مع CFB8! PKCS Padding غير مدعوم من قبل ديسمبر. من الممكن بالطبع استخدام DEC بالتزامن مع مكتبات التشفير الأخرى ، ولكن عليك التأكد من المعالجة المسبقة (IE PAD) النص العادي بشكل صحيح.
ملاحظة أيضًا: يتم تعريف النوع الثنائي لشهر DEC على أنه RawByTestring. إذا كنت في بيئة Unicode (على سبيل المثال Delphi 2009+) ، ينصح الرعاية عند التعامل مع متغيرات string النوع. لا تمررهم مباشرة إلى وظيفة تأخذ ثنائية!
var
InputBuf: TBytes;
InputRawStr, Hash: Binary;
begin
SetLength(InputBuf, 4);
FillChar(InputBuf[0], 4, $AA);
Hash := THash_SHA256.CalcBuffer(InputBuf[0], 4, TFormat_MIME64);
// -> 2+0UzrAB0RDXZrkBPTtbv/rWkVR1qboHky0qwFeUTAQ=
InputRawStr := 'My message';
Hash := THash_SHA256.CalcBinary(InputRawStr, TFormat_HEXL);
// -> acc147c887e3b838ebf870c8779989fa8283eff5787b57f1acb35cac63244a81
Hash := THash_SHA256.CalcBinary(InputRawStr, TFormat_Copy);
// -> Hash contains ac c1 47 ... raw bytes. Can be copied to a 32 bytes array using Move(Hash[1], HashBytes[0], 32);
end;
تحتوي كل فئة من فئة التجزئة أيضًا على وظائف تسمى KDF2 و KDFX للاشتقاق الرئيسي (على سبيل المثال لاستخدامها كمفاتيح جلسة في الأصفار).
Writeln(TFormat_MIME64.Encode('My message'));
// -> TXkgbWVzc2FnZQ==
Writeln(TFormat_MIME64.Decode('TXkgbWVzc2FnZQ=='));
// -> My message
Writeln(TFormat_PGP.Encode('Hello, how are you today?'));
// -> SGVsbG8sIGhvdyBhcmUgeW91IHRvZGF5Pw== <line break> =nUAA
تشفير وفك الشفرة كلاهما محمّلان أيضًا لاتخاذ مخزن مؤقت للإدخال غيره.