2012-01-17 67 views
0

我通過Internet將數據發送爲TmemoryStream,現在我想使用簡單的算法對其進行加密。替換TMemoryStream中的字節

所以我想在tmemorystream中替換每個和每個字節來引用它。

看起來像

例如(以字節爲單位一個MemoryStream):

[123] [233] [122] [001] [123] [233] [122] [001] [123] [233] [122] [001]

例如(以ASCII密碼)

HI = [72] [73]

encription

[123 + 72] [233 + 73] [122 + 72] [001 + 73] [72 123+] [233 + 73] [122 + 72] [001 + 73] [123 + 72] [233 + 73] [122 + 72] [001 + 73]

終值 [195] [51] [194] [74] ...

我如何在使用Delphi的單個解析中做這種替換

如何在單個解析中替換memeorystream中的字節以實現此目的。

=======================更新====================== ========================

var pq: integer ; 
.... 
    LLine := // from a stream 

     //start blocjk 
      //my encription 
       p := LLine.Memory; 
        for i := 0 to LLine.Size-1 do 
        begin 

        pp := p^ ; 
        pq := pp + 72 ; 

        if pq > 255 then 
        begin 
        pq := pq - 255 ; 
        end; 
        P^ := Byte(pq) ; 


        inc(p); 
        end; 

       // my encription end 
       //my decription 
       LLine.Position := 0; 
     p := LLine.Memory; 
        for i := 0 to LLine.Size-1 do 
        begin 

        pp := p^ ; 
        pq := pp - 72 ; 

        if pq < 0 then 
        begin 
        pq := pq + 255 ; 
        end; 
        P^ := Byte(pq) ; 


        inc(p); 
        end; 
     //end 

     //end blocjk 





     Image1.Picture.Graphic.LoadFromStream(LLine); 
+0

你會如何分解[233 + 73] - > [51]回到[233 + 73]? – 2012-01-17 11:47:39

+0

@AlexK。你可以從51減去73(73是charowrd中的char)否則它將減少22的255 – VibeeshanRC 2012-01-17 11:55:26

+0

我不喜歡你的算法。更好地使用XOR加密,甚至更好地使用像RC4這樣的實際流加密,這很容易實現。 – kobik 2012-01-17 15:31:42

回答

10

TMemoryStream暴露了一個名爲Memory屬性指向流的第一個字節。所以,你可以做這樣的事情:

var 
    i: Integer; 
    p: ^Byte; 
... 
    p := MemoryStream.Memory; 
    for i := 0 to MemoryStream.Size-1 do 
    begin 
    EncryptByte(p^); 
    inc(p); 
    end; 

EncryptByte會這樣定義:

procedure EncryptByte(var b: Byte); 

,並修改它被就地通過字節。

對於你那些雞毛蒜皮的加密方案,你可以寫這樣的代碼:

p := MemoryStream.Memory; 
    for i := 0 to MemoryStream.Size-1 do 
    begin 
    inc(p^, 72 + (i mod 2)); 
    inc(p); 
    end; 

我一直有點懶這裏,並寫入修改直接進入循環,因爲它需要當前索引的知識。

您將需要確保爲該代碼塊禁用範圍檢查。


在你的代碼中的錯誤,在更新的問題,是需要由256而不是255轉移。

if pq > 255 then 
begin 
    pq := pq - 256; 
end; 

... 

if pq < 0 then 
begin 
    pq := pq + 256; 
end; 
+1

你還在找什麼?關於如何實現加密的想法? – 2012-01-17 12:18:50

+1

@vibeeshanRC你可以使用簡單的XOR加密算法,這裏有很多delphi的例子。 – ComputerSaysNo 2012-01-17 12:35:23

+0

如果您需要輕鬆隨機訪問,則可以將.Memory轉換爲PByteArray。 – arthurprs 2012-01-18 06:08:39