掲示板システム
ホーム
アクセス解析
カテゴリ
ログアウト
BlowFishで復号化のみするには? (ID:17009)
名前
ホームページ(ブログ、Twitterなど)のURL (省略可)
本文
テキストのみを扱いやすいようにBase64エンコードかけてみました。 使い方はこんな感じです。 usesにBF2B64Textを追加して テキストを暗号化Base64テキスト出力 Edit2.text:=BF2B64Encode('PAI',Edit1.Text,$31415926535); 暗号化Base64をテキストをテキスト出力 Edit1.text:=BF2B64decode('PAI',Edit2.Text,$31415926535); BF2B64Text.pas unit BF2B64Text; //////////////////////////////////////////////////////////////////////////////// // 文字列をBlowFishで復号化しBase64エンコードで保存する関数 // base64は 「FDELPHI」 の"base64、エンコード&デコード"を使用 // http://forum.nifty.com/fdelphi/samples/01327.html // 著作:河邦 正 氏 // // これを利用するにはBlowFishユニットが必要 // BlowFishユニット // http://kuma.webj.net/ // 著作:t_kumagai 氏 // // BlowFishのアルゴリズム // 著作:Bruce Schneier 氏 //////////////////////////////////////////////////////////////////////////////// interface uses SysUtils, Windows, Classes, BlowFish, CryptUtils; function BF2B64Encode(key,Text:string; IV:Int64):string; function BF2B64Decode(key,Text:string; IV:Int64):string; implementation // 3バイト分のバイトオーダーを修正する(Kylixでは不要のはず) function exchange_0_2(Src: DWORD): DWORD; type TTemp = array[0..3]of BYTE; begin Result := Src; TTemp(Result)[2] := TTemp(Src)[0]; TTemp(Result)[0] := TTemp(Src)[2]; end; // StreamからSizeバイトを読み込み、エンコードした文字列を返す function base64encode(Stream: TStream; Size: Integer): string; const Table: PChar = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/'; var Buffer, Src: Pointer; Dst: PChar; I: Integer; procedure doNbyte(N: Integer); var Value: DWORD; I: Integer; begin if not(N in [1..3]) then Exit; Value := 0; // SrcからNバイトをValueに読み込む Move(PBYTE(Src)^, Value, N); // バイトオーダーを修正(Kylixでは不要のはず) Value := exchange_0_2(Value); // Srcの読み込み位置を進める Inc(Integer(Src), N); // 6ビットずつエンコード×4回 for I := 3 downto 0 do begin if I > N then Dst[I] := '=' // 変換しない分は‘=’でパディングする else Dst[I] := Table[Value and $3f]; Value := Value shr 6; end; // 次の書き込み位置にする Inc(Integer(Dst), 4); end; begin Buffer := AllocMem(Size); try Size := Stream.Read(PBYTE(Buffer)^, Size); // エンコード後の文字列の長さにする SetLength(Result, (Size + 2) div 3 * 4); if Size > 0 then begin // 読み込み元のポインタ Src := Buffer; // 書き込み先のポインタ Dst := PChar(Result); // 3バイトずつ書き込む for I := 0 to Size div 3 - 1 do doNbyte(3); if (Size mod 3) > 0 then doNbyte(Size mod 3); end; finally FreeMem(Buffer); end; end; // TextをデコードしてStreamに書き込み、書き込んだバイト数を返す function base64decode(Stream: TStream; Text: string): Integer; var Src: PChar; I: Integer; // 各文字を6ビットデータに変換する function decode(code: BYTE): BYTE; begin case Char(code) of 'A'..'Z': Result := code - BYTE('A'); 'a'..'z': Result := code - BYTE('a') + 26; '0'..'9': Result := code - BYTE('0') + 52; '+': Result := 62; '/': Result := 63; else Result := 0; // ‘=’の場合も‘0’を返す end; end; function doNbyte: Integer; var I, N: Integer; Value: DWORD; begin // パディング文字‘=’の有無を調べる N := 3; // デコード後のバイト数をNにセット for I := 2 to 3 do begin if Src[I] = '=' then begin N := I - 1; break; end; end; // 4文字をデコードする value := 0; for I := 0 to 3 do begin // 1文字を6ビットに変換×4回 Value := Value shl 6; Inc(Value, decode(PBYTE(Src)^)); Inc(Integer(Src)); end; // バイトオーダーを修正(Kylixでは不要のはず) Value := exchange_0_2(Value); // デコードしたデータの書き込み Result := Stream.Write(Value, N); end; begin Result := 0; Src := PChar(Text); // 4文字ずつデコード for I := 0 to (Length(Text) div 4) - 1 do // 書き込んだバイト数をResultにカウントする Inc(Result, doNbyte); end; //テキストをエンコードしてBase64テキストを返す function BF2B64Encode(key,Text:string; IV:Int64):string; var Crypt : TCryptCBC; Stream:TMemoryStream; Size,i :integer; dst : array of byte; begin try Crypt:= TCryptCBC.Create(Key, TBlowFish.Create, IV, SizeOf(IV), pmStandard); size := Length(Text); SetLength(dst, Crypt.OutputSize(Size)); Size := Crypt.Encode(Text[1], dst[0], Size); stream:= TMemoryStream.Create; stream.Size:= size; stream.Seek(0,soFromBeginning); for i:=0 to size-1 do stream.Write(dst[i],1); stream.Seek(0,soFromBeginning); Result:=base64encode(stream,Size); finally stream.Free; Crypt.Free; end; end; //Base64テキストを出コードしてテキストを返す function BF2B64Decode(key,Text:string; IV:Int64):string; var Crypt : TCryptCBC; Stream:TMemoryStream; Size,size2,i :integer; dst,src : array of byte; bufstr : string; begin try stream:= TMemoryStream.Create; size:=base64decode(stream,Text); stream.Seek(0,soFromBeginning); setLength(dst,size); for i:=0 to size-1 do stream.read(dst[i],1); Crypt:= TCryptCBC.Create(Key, TBlowFish.Create, IV, SizeOf(IV), pmStandard); size2 := Crypt.OutputSize(Size); SetLength(src,size2); size2 := Crypt.Decode(dst[0], src[0], Size); for i:=0 to size2-1 do result:= result + char(src[i]); finally stream.Free; Crypt.Free; end; end; end.
←解決時は質問者本人がここをチェックしてください。
更新する
戻る
掲示板システム
Copyright 2021 Takeshi Okamoto All Rights Reserved.