я использую Windows 8 64-бит, Delphi XE7 и
поэтому я начал делать собственное «демонстрационное» приложение, чтобы понять, как оно работает, и я также застрял, когда пытался расшифровать зашифрованную строку из заметки.
Генерация ключей
procedure TMainForm.Generate_RSA_Keys;
var
Signatory1: TSignatory;
codecRSA: TCodec;
CryptographicLibrary1: TCryptographicLibrary;
msPublic,msPrivate:TMemoryStream;
begin
Application.ProcessMessages;
//=================ini====================
codecRSA:=TCodec.Create(nil);
CryptographicLibrary1:=TCryptographicLibrary.Create(nil);
Signatory1:=TSignatory.Create(nil);
//=============TCodec===================
codecRSA.CryptoLibrary := CryptographicLibrary1;
codecRSA.StreamCipherId := 'native.RSA';
codecRSA.ChainModeId:= 'native.CBC';
codecRSA.AsymetricKeySizeInBits := 1024;
//====Signatory1=====================
Signatory1.Codec :=codecRSA;
//==========Save Keys==================
msPublic:=TMemoryStream.Create;
msPrivate:=TMemoryStream.Create;
if Signatory1.GenerateKeys then
begin
Signatory1.StoreKeysToStream(msPublic,[partPublic]);
Signatory1.StoreKeysToStream(msPrivate,[partPrivate]);
msPublic.SaveToFile(Keypath + PublicKey);
msPrivate.SaveToFile(Keypath + PrivateKey);
end;
msPublic.Free;
msPrivate.Free;
codecRSA.Free;
CryptographicLibrary1.Free;
Signatory1.Free;
end;
Шифровать
Call
EncryptMemoOutput.Lines.Add(EncryptRSA_String(EncryptMemoInput.Text));
Процедура
function TMainForm.EncryptRSA_String(str:string):String;
var
Signatory1: TSignatory;
codecRSA: TCodec;
CryptographicLibrary1: TCryptographicLibrary;
ms:TMemoryStream;
base64Ciphertext: string;
begin
Result :='';
//=================ini====================
codecRSA:=TCodec.Create(nil);
CryptographicLibrary1:=TCryptographicLibrary.Create(nil);
Signatory1:=TSignatory.Create(nil);
//=============TCodec===================
codecRSA.CryptoLibrary := CryptographicLibrary1;
codecRSA.StreamCipherId := 'native.RSA';
codecRSA.ChainModeId:= 'native.CBC';
codecRSA.AsymetricKeySizeInBits := 1024;
//====Signatory1=====================
Signatory1.Codec :=codecRSA;
//===Load public key=============
ms:=TMemoryStream.Create;
ms.LoadFromFile(Keypath + PublicKey);
Signatory1.LoadKeysFromStream(ms,[partPublic]);
codecRSA.EncryptString( str, base64Ciphertext);
codecRSA.EncryptUtf8string( str, base64Ciphertext);
Result := base64Ciphertext;
//==free===========
ms.Free;
codecRSA.Free;
CryptographicLibrary1.Free;
Signatory1.Free;
end;
Расшифровать (исключение «TSimpleCodec.Init Reset when not initalized» выдает строку codec.DecryptString(str, base64Ciphertext); )
function TMainForm.DecryptRSA_String(str:String):string ;
var
ms:TMemoryStream;
base64Ciphertext: String;
begin
Result :='';
codec.Reset;
//===Load public key=============
ms:=TMemoryStream.Create;
ms.LoadFromFile(Keypath + PrivateKey);
Signatory.LoadKeysFromStream(ms,[partPrivate]);
codec.DecryptString(str, base64Ciphertext);
Result := base64Ciphertext;
//==free===========
ms.Free;
end;
Так что я делаю неправильно? Я также пытался использовать «визуальные» компоненты вместо того, чтобы создавать их во время выполнения, как это делается в процедуре шифрования.
====================================================================
ОБНОВЛЕНИЕ ПН 10.08.2015
Когда я загружаю закрытые и открытые ключи через этот код, он работает
procedure TMainForm.Button6Click(Sender: TObject);
var
Store: TStream;
sRSAKeyFileName, Plain, a: String;
sPlaintext, sReconstructedPlaintext: string;
base64Ciphertext: String;
begin
sRSAKeyFileName := 'C:\Users\Robin\Desktop\Dateien\Development\OpenSSL\Delphi\Win32\Debug\Keys\Lockbox.key';
Store := TFileStream.Create( sRSAKeyFileName, fmOpenRead);
try
Store.Position := 0;
Signatory.LoadKeysFromStream( Store, [partPublic, partPrivate]);
sPlainText := 'I love LockBox 3!';
codec.EncryptString( sPlaintext, base64Ciphertext);
codec.DecryptString( sReconstructedPlaintext, base64Ciphertext);
ShowMessage(base64Ciphertext + #13#10 + sReconstructedPlaintext);
finally
Store.Free
end
end;
Когда я пытаюсь загрузить ключи serpatley, потому что я тоже сохранил их отдельно, они не работают
procedure TMainForm.btEncryptClick(Sender: TObject);
var
g, f: TFileStream;
s: String;
begin
g := TFileStream.Create('C:\Users\Robin\Desktop\Dateien\Development\OpenSSL\Delphi\Win32\Debug\Keys\public.key', fmOpenRead); //openssl key
g.Position := 0;
Signatory.LoadKeysFromStream(g, [partPublic]);
s := EncryptMemoInput.Text;
codec.EncryptString(s, sCryped);
EncryptMemoOutput.lines.Add(sCryped);
codec.Reset;
f := TFileStream.Create('C:\Users\Robin\Desktop\Dateien\Development\OpenSSL\Delphi\Win32\Debug\Keys\private.key', fmOpenRead);
Signatory.LoadKeysFromStream(f, [partPrivate]);
codec.EncryptString(sUncrypted, sCryped);
ShowMessage(sUncrypted);
g.Free;
f.Free;
end;
Шифрование строки работает, шифрование не выдает «TSimpleCodec.Init — сброс, если он не инициализирован».
Возникает, когда я вызываю «codec.EncryptString(sUncrypted, sCryped);»
И когда я закрываю приложение, оно выдает «TSimpleCodec.Init — невозможно установить шифр во время кодирования/дешифрования».
Encrypt
, но в коде вопроса нет ничего с этим именем. Как это может быть? - person David Heffernan   schedule 04.08.2015