0

xor暗号化を実装するプログラムを作成しています。プログラムをいじりながら、さまざまなキーの組み合わせを入力しました。キーの値を入力するまで、プログラムは完全に機能していました。はデクスターで、edit1の愚かな妹のdedeが嫌いです。暗号化して逆に復号化すると、edit1のテキストが作成されます。

procedure TForm2.Button1Click(Sender: TObject);
    var
     c:char;
     i,key: integer;
    begin
      s := edit1.Text;
       edit1.Text := #0;
       key := strtoint(edit2.text);
       key := key + 128;//i am adding 128  so that i dont get NULL char 
       for I := 1 to length(s)  do {or 0 to lenght(s)? i dont know}
      begin
       c := s[i];
       c := char(ord(c) xor key);
       edit1.Text :=  edit1.Text + c;
      end;
    end;
4

4 に答える 4

5

128を追加しても、問題は解決しません。動かすだけです。

「xorキー」は、キーの最後のバイト、つまり904932の場合は$E4をxorします。$E4+ 128は、「d」のASCII値であるバイト値100に丸められます(つまり、-256)。 。それがあなたの「d」が消えた理由です。

したがって、暗号化されたテキストを表示する場合は、このようなxorアルゴリズムを使用しないでください。簡単な順列アルゴリズムを作成することをお勧めします。

于 2010-08-28T15:51:12.383 に答える
2

実際には、AES-CBCのような最新の暗号化を使用することをお勧めしますが、レトロな暗号化を試してみたい場合は、ここで楽しんでください。暗号化出力はテキストであるため、XORではなくモジュロ加算の使用を提案する場合があります。XORは、文字ではなく、バイトを操作する場合にのみ使用してください。出力で特定の特殊文字を避ける必要があります。この場合、NULL文字に問題があるようです。文字セットを定義することにより、文字の出力を回避できます。
たとえば、ASCII値1〜127の範囲の文字(NULLを除くすべてのASCII文字)のみを使用したい場合があります。つまり、ベースは1になり、モジュラスは126 =(127-1)になります。

文字をエンコードするには、最初に底を引きます。キー値を追加します。次に、モジュラスの結果を取得します。最後に、ベースをに戻します。

小文字dの10進値は100です。100-1=
99//底を引く
99+904932 = 905031 //キー値を加算し、ここで使用します
905031%126 = 99//係数の結果lol904932%126 = 0
99 + 1 =100//ベースを追加し直します

キー値はモジュラス126で割り切れるので、出力は入力と等しくなります。

モジュロ加算を元に戻すのは、少し異なる手順です。
100-1 = 99//ベースを減算
99-904932=-904833 //キー値を減算
-904833%126 =-27//モジュラス結果
126+-27 =99//モジュラス結果にモジュラスを追加
99+ 1 =100//ベースを追加し直します

モジュラスは、文字セットに必要な数の文字を含めるために必要なだけ高く設定できます。また、いくつかの凝った計算を使用して、任意の方法で文字を整数値にマップできます。

私はあなたが望む方法でキャラクターをマッピングできると言っていますが、真実はあなたがテキストが書かれているメディアによって制限されているということです。メディアが運ぶことができるすべての文字の総数よりも高いモジュラスを設定することはできませんが、エンコードされた値とデコードされた値に対して別々の文字マッピングを持つことができます。

キー値の選択についてもコメントします。すべての文字に同じキー値を適用することは、暗号化の可能な限り最も弱い形式です。(ROT13は本当に暗号化と見なすことができますか?)各文字のキー値を変更するいくつかの方法を考えてください。このタイプの暗号が使用されているときに行われたことは、各文字の値をキーにインクリメントするか、処理された文字の値をキーに追加することでした。

于 2010-08-30T08:53:06.850 に答える
1

これがあなたのための改訂です。

procedure TForm2.Button1Click(Sender: TObject); 
var 
  i,key: integer; 
begin 
  s := edit1.Text; 
  edit1.Text := ''; 
  key := strtoint(edit2.text); 
  if Key = 0 then //replacement for the +128
    Key := 128
  for I := 1 to length(s)  do //string are 1 indexed.  Dynamic arrays 0 indexed. 
  begin 
    s[i] := char(s[i] xor key);  
  end; 
  edit1.Text :=  S; //Much faster to assign a full string than to assign character by character.  
                    //Also, this might fix your vanishing "d" problem.
                    //I didn't test it, but I suspect that
                    //edit1.Text + c might result in no change if c=#0
end; 
于 2010-08-29T16:33:01.487 に答える
1

$00 xor $E4 = $E4結果のcharが#0であっても、元の文字が表示されるため、XORを使用しても問題ありません。問題は、暗号化された結果を、#0を特別に処理する文字列として使用することです。暗号化された文字列をバイトの配列として指定する場合は、問題ないはずです。表示する場合は、BinToHexまたは一連のIntToHexを使用します。

于 2010-08-28T15:32:00.500 に答える