2016-07-04 10 views
0

를 만들 수 없습니다 :LockBox3 DecryptStream 일반 스트림

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(); 
} 

그리고 chiperchar 버퍼에

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

을 기대하세요. 내가 위에서 chiper 버퍼에 DecryptStream 기능을 사용하려고하면

불행하게도, 그것은 일반 데이터 스트림을 생성하지 않는 내가 잘못 dooing있어 무엇

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(); 
} 

(스트림은 0 바이트 아이폰에이다)? DecrpytStream이 적절한 스트림을 만들 수없는 이유는 무엇입니까?

EncryptString 및 DecryptString 함수를 사용할 때 모든 것이 올바르게 작동하고 암호화 및 암호 해독 후 동일한 문자열을 얻습니다.

Codec1의 속성은 다음과 같습니다, 나는 C++를 모르는

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

얽힌를 버전 3.6.3을하지 사용은 델파이 암호화 라이브러리입니다. 이것이 무슨 언어 지? 자바? C++? 어떤 버전의 Lockbox를 사용하고 있으며 어디에서 가져 왔습니까? –

+0

이것은 C++ Builder 10입니다. Embarcadero의 Seattle, LockBox 버전 3.5.0은 IDE의 GetIt Package Manager 빌드에서 제공했습니다. DecryptStream 및 DecryptMemory 함수를 사용해 보았습니다. 두 경우 모두 function이 plainStream을 채우지 않습니다 (plainStream-> Lenght는 여전히 0 임). EncryptStream 함수는 EncryptString 및 DecryptString뿐만 아니라 잘 작동합니다. C++이나 Delphi에서 작동하는 데모 코드를 제공해 주시겠습니까? – Sebastor

+0

설치 후이 줄을 주석 처리해야했습니다. "__property TOnGenerateKeyFunc OnCustomCipherGenerateKey = {read = FOnGenerateKeyFunc, write = FOnGenerateKeyFunc};" Utplb_cryptographiclibrary.hpp 파일에 있습니다. 이것이이 문제의 근원 일 수 있습니까? – Sebastor

답변

0

죄송합니다. 제 언어는 델파이입니다.

이 작동 ....

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; 

이것은, https://github.com/SeanBDurkin/tplockbox 이 델파이위한에서 C++

+0

당신의 efford 주셔서 감사합니다,하지만 코드는 여전히 C + + 빌더와 작동하지 않습니다. – Sebastor