ファイルの暗号化と解除 <TOP>
フリーソフトのラインドール(Rijn.dll)を使用して、ファイルの暗号化および解除をします。
EncryptFile ファイルの暗号化
DecryptFile ファイルの暗号を解除
テスト例では、読み込んだファイルを暗号化し、拡張子を enc に変更しバイナリ保存しています。
また、暗号化されたファイルを読み込み、解除後ファイル名を指定し保存しています。
EditBoxには、そのまま表示させていますので、テキスト形式以外は正常に表示できません。(エラー処理部は入れておりません)
参考
ハッシュ、MD5、暗号などでWeb検索中、ラインドール(Rijn.dll)を見つけました。上記URLからダウンロードできます。
'================================================================ '= ファイルの暗号化と解除(Type74 Software) '= (Encrypt.bas) '================================================================ #include "Windows.bi" ' 暗号化 Declare Function EncryptFile& Lib "rijn" Alias "EncryptFile" (ByVal SourceFileName$, ByVal DestFileName$, ByVal key$) ' 暗号解除 Declare Function DecryptFile& Lib "rijn" Alias "DecryptFile" (ByVal SourceFileName$, ByVal DestFileName$, ByVal key$) '---------------------------------------------------------------- 'EncryptFile戻り値 ' 0 正常終了 '-1 暗号化元ファイルオープン時エラー '-2 暗号化先ファイル作成時エラー '-3 暗号化時エラー 'DecryptFile戻り値 ' 0 正常終了 '-1 復号元ファイルオープン時エラー '-2 復号先ファイル作成時エラー '-3 復号時エラー '---------------------------------------------------------------- ' パス名の拡張子だけを変更 Declare Function Api_PathRenameExtension& Lib "shlwapi" Alias "PathRenameExtensionA" (ByVal pszPath$, ByVal pszExt$) ' マウスのキャプチャを解放 Declare Function Api_ReleaseCapture& Lib "user32" Alias "ReleaseCapture" () ' ウィンドウにメッセージを送信 Declare Function Api_SendMessage& Lib "user32" Alias "SendMessageA" (ByVal hWnd&, ByVal wMsg&, ByVal wParam&, lParam As Any) ' 表示要素の寸法とシステム構成の設定を取得 Declare Function Api_GetSystemMetrics& Lib "user32" Alias "GetSystemMetrics" (ByVal nIndex&) #define WM_NCLBUTTONDOWN &HA1 '非クライアント領域で左マウスボタンを押す #define HTBOTTOMRIGHT 17 'ウィンドウ境界の右下隅 #define SM_CXFRAME 32 'サイズ可変ウィンドウの境界線のX方向の幅 #define SM_CYFRAME 33 'サイズ可変ウィンドウの境界線のY方向の幅 #define SM_CYSIZE 31 'タイトルバー内のビットマップの高さ #define SM_CYBORDER 6 'サイズ固定ウィンドウの境界線のY方向の幅 #define vbCrLf (Chr$(13) & Chr$(10)) 'キャリッジリターンとラインフィード(\r\n) Var Shared Edit(4) As Object Var Shared Text(3) As Object Var Shared Button(3) As Object For i = 0 To 4 Edit(i).Attach GetDlgItem("Edit" & Trim$(Str$(i + 1))) Edit(i).SetFontSize 12 Next For i = 0 To 3 Text(i).Attach GetDlgItem("Text" & Trim$(Str$(i + 1))) If i < 2 Then Text(i).SetFontSize 12 End If Next For i = 0 To 3 Button(i).Attach GetDlgItem("Button" & Trim$(Str$(i + 1))) Button(i).SetFontSize 12 Next Var Shared sFname As String '元ファイル名 Var Shared dFname As String '新ファイル名 Var Shared kChar As String 'パスワード Var Shared zX As Integer 'サイズグリップX軸 Var Shared zY As Integer 'サイズグリップY軸 '================================================================ '= サイズグリップ位置計算 '================================================================ Declare Sub MainForm_Start edecl () Sub MainForm_Start() Var fs As Integer fs = 18 Text(3).SetFontSize fs Text(3).SetWindowSize fs, fs Text(3).SetFontName "Marlett" Text(3).SetWindowText "o" ShowWindow -1 zX = Api_GetSystemMetrics(SM_CXFRAME) * 2 + 1 zY = Api_GetSystemMetrics(SM_CYFRAME) * 2 + Api_GetSystemMetrics(SM_CYBORDER) + Api_GetSystemMetrics(SM_CYSIZE) + 1 End Sub '================================================================ '= サイズグリップ処理 '================================================================ Declare Sub Mainform_MouseDown edecl (ByVal Button%, ByVal Shift%, ByVal SX!, ByVal SY!) Sub Mainform_MouseDown(ByVal Button%, ByVal Shift%, ByVal SX!, ByVal SY!) Var Ret As Long If Button% = 1 Then Ret = Api_ReleaseCapture() Ret = Api_SendMessage(Text(3).GethWnd, WM_NCLBUTTONDOWN, HTBOTTOMRIGHT, 0) End If End Sub '================================================================ '= リサイズ '================================================================ Declare Sub MainForm_Resize edecl () Sub MainForm_Resize() '最小基本サイズに戻す If GetWidth < 700 Or GetHeight < 512 Then SetWindowSize 700, 512 End If Text(0).MoveWindow 12, 16 Text(1).MoveWindow 12, (GetHeight - 78) / 2 + 15 Text(2).MoveWindow 12, GetHeight - 64 Edit(0).MoveWindow 10, 36 Edit(0).SetWindowSize GetWidth - 34, (GetHeight - 78) / 2 - 37 Edit(1).MoveWindow 10, (GetHeight - 78) / 2 + 11 + 26 Edit(1).SetWindowSize GetWidth - 34, (GetHeight - 78) / 2 - 37 Edit(2).MoveWindow 110, 10 Edit(2).SetWindowSize GetWidth - 134, 22 Edit(3).MoveWindow 110, (GetHeight - 78) / 2 + 11 Edit(3).SetWindowSize GetWidth - 134, 22 Edit(4).MoveWindow 70, GetHeight - 68 Button(0).MoveWindow 174, GetHeight - 66 Button(1).MoveWindow 296, GetHeight - 66 Button(2).MoveWindow 418, GetHeight - 66 Button(3).MoveWindow 540, GetHeight - 66 'サイズグリップ(右下) Text(3).MoveWindow (GetWidth - Text(3).GetWidth) - zX, GetHeight - Text(3).GetHeight - zY End Sub '================================================================ '= EditBoxクリア '================================================================ Declare Sub Button1_on edecl () Sub Button1_on() For i = 0 To 3 Edit(i).SetWindowText "" Next End Sub '================================================================ '= ファイル読込 '================================================================ Declare Sub Button2_on edecl () Sub Button2_on() Var hFile As Byte Var Buff As String Var Temp As String Var Ret As Long Button1_on sFName = WinOpenDlg("ファイルのオープン", "*.*", "全てのファイル(*.*)", 0) If sFName <> Chr$(&H1B) Then Edit(2).SetWindowText sFName hFile = FreeFile open sFName For BinInp As hFile Buff = Space$(Lof(hFile)) FRead hFile, Buff Buff = JConv$(Buff, 0, 2) Edit(0).SetWindowText Buff Close hFile '拡張子をhtmに変換 dFName = sFName & String$(260, Chr$(0)) Ret = Api_PathRenameExtension(dFName, ".enc") Edit(3).SetWindowText dFName Else sFName = "" End If End Sub '================================================================ '= 暗号化 '================================================================ Declare Sub Button3_on edecl () Sub Button3_on() Var hFile As Byte Var Buff As String Var Ret As Long dFName = Edit(3).GetWindowText kChar = Edit(4).GetWindowText If dFName = "" Then A% = MessageBox("", "ファイル名を設定してください!", 0, 2) Exit Sub End If Ret = EncryptFile(sFName, dFName, kChar) hFile = FreeFile Open dFName For BinInp As hFile Buff = Space$(Lof(hFile)) FRead hFile, Buff Buff = JConv$(Buff, 0, 2) Edit(1).SetWindowText Buff Close hFile End Sub '================================================================ '= 暗号解除 '================================================================ Declare Sub Button4_on edecl () Sub Button4_on() Var hFile As Byte Var Buff As String Var Ret As Long dFName = Edit(3).GetWindowText kChar = Edit(4).GetWindowText If dFName = "" Then A% = MessageBox("", "ファイル名を設定してください!", 0, 2) Exit Sub End If Ret = DecryptFile(sFName, dFName, kChar) hFile = FreeFile Open dFName For BinInp As hFile Buff = Space$(Lof(hFile)) FRead hFile, Buff Buff = JConv$(Buff, 0, 2) Edit(1).SetWindowText Buff Close hFile End Sub '================================================================ '= '================================================================ While 1 WaitEvent Wend Stop End