哪个版本的LockBox3 可以在Delphi2010 下运行?
Which version of LockBox3 works under Delphi2010?
因为我正在寻找 AES-128 加密,所以我想在 Delphi2010 上安装 Lockbox3 运行ning。
这里的第一个问题:What/where是官方来源吗?
来自 https://sourceforge.net/projects/tplockbox/ 的源代码不包含 Delphi2010 的包,也根本不编译(大量错误)。
https://code.google.com/archive/p/tplockbox/ is not maintained anymore and points to https://github.com/SeanBDurkin/tplockbox.
我从 github 下载了源代码,我想是在 V3.6.3 中(源代码中没有提到版本,对吧?)。可以安装软件包,但是例如MakeSampleKey 示例无法编译,因为 EncryptString 不适用于 AnsiStrings(umfmMakeSampleKey.pas,第 216 行)。
然后我创建了一个项目并使用了 How to AES-128 encrypt a string using a password in Delphi and decrypt in C#?
的 OP 中的源代码
我将 CipherText 从 AnsiString 更改为 String。代码可以编译,但是当我 运行 它时,它在 TPLB3.SHA1.pas,第 264 行 "Integer overflow" 中崩溃。
LockBox3 是否还在维护,是否可用于 Delphi2010?如果是,那么如何?我做错了什么?谢谢!
编辑: 还有另一个 GitHub 托管 LockBox3 的项目,即 https://github.com/TurboPack/LockBox3
最近来自那里的资源 NOT 在 Delphi2010 下编译。 (有关问题的简短列表,请参阅 OP 下的评论)
编辑: 这是我尝试使用(但失败)的一些代码 - 我 post 它在这里,因为我无法 post 它格式化成评论:
function LockBox3_EncryptText_AES_128(input: string; password: string): string;
var
Codec: TCodec;
CipherText: String;
begin
Codec := TCodec.Create(nil);
try
Codec.CryptoLibrary := TCryptographicLibrary.Create(Codec);
Codec.StreamCipherId := BlockCipher_ProgID;
Codec.BlockCipherId := Format(AES_ProgId, [128]);
Codec.ChainModeId := CBC_ProgId;
Codec.Password := Password;
Codec.EncryptString(input, CipherText);
Result := string(CipherText);
finally
Codec.Free;
end;
end;
我将 LockBox 3 维护在 http://lockbox.seanbdurkin.id.au/HomePage 。
回购位于 https://github.com/SeanBDurkin/tplockbox 。
是的,适用于 D2010。
更新
这对我有用,Delphi 2010 和 TPLB3 版本 3.6.3
program LB3Demo_D2010;
{$APPTYPE CONSOLE}
uses
SysUtils,
TPLB3.Codec in '..\ExternalLibraries\TPLB3\run\TPLB3.Codec.pas',
TPLB3.CryptographicLibrary in '..\ExternalLibraries\TPLB3\run\TPLB3.CryptographicLibrary.pas',
TPLB3.BlockCipher in '..\ExternalLibraries\TPLB3\run\TPLB3.BlockCipher.pas',
TPLB3.StreamToBlock in '..\ExternalLibraries\TPLB3\run\TPLB3.StreamToBlock.pas',
TPLB3.Decorators in '..\ExternalLibraries\TPLB3\run\TPLB3.Decorators.pas',
TPLB3.StreamCipher in '..\ExternalLibraries\TPLB3\run\TPLB3.StreamCipher.pas',
TPLB3.StreamUtils in '..\ExternalLibraries\TPLB3\run\TPLB3.StreamUtils.pas',
TPLB3.Random in '..\ExternalLibraries\TPLB3\run\TPLB3.Random.pas',
TPLB3.IntegerUtils in '..\ExternalLibraries\TPLB3\run\TPLB3.IntegerUtils.pas',
TPLB3.Compatibility in '..\ExternalLibraries\TPLB3\run\TPLB3.Compatibility.pas',
TPLB3.Asymetric in '..\ExternalLibraries\TPLB3\run\TPLB3.Asymetric.pas',
TPLB3.CodecIntf in '..\ExternalLibraries\TPLB3\run\TPLB3.CodecIntf.pas',
TPLB3.BaseNonVisualComponent in '..\ExternalLibraries\TPLB3\run\TPLB3.BaseNonVisualComponent.pas',
TPLB3.Hash in '..\ExternalLibraries\TPLB3\run\TPLB3.Hash.pas',
TPLB3.HashDsc in '..\ExternalLibraries\TPLB3\run\TPLB3.HashDsc.pas',
TPLB3.AES in '..\ExternalLibraries\TPLB3\run\TPLB3.AES.pas',
TPLB3.Base64 in '..\ExternalLibraries\TPLB3\run\TPLB3.Base64.pas',
TPLB3.CBC in '..\ExternalLibraries\TPLB3\run\TPLB3.CBC.pas',
TPLB3.Constants in '..\ExternalLibraries\TPLB3\run\TPLB3.Constants.pas',
TPLB3.ECB in '..\ExternalLibraries\TPLB3\run\TPLB3.ECB.pas',
TPLB3.MD5 in '..\ExternalLibraries\TPLB3\run\TPLB3.MD5.pas',
TPLB3.SimpleBlockCipher in '..\ExternalLibraries\TPLB3\run\TPLB3.SimpleBlockCipher.pas',
TPLB3.I18n in '..\ExternalLibraries\TPLB3\run\TPLB3.I18n.pas',
TPLB3.CFB_8Bit in '..\ExternalLibraries\TPLB3\run\TPLB3.CFB_8Bit.pas',
TPLB3.CFB_Block in '..\ExternalLibraries\TPLB3\run\TPLB3.CFB_Block.pas',
TPLB3.CTR in '..\ExternalLibraries\TPLB3\run\TPLB3.CTR.pas',
TPLB3.OFB in '..\ExternalLibraries\TPLB3\run\TPLB3.OFB.pas',
TPLB3.PCBC in '..\ExternalLibraries\TPLB3\run\TPLB3.PCBC.pas',
TPLB3.SHA1 in '..\ExternalLibraries\TPLB3\run\TPLB3.SHA1.pas',
TPLB3.SHA2 in '..\ExternalLibraries\TPLB3\run\TPLB3.SHA2.pas',
TPLB3.SVN_Keywords in '..\ExternalLibraries\TPLB3\run\TPLB3.SVN_Keywords.pas',
TPLB3.BinaryUtils in '..\ExternalLibraries\TPLB3\run\TPLB3.BinaryUtils.pas',
TPLB3.PointerArithmetic in '..\ExternalLibraries\TPLB3\run\TPLB3.PointerArithmetic.pas',
TPLB3.CipherUtils in '..\ExternalLibraries\TPLB3\run\TPLB3.CipherUtils.pas',
TPLB3.RSA_Engine in '..\ExternalLibraries\TPLB3\run\TPLB3.RSA_Engine.pas',
TPLB3.RSA_Primitives in '..\ExternalLibraries\TPLB3\run\TPLB3.RSA_Primitives.pas',
TPLB3.HugeCardinal in '..\ExternalLibraries\TPLB3\run\TPLB3.HugeCardinal.pas',
TPLB3.HugeCardinalUtils in '..\ExternalLibraries\TPLB3\run\TPLB3.HugeCardinalUtils.pas',
TPLB3.MemoryStreamPool in '..\ExternalLibraries\TPLB3\run\TPLB3.MemoryStreamPool.pas',
TPLB3.DES in '..\ExternalLibraries\TPLB3\run\TPLB3.DES.pas',
TPLB3.BlowFish in '..\ExternalLibraries\TPLB3\run\TPLB3.BlowFish.pas',
TPLB3.TDES in '..\ExternalLibraries\TPLB3\run\TPLB3.TDES.pas',
TPLB3.TwoFish in '..\ExternalLibraries\TPLB3\run\TPLB3.TwoFish.pas',
TPLB3.XXTEA in '..\ExternalLibraries\TPLB3\run\TPLB3.XXTEA.pas',
TPLB3.DCP.twofish_Modified in '..\ExternalLibraries\TPLB3\run\TPLB3.DCP.twofish_Modified.pas';
const
/// <remarks>Set isProduction to True for a production environment.
/// For a production environment, we want to randomize the PRNG at start-up,
/// for security reasons. For a test environment, we may way to set the seed
/// to be a fixed known value, for purposes of reproducibility and possibly
/// KAT alignment.
/// </remarks>
isProduction: boolean = False;
Seed_ForNonProduction: int64 = 1;
function LockBox3_EncryptText_AES_128( input: string; password: string): string;
var
Codec: TCodec;
begin
Codec := TCodec.Create( nil);
try
Codec.CryptoLibrary := TCryptographicLibrary.Create(Codec);
Codec.StreamCipherId := BlockCipher_ProgID;
Codec.BlockCipherId := Format(AES_ProgId, [128]);
Codec.ChainModeId := CBC_ProgId;
Codec.Password := Password;
Codec.EncryptString( input, result);
Codec.Burn
finally
Codec.Free
end
end;
var
input, output: string;
password: string;
begin
try
if isProduction then
TRandomStream.Instance.Randomize
else
TRandomStream.Instance.Seed := Seed_ForNonProduction;
input := 'Hello world';
WriteLn( 'Compiler = ', Format( '%.1f', [CompilerVersion]));
WriteLn( 'Plaintext = "' + input + '"');
password := 'my-secret';
WriteLn( 'Password (' + {$IFDEF UNICODE} 'UTF-16' {$ELSE} 'UTF-8' {$ENDIF} + ') = "' + password + '"');
WriteLn( 'Seed = ', TRandomStream.Instance.Seed);
output := LockBox3_EncryptText_AES_128( input, password);
Writeln( 'Ciphertext (encoded as base64) = "' + output + '"');
WriteLn( 'Press enter to terminate.');
Readln;
except
on E: Exception do
Writeln(E.ClassName, ': ', E.Message);
end;
end.
输出
当 运行 时,输出产生 ...
Compiler = 21.0
Plaintext = "Hello world"
Password (UTF-16) = "my-secret"
Seed = 1
Ciphertext (encoded as base64) = "AQAAAAAAAADCpkdd/g8fyEuojQ=="
因为我正在寻找 AES-128 加密,所以我想在 Delphi2010 上安装 Lockbox3 运行ning。
这里的第一个问题:What/where是官方来源吗?
来自 https://sourceforge.net/projects/tplockbox/ 的源代码不包含 Delphi2010 的包,也根本不编译(大量错误)。
https://code.google.com/archive/p/tplockbox/ is not maintained anymore and points to https://github.com/SeanBDurkin/tplockbox.
我从 github 下载了源代码,我想是在 V3.6.3 中(源代码中没有提到版本,对吧?)。可以安装软件包,但是例如MakeSampleKey 示例无法编译,因为 EncryptString 不适用于 AnsiStrings(umfmMakeSampleKey.pas,第 216 行)。
然后我创建了一个项目并使用了 How to AES-128 encrypt a string using a password in Delphi and decrypt in C#?
的 OP 中的源代码我将 CipherText 从 AnsiString 更改为 String。代码可以编译,但是当我 运行 它时,它在 TPLB3.SHA1.pas,第 264 行 "Integer overflow" 中崩溃。
LockBox3 是否还在维护,是否可用于 Delphi2010?如果是,那么如何?我做错了什么?谢谢!
编辑: 还有另一个 GitHub 托管 LockBox3 的项目,即 https://github.com/TurboPack/LockBox3 最近来自那里的资源 NOT 在 Delphi2010 下编译。 (有关问题的简短列表,请参阅 OP 下的评论)
编辑: 这是我尝试使用(但失败)的一些代码 - 我 post 它在这里,因为我无法 post 它格式化成评论:
function LockBox3_EncryptText_AES_128(input: string; password: string): string;
var
Codec: TCodec;
CipherText: String;
begin
Codec := TCodec.Create(nil);
try
Codec.CryptoLibrary := TCryptographicLibrary.Create(Codec);
Codec.StreamCipherId := BlockCipher_ProgID;
Codec.BlockCipherId := Format(AES_ProgId, [128]);
Codec.ChainModeId := CBC_ProgId;
Codec.Password := Password;
Codec.EncryptString(input, CipherText);
Result := string(CipherText);
finally
Codec.Free;
end;
end;
我将 LockBox 3 维护在 http://lockbox.seanbdurkin.id.au/HomePage 。
回购位于 https://github.com/SeanBDurkin/tplockbox 。
是的,适用于 D2010。
更新
这对我有用,Delphi 2010 和 TPLB3 版本 3.6.3
program LB3Demo_D2010;
{$APPTYPE CONSOLE}
uses
SysUtils,
TPLB3.Codec in '..\ExternalLibraries\TPLB3\run\TPLB3.Codec.pas',
TPLB3.CryptographicLibrary in '..\ExternalLibraries\TPLB3\run\TPLB3.CryptographicLibrary.pas',
TPLB3.BlockCipher in '..\ExternalLibraries\TPLB3\run\TPLB3.BlockCipher.pas',
TPLB3.StreamToBlock in '..\ExternalLibraries\TPLB3\run\TPLB3.StreamToBlock.pas',
TPLB3.Decorators in '..\ExternalLibraries\TPLB3\run\TPLB3.Decorators.pas',
TPLB3.StreamCipher in '..\ExternalLibraries\TPLB3\run\TPLB3.StreamCipher.pas',
TPLB3.StreamUtils in '..\ExternalLibraries\TPLB3\run\TPLB3.StreamUtils.pas',
TPLB3.Random in '..\ExternalLibraries\TPLB3\run\TPLB3.Random.pas',
TPLB3.IntegerUtils in '..\ExternalLibraries\TPLB3\run\TPLB3.IntegerUtils.pas',
TPLB3.Compatibility in '..\ExternalLibraries\TPLB3\run\TPLB3.Compatibility.pas',
TPLB3.Asymetric in '..\ExternalLibraries\TPLB3\run\TPLB3.Asymetric.pas',
TPLB3.CodecIntf in '..\ExternalLibraries\TPLB3\run\TPLB3.CodecIntf.pas',
TPLB3.BaseNonVisualComponent in '..\ExternalLibraries\TPLB3\run\TPLB3.BaseNonVisualComponent.pas',
TPLB3.Hash in '..\ExternalLibraries\TPLB3\run\TPLB3.Hash.pas',
TPLB3.HashDsc in '..\ExternalLibraries\TPLB3\run\TPLB3.HashDsc.pas',
TPLB3.AES in '..\ExternalLibraries\TPLB3\run\TPLB3.AES.pas',
TPLB3.Base64 in '..\ExternalLibraries\TPLB3\run\TPLB3.Base64.pas',
TPLB3.CBC in '..\ExternalLibraries\TPLB3\run\TPLB3.CBC.pas',
TPLB3.Constants in '..\ExternalLibraries\TPLB3\run\TPLB3.Constants.pas',
TPLB3.ECB in '..\ExternalLibraries\TPLB3\run\TPLB3.ECB.pas',
TPLB3.MD5 in '..\ExternalLibraries\TPLB3\run\TPLB3.MD5.pas',
TPLB3.SimpleBlockCipher in '..\ExternalLibraries\TPLB3\run\TPLB3.SimpleBlockCipher.pas',
TPLB3.I18n in '..\ExternalLibraries\TPLB3\run\TPLB3.I18n.pas',
TPLB3.CFB_8Bit in '..\ExternalLibraries\TPLB3\run\TPLB3.CFB_8Bit.pas',
TPLB3.CFB_Block in '..\ExternalLibraries\TPLB3\run\TPLB3.CFB_Block.pas',
TPLB3.CTR in '..\ExternalLibraries\TPLB3\run\TPLB3.CTR.pas',
TPLB3.OFB in '..\ExternalLibraries\TPLB3\run\TPLB3.OFB.pas',
TPLB3.PCBC in '..\ExternalLibraries\TPLB3\run\TPLB3.PCBC.pas',
TPLB3.SHA1 in '..\ExternalLibraries\TPLB3\run\TPLB3.SHA1.pas',
TPLB3.SHA2 in '..\ExternalLibraries\TPLB3\run\TPLB3.SHA2.pas',
TPLB3.SVN_Keywords in '..\ExternalLibraries\TPLB3\run\TPLB3.SVN_Keywords.pas',
TPLB3.BinaryUtils in '..\ExternalLibraries\TPLB3\run\TPLB3.BinaryUtils.pas',
TPLB3.PointerArithmetic in '..\ExternalLibraries\TPLB3\run\TPLB3.PointerArithmetic.pas',
TPLB3.CipherUtils in '..\ExternalLibraries\TPLB3\run\TPLB3.CipherUtils.pas',
TPLB3.RSA_Engine in '..\ExternalLibraries\TPLB3\run\TPLB3.RSA_Engine.pas',
TPLB3.RSA_Primitives in '..\ExternalLibraries\TPLB3\run\TPLB3.RSA_Primitives.pas',
TPLB3.HugeCardinal in '..\ExternalLibraries\TPLB3\run\TPLB3.HugeCardinal.pas',
TPLB3.HugeCardinalUtils in '..\ExternalLibraries\TPLB3\run\TPLB3.HugeCardinalUtils.pas',
TPLB3.MemoryStreamPool in '..\ExternalLibraries\TPLB3\run\TPLB3.MemoryStreamPool.pas',
TPLB3.DES in '..\ExternalLibraries\TPLB3\run\TPLB3.DES.pas',
TPLB3.BlowFish in '..\ExternalLibraries\TPLB3\run\TPLB3.BlowFish.pas',
TPLB3.TDES in '..\ExternalLibraries\TPLB3\run\TPLB3.TDES.pas',
TPLB3.TwoFish in '..\ExternalLibraries\TPLB3\run\TPLB3.TwoFish.pas',
TPLB3.XXTEA in '..\ExternalLibraries\TPLB3\run\TPLB3.XXTEA.pas',
TPLB3.DCP.twofish_Modified in '..\ExternalLibraries\TPLB3\run\TPLB3.DCP.twofish_Modified.pas';
const
/// <remarks>Set isProduction to True for a production environment.
/// For a production environment, we want to randomize the PRNG at start-up,
/// for security reasons. For a test environment, we may way to set the seed
/// to be a fixed known value, for purposes of reproducibility and possibly
/// KAT alignment.
/// </remarks>
isProduction: boolean = False;
Seed_ForNonProduction: int64 = 1;
function LockBox3_EncryptText_AES_128( input: string; password: string): string;
var
Codec: TCodec;
begin
Codec := TCodec.Create( nil);
try
Codec.CryptoLibrary := TCryptographicLibrary.Create(Codec);
Codec.StreamCipherId := BlockCipher_ProgID;
Codec.BlockCipherId := Format(AES_ProgId, [128]);
Codec.ChainModeId := CBC_ProgId;
Codec.Password := Password;
Codec.EncryptString( input, result);
Codec.Burn
finally
Codec.Free
end
end;
var
input, output: string;
password: string;
begin
try
if isProduction then
TRandomStream.Instance.Randomize
else
TRandomStream.Instance.Seed := Seed_ForNonProduction;
input := 'Hello world';
WriteLn( 'Compiler = ', Format( '%.1f', [CompilerVersion]));
WriteLn( 'Plaintext = "' + input + '"');
password := 'my-secret';
WriteLn( 'Password (' + {$IFDEF UNICODE} 'UTF-16' {$ELSE} 'UTF-8' {$ENDIF} + ') = "' + password + '"');
WriteLn( 'Seed = ', TRandomStream.Instance.Seed);
output := LockBox3_EncryptText_AES_128( input, password);
Writeln( 'Ciphertext (encoded as base64) = "' + output + '"');
WriteLn( 'Press enter to terminate.');
Readln;
except
on E: Exception do
Writeln(E.ClassName, ': ', E.Message);
end;
end.
输出
当 运行 时,输出产生 ...
Compiler = 21.0
Plaintext = "Hello world"
Password (UTF-16) = "my-secret"
Seed = 1
Ciphertext (encoded as base64) = "AQAAAAAAAADCpkdd/g8fyEuojQ=="