1

私は開発者のDelphiではありませんが、このdelphiコードをC#に変換する必要があります。

Function EncodeClave(Clave:String):String;
 var
   R: String;
   FStringFormat:Integer;
 begin
   FStringFormat:=4196;
 with TCipher_Blowfish.Create('CLAVE', nil) do
  try
    Mode := TCipherMode(0);
    R := CodeString(Clave, paEncode, FStringFormat);
    Result := R;
  finally
    Free;
  end;
 end;

私の研究で次のサイトを見つけました。

http://www.bouncycastle.org/csharp/

http://www.schneier.com/code/blowfish.cs

私はその行を理解していません:

FStringFormat:=4196;

フォーマットのサイズが事前に定義されているのはなぜですか?ブローフィッシュ(DECUtil)による別の変換はありますか?

とモード:

Mode := TCipherMode(0);

暗号のデルファイソースで

(http://www.koders.com/delphi/fidE1F5EC890EF9FD7D5FFEB524898B00BC8403B799.aspx)パラメーター「モード」の順序は次のとおりです:cmCTS、cmCBC、cmCFB、cmOFB、cmECB、cmCTSMAC、cmCBCMAC、cmCFBMAC

ですから、デルファイではモード0はcmCTSだと思いますが、実際にはわかりません。

結果の例:user:ADMIN pass:ADMIN ---> pass:fAtP3sk =

4

5 に答える 5

2

FStringFormat変数(4196)の値は、次のように定義されたDECUtilユニットでfmtMIME64定義されたconstを使用するのと同じです。

 fmtMIME64      = $1064;     // MIME Base 64

この値は、CodeStringメソッドに渡される文字列をフォーマットするために使用されます。この場合、行

 R := CodeString(Clave, paEncode, FStringFormat);

Clave変数の値をMIMEBase64形式で返します。

今ラインについて

モード:= TCipherMode(0);

Modeプロパティを列挙の最初の値に設定しています。

 TCipherMode = (cmCTS, cmCBC, cmCFB, cmOFB, cmECB, cmCTSMAC, cmCBCMAC, cmCFBMAC);

この場合、書き込みと同等です。

Mode := cmCTS;
于 2012-09-05T17:20:23.887 に答える
2

DelphiオブジェクトTCipher_Blowfishのソースを見ると、文字列形式に対して宣言された定数がいくつかあります。

fmtMIME64      = $1064;     // MIME Base 64

「$」はデルファイの16進数を定義するため、サンプルコードでは$ 1064=4196が使用されます。

TCipherMode(0);

TCipherModeは、次の列挙型への参照です。

TCipherMode = (cmCTS, cmCBC, cmCFB, cmOFB, cmECB, cmCTSMAC, cmCBCMAC, cmCFBMAC);

したがって、TCipherMode(0)= cmCTS

これらの置換を行うと、コードが少しわかりやすくなります。

Function EncodeClave(InputString:String):String;
 var
   BlowfishObj: TCipher_Blowfish;
 begin

  BlowfishObj := TCipher_Blowfish.Create('CLAVE', nil);
  try

    BlowfishObj.Mode := cmCTS;  // (Cipher Text Stealing)
    Result := BlowfishObj.CodeString(InputString, paEncode, fmtMIME64);

  finally
    BlowfishObj.Free;
  end;
 end;
于 2012-09-05T17:22:02.640 に答える
1
var 
  FStringFormat: Integer; 
begin 
  FStringFormat := 4196; 

と同じです

Int32 FStringFormat; 
FStringFormat = 4196; 

C#で。

FMode := TCipherMode(0);'は、列挙値に対する整数のタイプケースです。Delphiの列挙は、C#の列挙とほとんど同じです。デフォルトでは、で始まる0ので、

type
  TCipherMode = ( cmCTS, cmCBC, cmCFB, cmOFB, cmECB, cmCTSMAC, cmCBCMAC, cmCFBMAC);

は、、 1などcmCTSの数値を持つことを意味します。0cmCBC

コードは適切に記述されている必要があります

FMode := cmCTS;

これは、入力する文字が少ないだけでなく、将来それを読む人(あなたのように)にとってはるかに明確です。:-)

于 2012-09-05T17:14:45.027 に答える
0
FStringFormat:=4196;

これは純粋に変数に値を割り当てるだけでFStringFormatあり、宣言された整数値であり、これで値を指定します。

于 2012-09-05T16:41:31.033 に答える
0

最初にすべての答えに感謝します!!

ここに解決策を投稿できるかどうかはわかりませんが、誰かを助けることができるかもしれません...

最後に、私はデルファイコードを次のようにDLLに変換しました:

library crypto;

   uses
  Cipher in '\Source\Cipher.pas',
  DECUtil in '\Source\DECUtil.pas',
  Hash in '\Source\Hash.pas',
  SysUtils;

{$R *.res}

Function EncodeClave(Clave:String):String;
var
  R: String;
  FStringFormat:Integer;
begin
  FStringFormat:=4196;
  with TCipher_Blowfish.Create('CLAVE', nil) do
  try
    Mode := TCipherMode(0);
    R := CodeString(Clave, paEncode, FStringFormat);
    Result := R;
  finally
    Free;
  end;
end;

function MsgEncode(pIn: PWideChar; out pOut: PWideChar): LongBool; stdcall;
var
  sOut: string;
  BuffSize: Integer;
begin
  sOut := EncodeClave(pIn);
  BuffSize := SizeOf(Char)*(Length(sOut)+1);
  GetMem(pOut, BuffSize);
  FillChar(pOut^, BuffSize, 0);
  Result := Length(sOut)>0;
  if Result then
    Move(PChar(sOut)^, pOut^, BuffSize);
end;

procedure BlockFree(p: Pointer); stdcall;
begin
  FreeMem(p);
end;

exports
  MsgEncode,
  BlockFree;

begin
end.

このDLLをC#で次のように使用します。

class Program
    {
        [DllImport("crypto.dll", CharSet = CharSet.Unicode, CallingConvention = CallingConvention.StdCall)]
        [return: MarshalAs(UnmanagedType.Bool)]
        public static extern bool MsgEncode(string pIn, out IntPtr pOut);

        [DllImport("crypto.dll", CharSet = CharSet.Unicode, CallingConvention = CallingConvention.StdCall)]
        public static extern void BlockFree(IntPtr p);

        static void Main(string[] args)
        {
            IntPtr pOut;

            string encode = "admin";
            string encoded = "";


            if (MsgEncode(encode, out pOut))
                encoded = Marshal.PtrToStringAnsi(pOut);
            BlockFree(pOut);

            Console.WriteLine("String Encoded '" + encode + "' : " + encoded);
        }

それは超きれいではありませんが、仕事をします...

于 2012-09-07T01:38:41.637 に答える