2011-07-31 5 views
-1

XOR로 암호화하고 16 진수로 표현할 수있는 방법이 있습니까? (나는 그렇지 않다고 생각한다).델파이 : XOR, HEX, 암호화

대안이 있습니까? 나는 Base64를 사용하고 싶지 않다.

그래서 암호화하고 결과를 읽을 수있는 형식으로 나타내야합니다.

+2

Base64로 물건이 유형에 대한 가장 일반적인 인코딩입니다. 암호화를위한 일반 XOR은 전혀 안전하지 않습니다. 문제를보다 명확하게 진술하십시오. 나는 그것이 당신이 무엇인지를 생각하기가 힘듭니다. – Mat

+0

xor 암호화를 호출하는 것은 약간의 스트레칭입니다. 그리고 base64의 문제점은 무엇입니까? 귀하의 의견은 어떤 형식입니까? –

+0

어떤 종류의 입력 데이터가 필요하십니까? 끈? rawbytestring? 메모리 포인터? 어떤 버전의 Dephi? –

답변

1

여기에 열을인가 XOR 함수이며, 다음 진수로 결과를 리턴 :

function XorToHex(const Source: string; Code: char): string; 
const 
    HexChars: array[0..15] of char = 'ABCDEF'; 
var i: Integer; 
    c: Integer; 
begin 
    SetLength(Result,Length(Source)*(sizeof(char)*2)); 
    for i := 1 to Length(Source) do begin 
    c := Ord(Source[i]) xor Ord(Code); 
    {$IFDEF UNICODE} 
    result[i*4-3] := HexChars[(c and 7) shr 4]; 
    result[i*4-2] := HexChars[(c and 7) and 15]; 
    c := c shr 8; 
    result[i*4-1] := HexChars[c shr 4]; 
    result[i*4] := HexChars[c and 15]; 
    {$ELSE} 
    result[i*2-1] := HexChars[c shr 4]; 
    result[i*2] := HexChars[c and 15]; 
    {$ENDIF} 
    end; 
end; 

이러한 기본적인 XOR이 전혀 강하다. 키 코드를 추측하는 것은 매우 쉽습니다. 이것은 오직 하나의 Char입니다.

그러나이 함수는 유니 코드 문자열과 유니 코드 문자열 모두에서 작동하지 않습니다.

+2

'* {$ IFDEF UNICODE} 4 {$ ELSE} 2 {$ ENDIF}'부분을 좋아하지 않습니다. 올바른 방법은 다음과 같습니다.'SizeOf (Char) * 2', IMO. 그것은 또한 상수로 접혀 있지만 훨씬 더 읽기 쉽습니다. –

+0

내장 된 변환 함수를 사용하지 않는 이유는 무엇입니까? –

+0

@ Rudy 네 말이 맞아. 나는 이것을 바로 잡았다. 이 함수는 SO에서 직접 작성했습니다. –

0

XOR 암호화는 스트림 사이퍼 (Stream Cypher)라고하며 다른 버전의 Google을 사용할 수 있습니다.

바이트 배열을 16 진수로 변환하는 것은 16 진수의 각 개별 바이트를 0x00에서 0x0F 바이트의 제로 패딩으로 표현하는 것입니다.

이러한 문제가 정확히 무엇입니까?

+2

일반 XOR은 스트림 암호라고 할 수 있지만 스트림 암호는 더 넓은 개념이며 XOR뿐만 아니라 암호 클래스입니다. 예를 들어 인기있는 RC4 알고리즘은 스트림 암호입니다. – kludg

+0

그리고 RC4도 XOR 사이퍼입니다. RC4 엔진은 cipher 텍스트를 생성하기 위해 일반 텍스트와 XOR 처리되는 키 스트림을 생성합니다. – rossum

+0

스트림 암호를 XOR 암호라고 부르는 것에는별로 좋아하지 않습니다. XOR을 사용하는 것은 스트림 암호에 대해 강제는 아니지만 가장 일반적인 형식의 스트림 암호입니다. 스트림 암호는 의사 랜덤 비트 스트림을 생성하는 것입니다. XOR을 사용하면 구현이 약간 자세합니다. – kludg

0

xor 암호화를위한 이진 함수를 사용하면 사람의 암호화가 약합니다. 간단하고 빠르지 만 인코딩 마스크 키를 쉽게 찾을 수 있습니다. 여기

당신의이 간단한 테스트 케이스 :

program Projecth1; 
{$APPTYPE CONSOLE} 
uses SysUtils; 

var 
    Mask :cardinal = $12345678; 
    n  :cardinal; 
begin 
    n := $11223344; 
    writeln('input: $' + IntToHex(n, 8)); 
    n := n xor Mask; 
    writeln('encode: $' + IntToHex(n, 8)); 
    n := n xor Mask; 
    writeln('decode: $' + IntToHex(n, 8)); 
    readln; 
end. 

이 테스트 케이스 사용 32 비트 마스크와 32 비트 입력하면 보안 수준을 높이기 위해 다른 기능 이상 마스크 배열을 생성 할 수 있습니다.

0

여러분 모두는 xor 암호화가 얼마나 약한 지 지적하지만 여러분 모두는 xor에 단일 값을 사용하는 것을 생각했습니다. 대신 다른 문자열 (키)을 사용하여 문자열을 쉽게 xor 또는 xor 할 수 있습니다. 키가 길수록 실제 암호화가 강력 해지고 키가 길면 깨지기가 정말 어렵습니다.

는 당신은 당신이 할 수있는 문자열로, 메모리 스트림을 XOR 암호화 할 수 있습니다

Procedure XorStream(const StreamToXor: TMemoryStream; const XorKey: string); 
    var 
    i,k : int64; 
    PC : PChar; 
    begin 
    if(StreamToXor=nil)then exit; 
    if(StreamToXor.Size<1)then exit; 
    if(XorKey='')then exit; 
    PC := StreamToXor.Memory; 
    k := 0; 
    for i:=0 to StreamToXor.Size-1 do 
     begin 
      inc(k); if(k>Length(XorKey))then k := 1; 
      PC[i] := char(byte(PC[i]) xor byte(XorKey[k])); 
     end; 
    end;