2016-07-04 1 views
0

Lorsque je tente de coder des données binaires tout fonctionne bien:LockBox3 DecryptStream ne peut pas créer flux plaine

void __fastcall TForm1::EncryptBtnClick(TObject *Sender) 
{ 
    char plainchar[16]={0x00,0x01,0x02,0x03,0x04,0x05,0x06,0x07,0x08,0x09,0x0A,0x0B,0x0C,0x0D,0x0E,0x0F}; 
    char keychar[16]={0xE8,0xE9,0xEA,0xEB,0xED,0xEE,0xEF,0xF0,0xF2,0xF3,0xF4,0xF5,0xF7,0xF8,0xF9,0xFA}; 
    char chiperchar[16]; 

    TMemoryStream *plainStream; 
    TMemoryStream *chiperStream; 
    TMemoryStream *keyStream; 

    plainStream = new TMemoryStream(); 
    chiperStream = new TMemoryStream(); 
    keyStream = new TMemoryStream(); 

    plainStream->Clear(); 
    plainStream->Position=0; 
    plainStream->WriteBuffer(plainchar,16); 
    plainStream->Position=0; 

    keyStream->Clear(); 
    keyStream->Position=0; 
    keyStream->WriteBuffer(keychar,16); 
    keyStream->Position=0; 
    Codec1->Reset(); 
    Codec1->InitFromStream(keyStream); 

    Codec1->EncryptStream(plainStream,chiperStream); 

    chiperStream->Position=0; 
    chiperStream->ReadBuffer(chiperchar,16); 

    plainStream->Free(); 
    chiperStream->Free(); 
    keyStream->Free(); 
} 

et je me attendre

0x3E,0x45,0xC2,0x15,0xBA,0x45,0x0E,0xA6,0xEF,0x94,0xA3,0x08,0x82,0xB8,0x1B,0xD4 

dans un tampon chiperchar.

Malheureusement, lorsque je tente d'utiliser la fonction DecryptStream pour le tampon de Chiper ci-dessus, il ne crée pas de flux données brutes (flux est 0 octet longueur)

void __fastcall TForm1::DecryptBtnClick(TObject *Sender) 
{ 
char chiperchar[16]={0x3E,0x45,0xC2,0x15,0xBA,0x45,0x0E,0xA6,0xEF,0x94,0xA3,0x08,0x82,0xB8,0x1B,0xD4}; 
char keychar[16]={0xE8,0xE9,0xEA,0xEB,0xED,0xEE,0xEF,0xF0,0xF2,0xF3,0xF4,0xF5,0xF7,0xF8,0xF9,0xFA}; 
char plainchar[16]; 

TMemoryStream *plainStream; 
TMemoryStream *chiperStream; 
TMemoryStream *keyStream; 

plainStream = new TMemoryStream(); 
chiperStream = new TMemoryStream(); 
keyStream = new TMemoryStream(); 

chiperStream->Clear(); 
chiperStream->Position=0; 
chiperStream->WriteBuffer(chiperchar,16); 
chiperStream->Position=0; 

keyStream->Clear(); 
keyStream->Position=0; 
keyStream->WriteBuffer(keychar,16); 
keyStream->Position=0; 
Codec1->Reset(); 
Codec1->InitFromStream(keyStream); 

plainStream->Clear(); 
plainStream->Position=0; 

Codec1->DecryptStream(plainStream,chiperStream); 

plainStream->Position=0; 
chiperStream->Position=0; 

plainStream->Position=0; 
plainStream->ReadBuffer(plainchar,16); 

plainStream->Free(); 
chiperStream->Free(); 
keyStream->Free(); 
} 

Ce que je suis dooing mal? Pourquoi DecrpytStream ne peut pas créer un flux adéquat? Lorsque j'utilise les fonctions EncryptString et DecryptString, tout fonctionne correctement, et après le cryptage et le décryptage, j'obtiens la même chaîne.

propriétés Codec1 sont:

