2016-07-04 88 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(); 
} 

,我得到预期

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

在chiperchar缓冲。

不幸的是,当我尝试使用DecryptStream功能上面chiper缓冲区,它不会创建普通数据流(流为0字节lenght)

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

什么我dooing错了吗?为什么DecrpytStream无法创建合适的流?

当我使用EncryptString和DecryptString函数时,一切正常,加密和解密后,我得到相同的字符串。

CODEC1属性是:

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

的Lockbox是一个Delphi加密库。这是什么语言? Java的? C++?你使用的是什么版本的Lockbox,你是从哪里获得的? –

+0

这是来自Embarcadero的C++ Builder 10 Seattle,LockBox 3.5.0版本源自IDE中的GetIt Package Manager构建。我试过使用DecryptStream和DecryptMemory函数。在这两种情况下,函数都不会填充plainStream(plainStream-> Lenght仍然为0)。 EncryptStream函数正常工作,以及EncryptString和DecryptString。您能否提供任何适用于C++或Delphi的演示代码? – Sebastor

+0

安装完成后,我不得不评论这一行“__property TOnGenerateKeyFunc OnCustomCipherGenerateKey = {read = FOnGenerateKeyFunc,write = FOnGenerateKeyFunc};”在Utplb_cryptographiclibrary.hpp文件中。这可能是这些问题的窍门吗? – Sebastor

回答

0

对不起,我不知道C++。我的语言是Delphi。

这个工程....

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; 

这是使用版本3.6.3从https://github.com/SeanBDurkin/tplockbox 这是德尔福,不C++

+0

感谢您的支持,但代码仍然不适用于C++ builder。 – Sebastor