如果您想在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
编码和解码都被超载以进行非类型的输入缓冲区。