2012-01-17 2 views
0

Я отправляю данные через Интернет как TmemoryStream, теперь я хочу зашифровать его с помощью простого алгоритма.Замена байтов в TMemoryStream

Так что я подумал о замене каждого байт в tmemorystream, чтобы его вписать.

выглядит

например, (а MemoryStream в байтах):

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

например (пароль в формате ASCII)

привет = [72] [73]

Шифрование

[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]? –

+0

@AlexK. вы можете вычесть 73 из 51 (73 - символ в passowrd), иначе это уменьшит 22 для 255 – VibeeshanRC

+0

Мне не нравится ваш алгоритм. лучше использовать XOR-шифрование или даже лучше использовать шифрование реального потока, например RC4, которое легко реализовать. – kobik

ответ

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

Что еще вы искали? Идеи о том, как реализовать шифрование? –

+1

@vibeeshanRC вы можете использовать простой алгоритм шифрования XOR, есть много примеров delphi. – ComputerSaysNo

+0

Если вам нужен простой случайный доступ, вы можете использовать .Memory для PByteArray. – arthurprs

Смежные вопросы