Если вы хотите сделать криптографию в Паскале на руке, PowerPC или других экзотических платформах, вы попали в нужное место. Если вы являетесь пользователем Delphi или хотите использовать более современные шифры и хэш-алгоритмы, такие как SHA-3, посмотрите на официальный репозиторий DEC.
Компендиум шифрования Delphi (DEC) - это криптографическая библиотека для Delphi, C ++ Builder и Free Pascal. Первоначально он был разработан Hagen Reddmann, совместимым с Delphi 2009 Arvid Winkelsdorf, и теперь был перенесен на бесплатный Pascal.
Следующие изменения были внесены в отношении выпуска 2008 года:
Следующие среды были протестированы:
Технически Delphi 7+ и FPC 2.6+ должны быть совместимы (возможно, очень незначительные изменения, необходимые для старых версий).
Этот проект лицензирован по лицензии MIT/Freeware. Вы можете использовать библиотеку для личного и коммерческого использования, но на ваш собственный риск. Смотрите лицензию для деталей.
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! PKCS Padding не поддерживается DEC. Использование DEC в сочетании с другими крипто -библиотеками, конечно, возможно, но вам нужно убедиться, что предварительно обработайте (т.е. 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
Encode и Decode оба перегружены, чтобы также взять нетипированный входной буфер.