VNC プロトコル (RFB) のクライアントを実行しています。サーバーに接続する部分から、サーバーから「チャレンジ」を受け取る部分まで、すべてが機能しています。チャレンジは 16 バイトのランダムであり、ユーザーが DES アルゴリズムのキーとして提供するパスワードで暗号化する必要があります。このプロジェクトで DES 暗号化に 2 つのユニットを使用しようとしましたが、1 つは完全に失敗し、もう 1 つはこれでした...送信する 16 バイトの暗号化された文字列を取得する必要があり、デバッグ中に AnsiString が16 の長さ (AnsiStrings の場合、LENGTH = BYTES だと思います) ... とにかく、私のコードは単純なので、この問題に関係する最も重要な部分をここに貼り付けます。
Challenge: array[0..15] of AnsiChar;
PasswdDES: AnsiString;
Result: array[0..3] of AnsiChar;
begin
MySocket:= TClientSocket.Create(Nil);
....
MySocket.Socket.ReceiveBuf(Challenge, SizeOf(Challenge));
PasswdDES:= EncryStr(AnsiString(Challenge), AnsiString('123'));
MySocket.Socket.SendText(PasswdDES);
MySocket.Socket.ReceiveBuf(Result, SizeOf(Result));
私は常に「結果」で値 #1 を受け取ります。これは、認証の失敗を意味します... EncryStr は、ユニットの 1 つの関数です。このリンクを読んで、Delphi でソリューションを実装しようとしましたが、まだ機能していません。
注:私はすでにチャレンジをバイト配列として使用しようとしましたが、次のようなことをしました:
PasswdDES:= EncryStr(LPCSTR(Challenge[0]), '123');
しかし、成功しません.. Delphi 2010 を使用しているので、AnsiString を使用しています... ご清聴ありがとうございました。
Delphiで実装しようとしたJavaソリューションは次のとおりです。
Function BitFlip(B: Byte): Byte; //stackoverflow
const
N: array[0..15] of Byte = (0, 8, 4, 12, 2, 10, 6, 14, 1, 9, 5, 13, 3, 11, 7, 15);
begin
Result := N[B div 16] or N[B mod 16] shl 4;
End;
Function Invert(input: PAnsiChar): AnsiString;
var
I : int32;
Begin
Result := '';
for I := 0 to length(input)-1 do
Result := Result + AnsiChar(BitFlip(Byte(Input[I])));
End;