2012-01-17 31 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