ARM、PowerPC、またはその他のエキゾチックなプラットフォームでパスカルで暗号化をしたい場合は、適切な場所に来ました。 Delphiユーザーである場合、またはSHA-3などのより近代的な暗号やハッシュアルゴリズムを使用したい場合は、公式のDECリポジトリをご覧ください。
Delphi暗号化大要(DEC)は、Delphi、C ++ビルダー、無料のPascalの暗号化ライブラリです。もともとは、Hagen Reddmannによって開発され、Arvid WinkelsdorfによってDelphi 2009と互換性があり、現在はPascalを解放するために移植されています。
2008年のリリースに関して、以下の変更が行われました。
次の環境がテストされています。
技術的には、Delphi 7+およびFPC 2.6+が互換性があるはずです(古いバージョンには非常に小さな変更が必要です)。
このプロジェクトは、MIT/フリーウェアライセンスの下でライセンスされています。個人的および商業的に使用するためにライブラリを自由に使用できますが、あなた自身の責任です。詳細については、ライセンスを参照してください。
12月は主に次のユニットで構成されています。
さらに、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パディングは12月までにサポートされていません。もちろん、他のCryptoライブラリと組み合わせて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
エンコードとデコードはどちらも過負荷になり、無型入力バッファーも採取されます。