หากคุณกำลังมองหาการเข้ารหัสใน Pascal on ARM, PowerPC หรือแพลตฟอร์มแปลกใหม่อื่น ๆ คุณมาถูกที่แล้ว หากคุณเป็นผู้ใช้ Delphi หรือต้องการใช้อัลกอริทึม Ciphers และ Hash ที่ทันสมัยมากขึ้นเช่น SHA-3 โปรดดูที่ที่เก็บข้อมูล DEC อย่างเป็นทางการ
Delphi Encryption Compendium (DEC) เป็นห้องสมุดเข้ารหัสสำหรับ Delphi, C ++ Builder และ Pascal ฟรี เดิมทีมันได้รับการพัฒนาโดย Hagen Reddmann ซึ่งเข้ากันได้กับ Delphi 2009 โดย Arvid Winkelsdorf และตอนนี้ได้รับการย้ายไปยัง Pascal ฟรี
มีการเปลี่ยนแปลงต่อไปนี้เกี่ยวกับการเปิดตัวปี 2008:
สภาพแวดล้อมต่อไปนี้ได้รับการทดสอบแล้ว:
ในทางเทคนิค Delphi 7+ และ FPC 2.6+ ควรเข้ากันได้ (อาจมีการเปลี่ยนแปลงเล็กน้อยสำหรับรุ่นเก่า)
โครงการนี้ได้รับใบอนุญาตภายใต้ใบขับขี่ MIT/ฟรีแวร์ คุณมีอิสระที่จะใช้ห้องสมุดเพื่อการใช้งานส่วนตัวและเชิงพาณิชย์ แต่มีความเสี่ยงเอง ดูใบอนุญาตสำหรับรายละเอียด
ธ.ค. ส่วนใหญ่ประกอบด้วยหน่วยต่อไปนี้:
นอกจากนี้ยังมีโครงการ Dectest ซึ่งรวมถึงกรณีทดสอบสำหรับอัลกอริทึมทั้งหมด
ธ.ค. ดั้งเดิมยังมีหน่วย ASN1 และ TypeInfoEx ซึ่งไม่จำเป็นสำหรับฟังก์ชั่นหลักของ ธ.ค. และยังไม่ได้รับการพอร์ต หากคุณต้องการพวกเขาโปรดนำพวกเขามาจากรุ่นเก่า
ตรวจสอบ 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 ไม่ได้รับการสนับสนุนโดยธันวาคม การใช้ DEC ร่วมกับห้องสมุด crypto อื่น ๆ นั้นเป็นไปได้แน่นอน แต่คุณต้องตรวจสอบให้แน่ใจว่าได้ประมวลผลล่วงหน้า (เช่นแผ่น) ข้อความธรรมดาอย่างถูกต้อง
หมายเหตุ: ประเภทไบนารีของ 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 สำหรับการสืบทอดคีย์ (เช่นสำหรับใช้เป็นปุ่มเซสชันใน ciphers)
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
ENCODE และ DECODE นั้นมีทั้งการโอเวอร์โหลดเพื่อใช้บัฟเฟอร์อินพุตที่ไม่ได้รับ