2011-12-14 19 views
4

私は最近、Delphi 2007からいくつかのコードを取り出し、それをDelphi 2009にアップグレードしました。これは関連性があるかもしれません。Delphi 2007を超えてアップグレードした後に暗号化が機能しないのはなぜですか?

私のコンピュータでコードを実行すると、パスワードの復号化が正しく解読されません。ここにコードがあります。

だから、
Seed := GenerateIntFromString('usercode'); 

// Check if a password already exists 
if TableUser.FieldByName('PASSWORD').AsString <> '' then 
begin 
    EncodedPassword := TableUser.FieldByName('PASSWORD').AsString; 
    DecodedPassword := EncryptDecrypt(EncodedPassword, Seed); 
//etc.. And the function 

function TLogonForm.EncryptDecrypt(Input: string; Seed: integer) : string; 
var 
i : integer; 
Output : string; 
begin 
    RANDSEED := Seed; 
    Output := ''; 
    for i := 1 to Length(Input) do 
     Output := Output + Chr(Ord(Input[i]) XOR (RANDOM(254) + 1)); 
    Result := Output; 
end; 

私のUSERCODEがTD で、私のパスワードは 'JOEJOE'

暗号化されたパスワードがされている場合:?ìAP?

復号化さpassowrdは次のとおりです。JìEJùE

それは明らかにJOEJOEとして解読する必要があります。私がコードをビルドし、別のユーザーにexeを送信した場合、キッカーはそれをうまく解読します。これは、私のコンピュータではなく、コードで何か間違っているとは信じられません。どうなり得るか?


おそらく関連していない可能性があるため、これは無視できます。あるコンピュータで何かがうまくいくが、もう一方のコンピュータではうまくいかないケースがあるので、私はそれを言います。

しかし、フィルタ

TableUser2.Filter := FilterString; 

を設定しようとしたとき、それは私のために正常に動作しますが、他のユーザーがエラーを取得する1場合もあります。

TableUser2:エラー3106:レコードフィルター式でサポートされていない演算子が見つかりました。

同じコードを実行している同じ名前でフィルタリングする場合でも、たぶんデータベースの問題?

+5

あなたが私たちに示したコードは、唯一の壊れたコードではないと思われます。あなたのメソッドEncryptDecryptは、非Unicode DelphiからUnicode Delphiに適切に移植されていません。もちろん、StringとCharは1文字あたりのバイトサイズで、以前はCharあたり2バイトでした。 –

+0

リソース:http://stackoverflow.com/questions/1598211/delphi-conversion-unicode-issues –

+0

私は実際にそれを認識していません。私はちょうどこのコードで作業を始めました。また、暗号化に関する経験は限られています。 Char情報が私にどのように役立つのでしょうか?おかげさまで私はあなたのリンクを持っています。 – Trevor

答えて

7

は次のようにANSIからUnicodeにポートをやってみてください。

function TLogonForm.EncryptDecrypt(Input: AnsiString; Seed: integer) : AnsiString; 
var 
i : integer; 
Output : AnsiString; 
begin 
    RANDSEED := Seed; 
    Output := ''; 
    for i := 1 to Length(Input) do 
     Output := Output + AnsiChar(Ord(Input[i]) XOR (RANDOM(254) + 1)); 
    Result := Output; 
end; 

私の最高の野生の推測では、期待どおりの結果が原因AnsiCharのとUnicodeCharの違いで異なっているということです。 DBの非Unicodeデータフィールドに格納できない無効なコードポイントを生成すると、楽しいエラーが発生する可能性があります。

+0

ここに250〜250の追加はありません。唯一の '+'は文字列の連結です。私は、コードページの不一致のためにQブレークのコードを期待しています。 –

+3

デルファイは 'Note:コンパイラのバージョン間でRandom関数の実装が変更される可能性があるため、暗号化や他の目的のためにRandomを使用することはお勧めしません。数字だよ。 –

+0

よく考えてみよう。 – Trevor

0

最初に私がやることは、あなたの関数の入力/出力をいくつかロギングすることです。

TableUser.FieldByName( "Password")の値がどちらの場合でも期待通りのものを通過していないように思えるかもしれません。

私が注意しなければならない別のことは、両方のマシンで使用されているデータベースの照合です。私は基礎データベースがあなたの2つのテストケースで異なっていると仮定しています。最低でも接続文字列infoの照合値が異なります。これは確かに解読を捨てることができます。

+0

Delphi 2007とDelphi 2009の間のChar = byteからChar = 2バイトへの言語の変更に気づいていません。彼はまだ気づいていない以上の問題があります。 –

+0

@WarrenP:私は同意します。私の答えはここでは重要ではありません。 – NotMe

+0

助けてくれてありがとう。 – Trevor

1

Delphi 2009では、テキストとしてANSIではなくUnicodeが使用されています。これは大幅な移植作業を必要とする大きな改革でした。コード内のエンコーディングの問題に対処する必要があるだけでなく、使用するサードパーティコンポーネントをアップグレードする必要があります。

あなたは、このように、この特定の機能のために、以前の動作に戻すことができますデルファイ2009年

function TLogonForm.EncryptDecrypt(Input: AnsiString; Seed: integer): AnsiString; 
var 
i : integer; 
Output : AnsiString; 
begin 
    RANDSEED := Seed; 
    Output := ''; 
    for i := 1 to Length(Input) do 
     Output := Output + AnsiChar(Ord(Input[i]) XOR (RANDOM(254) + 1)); 
    Result := Output; 
end; 

stringデータ型はUTF-16でエンコードされた文字列です。以前のバージョンのDelphiの名前はAnsiStringです。同様にChr()は、16文字でWideChar文字を生成しますが、8ビットのANSI文字タイプであるAnsiCharが必要です。


しかし、確かに取り組むべき他の多くの問題があるでしょう。 Delphi and Unicodeに関するMarcoCantùのホワイトペーパーをお読みになることをお勧めします。あなたは、ポートをさらに進める前に、このホワイトペーパーで詳述されている問題の真上に立つべきです。

+0

私は両方の答えが正しいとチェックしますが、私は傾けません。ありがとう! – Trevor

+0

@トレバーNo probs。あなたは最高のものを受け入れなければなりません。最高のものを決めることができます!それがここにある方法です。 –

関連する問題