保存の際簡易暗号化をかけたい
保存の際簡易暗号化をかけたい
前回トピックを立てました(取得した文字列をINIファイルに保存したい)の続きです。
考えてみたらINIはテキストなので簡単にパスワードが見られてしまいます。
なので簡単な暗号化をかけたいと考えていました。
でコードを書くとなったらまったく分からないため過去ログを見てみました。
・・・見てもても分かりません。
どなたかご教授願えないでしょうか?
考えてみたらINIはテキストなので簡単にパスワードが見られてしまいます。
なので簡単な暗号化をかけたいと考えていました。
でコードを書くとなったらまったく分からないため過去ログを見てみました。
・・・見てもても分かりません。
どなたかご教授願えないでしょうか?
前に、同じような質問があったので、そこのURLを落としておきます。
http://www.activebasic.com/forum/viewtopic.php?t=1213
http://www.activebasic.com/forum/viewtopic.php?t=1213
>もう少し分かりやすくしていただけないでしょうか?
↑文学系が苦手な自分には、そっちの方が難しいです。orz
一応、簡単そうだった「ケースケ」さんのプログラムを少し改変してみました。
ただ、この暗号方法は、文字コードに沿って文字を一定数だけずらしたの暗号なので、わかる人にはわかってしまうのが欠点です。
↑文学系が苦手な自分には、そっちの方が難しいです。orz
一応、簡単そうだった「ケースケ」さんのプログラムを少し改変してみました。
ただ、この暗号方法は、文字コードに沿って文字を一定数だけずらしたの暗号なので、わかる人にはわかってしまうのが欠点です。
暗号化するとき [ここをクリックすると内容が表示されます]
コード: 全て選択
Const X = 5 '暗号化の定数
Dim Str$ As String '暗号化する文字列
Dim Str_Size As Long '文字列の長さ
Dim Chr_Num As Integer '文字コードの番号
Dim I As Long
'暗号化する文字列を記録
Str$ = "String"
/* 暗号化するとき */
'文字列の長さを調べて保存する
Str_Size = Len(Str$)
'1Byteずつ暗号化する
For I = 0 To Str_Size
'文字コード番号を取得する
Chr_Num = Str$
'文字コード番号に暗号化定数を加える
Chr_Num += X
'↓エラー防止のための処理↓ここから
While Chr_Num < 0
Chr_Num += 255
Wend
While 255 < Chr_Num
Chr_Num -= 255
Wend
'↑エラー防止のための処理↑ここまで
'文字コード番号を書き換える
Str$ = Chr_Num
Next I
'INIファイルに書き込む
WritePrivateProfileString("Section", "Key", Str$, ".\test.ini")
'↑このプログラムの場合、文字列「String」は「Xywnsl」と言うふうに暗号化されます。
複合化するとき [ここをクリックすると内容が表示されます]
コード: 全て選択
Const X = 5 '暗号化の定数
Dim Str$ As String '複合化する文字列
Dim Str_Size As Long '文字列の長さ
Dim Chr_Num As Integer '文字コードの番号
Dim I As Long
/*
~INIファイルからの読み込み処理は省略させてもらいます~
ここで、Str$に暗号化された文字列を代入してください
*/
'文字列の長さを調べて保存する
Str_Size = Len(Str$)
'複合化する
For I = 0 To Str_Size
'文字コード番号を取得する
Chr_Num = Str$
'文字コード番号から暗号化定数を引く
Chr_Num -= X
'↓エラー防止のための処理↓ここから
While Chr_Num < 0
Chr_Num += 255
Wend
While 255 < Chr_Num
Chr_Num -= 255
Wend
'↑エラー防止のための処理↑ここまで
'文字コード番号を書き換える
Str$ = Chr_Num
Next I
/*
ここまで処理が終われば複合化された文字列が
変数「Str$」に入っています
*/
このコード抜けてませんか?
コード: 全て選択
Const X = 5 '暗号化の定数
抜けていました。
しかし、コンパイルしてもINIファイルをのぞくと毎回違う値がPassWordのところに書かれています。
一応コードを載せておきますので間違っている点がありましたら訂正お願いします。
しかし、コンパイルしてもINIファイルをのぞくと毎回違う値がPassWordのところに書かれています。
一応コードを載せておきますので間違っている点がありましたら訂正お願いします。
コマンドボタンを押したときの動作 [ここをクリックすると内容が表示されます]
コード: 全て選択
Sub MainWnd_CommandButton1_Click()
Dim ret As Long
Dim Letter As String
Dim User As String
Dim Str$ As String
Dim Pass2 As String
Dim P[SIZE] As Byte
Dim aaa As Long
Dim Str_Size As Long '文字列の長さ
Dim Chr_Num As Integer '文字コードの番号
Dim I As Long
GetDlgItemTextStr(hMainWnd,EditBox1,User)
GetDlgItemTextStr(hMainWnd,EditBox2,Str$)
GetDlgItemTextStr(hMainWnd,EditBox3,Pass2)
If User="" Then
MessageBox(hMainWnd,"ユーザー名が入力されていません","入力エラー",MB_OK)
End If
GetPrivateProfileString("Data","PassWord","",P,SIZE,".\System.ini")
lstrcpy(Str$,P)
'複合化する
For I = 0 To Str_Size
'文字コード番号を取得する
Chr_Num = Str$
'文字コード番号から暗号化定数を引く
Chr_Num -= X
'↓エラー防止のための処理↓ここから
While Chr_Num < 0
Chr_Num += 255
Wend
While 255 < Chr_Num
Chr_Num -= 255
Wend
'↑エラー防止のための処理↑ここまで
'文字コード番号を書き換える
Str$ = Chr_Num
Next I
If lstrcmp(Str$,P)<>0 Then
aaa=MessageBox(hMainWnd,Ex"ユーザー名、又はパスワードがiniファイルに保存されているデータと違います。\r\nデータを書き換えますか?","確認",MB_YESNO)
If aaa=IDYES Then
MessageBox(0,"書き換えます","書き換え",MB_OK)
/* 暗号化するとき */
'文字列の長さを調べて保存する
Str_Size = Len(Str$)
'1Byteずつ暗号化する
For I = 0 To Str_Size
'文字コード番号を取得する
Chr_Num = Str$
'文字コード番号に暗号化定数を加える
Chr_Num += X
'↓エラー防止のための処理↓ここから
While Chr_Num < 0
Chr_Num += 255
Wend
While 255 < Chr_Num
Chr_Num -= 255
Wend
'↑エラー防止のための処理↑ここまで
'文字コード番号を書き換える
Str$ = Chr_Num
Next I
/*ここまで暗号化*/
WritePrivateProfileString("Data", "User", User, ".\System.ini")
WritePrivateProfileString("Data", "PassWord", Str$, ".\System.ini")
EndDialog(hMainWnd,1)
Else
MessageBox(0,"再入力してください","再入力",MB_OK)
SetDlgItemText(hMainWnd,EditBox2,"")
SetDlgItemText(hMainWnd,EditBox3,"")
Exit Sub
End If
End If
If lstrcmp(Str$,Pass2)=0 Then
If Str$="" Then
MessageBox(hMainWnd,"パスワードが入力されていません","入力エラー",MB_OK)
Exit Sub
End If
Else
MessageBox(hMainWnd,"パスワードが一致しません","入力エラー",MB_OK)
Exit Sub
End If
Letter="ユーザー:" + User + Ex"\r\n" + "パスワード:" + Str$ + Ex"\r\n" + "これでよろしいですか?"
ret=MessageBox(hMainWnd,Letter,"確認",MB_YESNO)
If ret=IDYES Then
MessageBox(hMainWnd,"分かりました","了解",MB_OK)
/* 暗号化するとき */
'文字列の長さを調べて保存する
Str_Size = Len(Str$)
'1Byteずつ暗号化する
For I = 0 To Str_Size
'文字コード番号を取得する
Chr_Num = Str$
'文字コード番号に暗号化定数を加える
Chr_Num += X
'↓エラー防止のための処理↓ここから
While Chr_Num < 0
Chr_Num += 255
Wend
While 255 < Chr_Num
Chr_Num -= 255
Wend
'↑エラー防止のための処理↑ここまで
'文字コード番号を書き換える
Str$ = Chr_Num
Next I
/*ここまで暗号化*/
WritePrivateProfileString("Data", "User", User, ".\System.ini")
WritePrivateProfileString("Data", "PassWord", Str$, ".\System.ini")
EndDialog(hMainWnd,1)
Else
MessageBox(hMainWnd,"再入力をお願いします","再入力",MB_OK)
SetDlgItemText(hMainWnd,EditBox1,"")
SetDlgItemText(hMainWnd,EditBox2,"")
SetDlgItemText(hMainWnd,EditBox3,"")
Exit Sub
End If
End Sub
多分、複合化の際に、
が抜けているのが原因かと思います。
暗号化の定数を変えてなければ、
パスワードを「PASS」とすると、「iniファイル」の中身が、
「UFXX」→「ZK]]」→「_Pbb」→「dUgg」→「iZll」→「dUgg」→・・・
見たいな感じに変わったと思います。
コード: 全て選択
'文字列の長さを調べて保存する
Str_Size = Len(Str$)
修正コード [ここをクリックすると内容が表示されます]
コード: 全て選択
Sub MainWnd_CommandButton1_Click()
Dim ret As Long
Dim Letter As String
Dim User As String
Dim Str$ As String
Dim Pass2 As String
Dim P[SIZE] As Byte
Dim aaa As Long
Dim Str_Size As Long '文字列の長さ
Dim Chr_Num As Integer '文字コードの番号
Dim I As Long
GetDlgItemTextStr(hMainWnd,EditBox1,User)
GetDlgItemTextStr(hMainWnd,EditBox2,Str$)
GetDlgItemTextStr(hMainWnd,EditBox3,Pass2)
If User="" Then
MessageBox(hMainWnd,"ユーザー名が入力されていません","入力エラー",MB_OK)
End If
GetPrivateProfileString("Data","PassWord","",P,SIZE,".\System.ini")
lstrcpy(Str$,P)
'↓↓↓
'文字列の長さを調べて保存する
Str_Size = Len(Str$)
'↑↑↑
'複合化する
For I = 0 To Str_Size
'文字コード番号を取得する
Chr_Num = Str$
'文字コード番号から暗号化定数を引く
Chr_Num -= X
'↓エラー防止のための処理↓ここから
While Chr_Num < 0
Chr_Num += 255
Wend
While 255 < Chr_Num
Chr_Num -= 255
Wend
'↑エラー防止のための処理↑ここまで
'文字コード番号を書き換える
Str$ = Chr_Num
Next I
If lstrcmp(Str$,P)<>0 Then
aaa=MessageBox(hMainWnd,Ex"ユーザー名、又はパスワードがiniファイルに保存されているデータと違います。\r\nデータを書き換えますか?","確認",MB_YESNO)
If aaa=IDYES Then
MessageBox(0,"書き換えます","書き換え",MB_OK)
/* 暗号化するとき */
'文字列の長さを調べて保存する
Str_Size = Len(Str$)
'1Byteずつ暗号化する
For I = 0 To Str_Size
'文字コード番号を取得する
Chr_Num = Str$
'文字コード番号に暗号化定数を加える
Chr_Num += X
'↓エラー防止のための処理↓ここから
While Chr_Num < 0
Chr_Num += 255
Wend
While 255 < Chr_Num
Chr_Num -= 255
Wend
'↑エラー防止のための処理↑ここまで
'文字コード番号を書き換える
Str$ = Chr_Num
Next I
/*ここまで暗号化*/
WritePrivateProfileString("Data", "User", User, ".\System.ini")
WritePrivateProfileString("Data", "PassWord", Str$, ".\System.ini")
EndDialog(hMainWnd,1)
Else
MessageBox(0,"再入力してください","再入力",MB_OK)
SetDlgItemText(hMainWnd,EditBox2,"")
SetDlgItemText(hMainWnd,EditBox3,"")
Exit Sub
End If
End If
If lstrcmp(Str$,Pass2)=0 Then
If Str$="" Then
MessageBox(hMainWnd,"パスワードが入力されていません","入力エラー",MB_OK)
Exit Sub
End If
Else
MessageBox(hMainWnd,"パスワードが一致しません","入力エラー",MB_OK)
Exit Sub
End If
Letter="ユーザー:" + User + Ex"\r\n" + "パスワード:" + Str$ + Ex"\r\n" + "これでよろしいですか?"
ret=MessageBox(hMainWnd,Letter,"確認",MB_YESNO)
If ret=IDYES Then
MessageBox(hMainWnd,"分かりました","了解",MB_OK)
/* 暗号化するとき */
'文字列の長さを調べて保存する
Str_Size = Len(Str$)
'1Byteずつ暗号化する
For I = 0 To Str_Size
'文字コード番号を取得する
Chr_Num = Str$
'文字コード番号に暗号化定数を加える
Chr_Num += X
'↓エラー防止のための処理↓ここから
While Chr_Num < 0
Chr_Num += 255
Wend
While 255 < Chr_Num
Chr_Num -= 255
Wend
'↑エラー防止のための処理↑ここまで
'文字コード番号を書き換える
Str$ = Chr_Num
Next I
/*ここまで暗号化*/
WritePrivateProfileString("Data", "User", User, ".\System.ini")
WritePrivateProfileString("Data", "PassWord", Str$, ".\System.ini")
EndDialog(hMainWnd,1)
Else
MessageBox(hMainWnd,"再入力をお願いします","再入力",MB_OK)
SetDlgItemText(hMainWnd,EditBox1,"")
SetDlgItemText(hMainWnd,EditBox2,"")
SetDlgItemText(hMainWnd,EditBox3,"")
Exit Sub
End If
End Sub
暗号化の定数を変えてなければ、
パスワードを「PASS」とすると、「iniファイル」の中身が、
「UFXX」→「ZK]]」→「_Pbb」→「dUgg」→「iZll」→「dUgg」→・・・
見たいな感じに変わったと思います。
パスワードが「aiden」となるのは、
暗号化処理で、文字列の終わりにつく「NULL」が、書き換えられてしまうのが原因だったみたいです。
暗号化処理で、文字列の終わりにつく「NULL」が、書き換えられてしまうのが原因だったみたいです。
多分、これでいいと思うコード [ここをクリックすると内容が表示されます]
コード: 全て選択
Sub MainWnd_CommandButton1_Click()
Dim ret As Long
Dim Letter As String
Dim User As String
Dim pass_Str As String '暗号化と複合化する際に使う変数
Dim Pass1 As String '「EditBox2」の値を取得する変数
Dim Pass2 As String
Dim P[256] As BytePtr
Dim aaa As Long
Dim Str_Size As Long '文字列の長さ
Dim Chr_Num As Integer '文字コードの番号
Dim I As Long
GetDlgItemTextStr(hMainWnd, EditBox1, User)
GetDlgItemTextStr(hMainWnd, EditBox2, Pass1)
GetDlgItemTextStr(hMainWnd, EditBox3, Pass2)
If User="" Then
MessageBox(hMainWnd,"ユーザー名が入力されていません","入力エラー",MB_OK)
End If
GetPrivateProfileString("Data", "PassWord", "", P, 255, ".\System.ini")
pass_Str = ZeroString(Len(P))
lstrcpy(pass_Str, P)
'文字列の長さを調べて保存する
Str_Size = Len(pass_Str)
'複合化する
For I = 0 To Str_Size - 1
'文字コード番号を取得する
Chr_Num = pass_Str
'文字コード番号から暗号化定数を引く
Chr_Num -= X
'↓エラー防止のための処理↓ここから
While Chr_Num < 0
Chr_Num += 255
Wend
While 255 < Chr_Num
Chr_Num -= 255
Wend
'↑エラー防止のための処理↑ここまで
'文字コード番号を書き換える
pass_Str = Chr_Num
Next I
If lstrcmp(pass_Str, Pass1) <> 0 Then
aaa = MessageBox(hMainWnd, Ex"ユーザー名、又はパスワードがiniファイルに保存されているデータと違います。\r\nデータを書き換えますか?", "確認", MB_YESNO)
If aaa = IDYES Then
MessageBox(0, "書き換えます", "書き換え", MB_OK)
lstrcpy(pass_Str, Pass1)
/* 暗号化するとき */
'文字列の長さを調べて保存する
Str_Size = Len(pass_Str)
'1Byteずつ暗号化する
For I = 0 To Str_Size - 1
'文字コード番号を取得する
Chr_Num = pass_Str
'文字コード番号に暗号化定数を加える
Chr_Num += X
'↓エラー防止のための処理↓ここから
While Chr_Num < 0
Chr_Num += 255
Wend
While 255 < Chr_Num
Chr_Num -= 255
Wend
'↑エラー防止のための処理↑ここまで
'文字コード番号を書き換える
pass_Str = Chr_Num
Next I
/*ここまで暗号化*/
WritePrivateProfileString("Data", "User", User, ".\System.ini")
WritePrivateProfileString("Data", "PassWord", pass_Str, ".\System.ini")
EndDialog(hMainWnd,1)
Else
MessageBox(0, "再入力してください", "再入力", MB_OK)
SetDlgItemText(hMainWnd,EditBox2, "")
SetDlgItemText(hMainWnd,EditBox3, "")
Exit Sub
End If
End If
If lstrcmp(pass_Str, Pass1) = 0 Then
If Pass1 = "" Then
MessageBox(hMainWnd, "パスワードが入力されていません", "入力エラー", MB_OK)
Exit Sub
End If
Else
MessageBox(hMainWnd, "パスワードが一致しません", "入力エラー", MB_OK)
Exit Sub
End If
Letter = "ユーザー:" + User + Ex"\r\n" + "パスワード:" + Pass1 + Ex"\r\n" + "これでよろしいですか?"
ret = MessageBox(hMainWnd,Letter, "確認", MB_YESNO)
If ret = IDYES Then
MessageBox(hMainWnd, "分かりました", "了解", MB_OK)
/* 暗号化するとき */
'文字列の長さを調べて保存する
Str_Size = Len(pass_Str)
'1Byteずつ暗号化する
For I = 0 To Str_Size - 1
'文字コード番号を取得する
Chr_Num = pass_Str
'文字コード番号に暗号化定数を加える
Chr_Num += X
'↓エラー防止のための処理↓ここから
While Chr_Num < 0
Chr_Num += 255
Wend
While 255 < Chr_Num
Chr_Num -= 255
Wend
'↑エラー防止のための処理↑ここまで
'文字コード番号を書き換える
pass_Str = Chr_Num
Next I
/*ここまで暗号化*/
WritePrivateProfileString("Data", "User", User, ".\System.ini")
WritePrivateProfileString("Data", "PassWord", pass_Str, ".\System.ini")
EndDialog(hMainWnd,1)
Else
MessageBox(hMainWnd,"再入力をお願いします","再入力",MB_OK)
SetDlgItemText(hMainWnd,EditBox1,"")
SetDlgItemText(hMainWnd,EditBox2,"")
SetDlgItemText(hMainWnd,EditBox3,"")
Exit Sub
End If
End Sub