AsymetricKeySizeInBits = 128 
AdvancedOptions2 = [] 
CryptoLibrary = CryptographicLibrary1 
StreamCipherId = 'native.StreamToBlock' 
BlockCipherId = 'native.AES-128' 
ChainId = 'native.ECB' 
+0

Lockbox est une bibliothèque cryptographique Delphi. Quelle langue est-ce? Java? C++? Quelle version de Lockbox utilisez-vous et où l'avez-vous trouvé? –

+0

Ceci est C++ Builder 10 Seattle d'Embarcadero, LockBox version 3.5.0 a été généré à partir de GetIt Package Manager construire dans IDE. J'ai essayé d'utiliser les fonctions DecryptStream et DecryptMemory. Dans les deux cas, la fonction ne remplit pas plainStream (plainStream-> Lenght est toujours 0). La fonction EncryptStream fonctionne correctement, ainsi que EncryptString et DecryptString. Pouvez-vous s'il vous plaît fournir un code de démonstration de travail pour C++ ou Delphi? – Sebastor

+0

Après l'installation, j'ai dû commenter cette ligne "__property TOnGenerateKeyFunc OnCustomCipherGenerateKey = {read = FOnGenerateKeyFunc, write = FOnGenerateKeyFunc};" dans le fichier Utplb_cryptographiclibrary.hpp. Serait-ce le caouse de ces problèmes? – Sebastor

Répondre

0

Désolé, je ne sais pas C++. Ma langue est Delphi.

Cela fonctionne ....

procedure TForm30.Button1Click(Sender: TObject); 
const 
    chiperchar: utf8string = #$3E#$45#$C2#$15#$BA#$45#$0E#$A6#$EF#$94#$A3#$08#$82#$B8#$1B#$D4; 
    keychar : utf8string = #$E8#$E9#$EA#$EB#$ED#$EE#$EF#$F0#$F2#$F3#$F4#$F5#$F7#$F8#$F9#$FA; 
var 
    plainStream, chiperStream, keyStream: TMemoryStream; 
    OriginalPlainText: string; 
    ReconstructedPlainText: string; 

begin 
    plainStream := TMemoryStream.Create; 
    chiperStream := TMemoryStream.Create; 
    keyStream := TMemoryStream.Create; 
    try 
    OriginalPlainText := 'Your lips are smoother than vasoline.'; 
    Memo1.Lines.Add('Plaintext (passed as UTF-8 encoding) = "' + OriginalPlainText + '"'); 
    TPLB3.StreamUtils.String_to_stream(OriginalPlainText, plainStream, TEncoding.UTF8); 
    Memo1.Lines.Add('Length of plaintext = ' + IntToStr(plainStream.Size) + ' bytes.'); 
    keyStream.WriteBuffer(keychar[ Low(keychar)], Length(keychar)); 
    keyStream.Position := 0; 
    Codec1.InitFromStream(keyStream); 

    Codec1.EncryptStream(plainStream, chiperStream); 
    Memo1.Lines.Add('Base64 encoding of ciphertext = ' + TPLB3.StreamUtils.Stream_to_Base64(chiperStream)); 
    Memo1.Lines.Add('Length of ciphertext = ' + IntToStr(chiperStream.Size) + ' bytes.'); 

    Codec1.Reset; 
    chiperStream.Position := 0; 
    plainStream.Size := 0; 
    Codec1.DecryptStream(plainStream, chiperStream); 
    ReconstructedPlainText := TPLB3.StreamUtils.Stream_to_string(plainStream, TEncoding.UTF8); 
    Memo1.Lines.Add('Reconstructed plaintext = "' + ReconstructedPlainText + '"'); 

    finally 
    plainStream.Free; 
    chiperStream.Free; 
    keyStream.Free; 
    end 
end; 

Ce utilise la version 3.6.3 de https://github.com/SeanBDurkin/tplockbox Ceci est pour Delphi, C++ non

+0

Merci pour votre efford, mais le code ne fonctionne toujours pas avec C++ builder. – Sebastor