ファイルの暗号化と解除          <TOP>


フリーソフトのラインドール(Rijn.dll)を使用して、ファイルの暗号化および解除をします。

EncryptFile ファイルの暗号化

DecryptFile ファイルの暗号を解除

 

テスト例では、読み込んだファイルを暗号化し、拡張子を enc に変更しバイナリ保存しています。

また、暗号化されたファイルを読み込み、解除後ファイル名を指定し保存しています。

EditBoxには、そのまま表示させていますので、テキスト形式以外は正常に表示できません。(エラー処理部は入れておりません)

参考

http://type74.org/

ハッシュ、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