如果您想在Pascal的手臂,PowerPC或其他異國情調的平台上進行密碼學,那麼您來了。如果您是Delphi用戶,或者想使用更多現代的密碼和哈希算法(例如SHA-3),請查看DEC官方存儲庫。
Delphi加密綱要(DEC)是Delphi,C ++建造者和Free Pascal的加密庫。它最初是由哈根·雷德曼(Hagen Reddmann)開發的,它與Arvid Winkelsdorf與Delphi 2009兼容,現在已移植到Pascal。
關於2008年版本已經進行了以下更改:
已經測試了以下環境:
從技術上講,Delphi 7+和FPC 2.6+應該兼容(舊版本可能需要非常小的更改)。
該項目是根據MIT/免費軟件許可證獲得許可的。您可以自由地使用圖書館進行個人和商業用途,但您自己有風險。有關詳細信息,請參見許可證。
DEC主要由以下單元組成:
此外,最新項目還包括了所有算法的測試用例。
原始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填充最後一個被截斷的塊! DEC不支持PKCS填充。當然,將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
編碼和解碼都被超載以進行非類型的輸入緩衝區。