2011-07-31 23 views
-1

XORで暗号化し、16進数で表現する方法はありますか? (私はそうは思わない、それを見つけることができなかった)。Delphi:XOR、HEX、暗号化

代替手段はありますか?私はBase64を使いたくない。

したがって、結果を暗号化して判読可能な形式で表現する必要があります。

+2

Base64では事のこのタイプの最も一般的なエンコーディングです。暗号化のための単純なXORは良いアイデアではありません(安全ではありません)。あなたの問題をより明確に述べてください。私はあなたが何であるかを考え出すのに苦労します。 – Mat

+0

xor暗号化を呼び出すのはちょっとしたことです。そして、base64の何が問題なの?あなたの入力はどのような形式ですか? –

+0

どの種類の入力データが必要ですか?文字列? rawbytestring?メモリポインタ?どのバージョンのDephi? –

答えて

1

は、16進数として結果を返し、その後、文字列に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は全く強くありません。キーコードを推測するのは非常に簡単ですが、これは1つのCharだけです。

しかし、この関数はUnicode文字列ではなくUnicode文字列の両方で動作します。

+2

私は '* {$ IFDEF UNICODE} 4 {$ ELSE} 2 {$ ENDIF}'の部分が好きではありません。正しい方法は、 '* SizeOf(Char)* 2'、IMOです。それも定数に折り畳まれていますが、はるかに優れています。 –

+0

組み込みの変換関数を使用しないのはなぜですか? –

+0

@Rudyあなたが正しいです。私はこれを修正しました。私はこの機能をSOに直接書きました。 –

0

XOR暗号化はStream Cypherと呼ばれ、さまざまなバージョンのGoogleに対応しています。

バイト配列を16進数に変換することは、バイト0x00から0x0Fのゼロ埋め込みで16進数の各バイトを表現することに過ぎません。

これらのいずれかの問題は、正確には何ですか?

+2

プレーンXORはストリーム暗号と呼ぶことができますが、ストリーム暗号はより広いコンセプトです。これはXORだけでなく、暗号のクラスです。例えば、人気のあるRC4アルゴリズムはストリーム暗号である。 – kludg

+0

また、RC4もXORサイファーです。 RC4エンジンは、暗号文を生成するために平文とXORされるキーストリームを生成する。 – rossum

+0

私は、ストリーム暗号をXOR暗号と呼ぶ考え方が嫌いです。 XORを使用することは、ストリーム暗号では必須ではなく、ストリーム暗号の最も一般的な形式です。ストリーム暗号は、XORを使用して擬似ランダムビットストリームを生成することについて少し実装されています。 – kludg

0

xor暗号化のためのバイナリ関数を使用することは、貧弱な人の暗号化です。シンプルで高速ですが、エンコードマスクキーを簡単に見つけることができます。ここで

あなたはsの持っている簡単なテスト・ケース:

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;