今、VBでソフトを開発中なのですが、SHWなどに当たり前のパスチェックルーチンが
組めません。(中身が見えてしまうため)
外から解析できないような強固なパスルーチンのいいアイデアはありませんか?
宜しくお願いします。
パスチェックルーチンって?
もうちょっと詳しく説明して
お願いね
説明不足で申し訳ありません。
シェアウェアなどを試用するとき、パスワードを要求されますよね?
私は、それをフォームにテキストボックスを置いて、そこにパスを入力
してもらうという形で実現しようとしたのですが、その方法だとバイナリーエディタ
で中を覗いて見ると、パスがどこかに見つかるんです。
これは意味がないですよね。
これを、防ぐための方法を探しているのですがなかなか・・・
で、これをパスチェックルーチンと呼ばせてもらいました。
何かアイデアが見つかるとソフトの不正使用は減ると思うのですが・・・
テキストコントロールなら
PasswordChar っていうプロパティがあるはずです、が、
それでは意味無いので
Basicで暗号化のプログラムってやりましたか?
例えばキャラクターコードを1つずつずらすとか......
↑の場合で a と入力すると b がでてきます。
KDDと入力すると、LLEになります。
だから、パスワードを QFRTBHJK と仮定します。
ユーザにはそのまま QFRTBHJK と入力すればいいのですが、
フォームは暗号化し、 RGSUCIKL と認識します。
if 変数$="RGSUCIKL" then ******
とすれば、たぶんいいと思いますが。
分からなかったら質問してください。
いつでも答えます。
必要あればサンプルを作ってみます
すみません、サンプルをお願いできますか?
暗号化のプログラムはまだ組んだことがないので・・・
もう初心者ではないと思ってはいるのですが・・・
暗号化にはZlibの圧縮(PNG)やPCX_RLE圧縮,TGA_RLE圧縮
Packed_Bits圧縮など画像圧縮20種類ぐらいを施して更に、自分なりの暗号化プログラムを施してやると通常の人には絶対わからないでしょうY(^^)Y
※JPEG圧縮はだめですよ。不可逆式なので暗号が元に戻りません。
サンプルできました。
このようにすればいいと思います。
Private Sub Command1_Click()
PASS$ = Text1.Text 'パスワードを代入します
For k = 1 To Len(PASS$)
tpass$ = tpass$ + Chr$(Asc(Mid$(PASS$, k, 1)) + 1) '一文字ずつ取り出し、↓へ
'キャラクターコードを
Next k '一つずつずらします
If tpass$ = "RGSUCIKL" Then 'この場合、ユーザはQFRTBHJKと入力した
MsgBox "パスワード一致"
Exit Sub
End If
'パスワードが一致しなかった処理
MsgBox "パスワードが一致しません"
End
End Sub
結果待ってます。
サンプルできました。
このようにすればいいと思います。
Private Sub Command1_Click()
PASS$ = Text1.Text 'パスワードを代入します
For k = 1 To Len(PASS$)
tpass$ = tpass$ + Chr$(Asc(Mid$(PASS$, k, 1)) + 1) '一文字ずつ取り出し、↓へ
'キャラクターコードを
Next k '一つずつずらします
If tpass$ = "RGSUCIKL" Then 'この場合、ユーザはQFRTBHJKと入力した
MsgBox "パスワード一致"
Exit Sub
End If
'パスワードが一致しなかった処理
MsgBox "パスワードが一致しません"
End
End Sub
結果待ってます。
すいません再送信しちゃいました。
ごめんなさい
Chr$(Asc(Mid$(PASS$, k, 1)) + 1)
を詳しく解説すると、
・関数
Asc関数は文字のJISコードを返値にします。(A->65,B->66)
Chr$関数はJISコードの文字を返値にします。
要するにAscとChr$は反対の性質を持っています。
・まとめて
Mid$で PASS$ から k 番目の文字を 1 文字取り出す。
その文字をAscで数に変換し、1を足す。
さらにその数字をChr$で文字に直す。
こんなような感じです。
でもこれはBASIC解説書をそのまま
パクったやつですけど・・・(*^_^*)
いろいろ応用して作れるので試してみてください。
ありがとうございます。
いただいたサンプルで試してみたところ、うまくいきました。
バイナリーエディタで覗いてもパスそのものは見つからなかったので。
もしまた何かあったら書かせていただきます。
そのときはよろしくお願いします。
どうも
あの、もう解決したんでいいんですけど、
別にシェアウェアとかのをパスワード入力にしないでもいいのでは?
Windowsフォルダとかに、登録した人だけもらえる、
複製不可能なファイルを置いてもらって、
その内容が作者の意図したとおりに読めなかったら未登録
逆なら登録済み、っていうふうに…。
えと、実際にシェアウェアを作ったわけじゃないんで、
"理論上は"ですけど…。
そのようなら、キーというモノをおすすめします。
私はそういうようなモノを使っているのですが、
方法は2つあります。
★方法1
1バイトほどの小さいキーを大量に作る。(1500個ほど)
これを手作りするには苦労するので専用のプログラムを組む。
例えば
*******.key.23
*******.key.26
〜〜〜〜〜〜〜〜〜〜〜〜
*******.key.1200
みたいな感じで作るといいと思います。
但し出現率及びナンバーの増え方は複雑にした方がいいと
思います。
しかし、スキャンディスクや起動時間などが増えます。
★方法2
わかりにくいところにバイナリファイルのなどをおいておく。
これはファイルの数が少なく起動時間などは
節約されますが、コピーされやすいので気をつけて。
以上の方法がよいと私は存じます。
結果待ってます。
結果待ってます
久々にきたので追加のカキコに気付きませんでした。
すみません。
上記の件ですが、もしよろしければサンプルを組んでいただけませんか?
図々しいお願いで申し訳ありませんが、よろしくお願いいたします。
サンプルですか、
これは、とある電卓のプログラムですが、
キーを作るほうは以下のように・・・
h=1
A
H=H+Y
if H<>int(H) then H=int(H)
if H<>int(H) then goto A:
Y=Y+1
if H=1.00041E+06 then end
N$="the calculator 2019."
N$=N$+trim$(str$(H))
N$=N$+".key"
open N$ for append as #1
close #1
if H>1000000 then end
goto A:
そしてこれは読み込むほうです。
SONAR
H=1
label1.caption= "キーファイルをチェック中。暫くお待さい...."
5
H=H+Y
X=X+1
console 2,2
if PER<>int(X/1415*100) then label2.caption=PER;"%チェック完了"
if H<>int(H) then H=int(H)
if H<>int(H) then goto A:
Y=Y+1
if H=1.00041E+06 then end
N$="the calculator 2019 key\the calculator 2019."
N$=N$+trim$(str$(H))
N$=N$+".key"
PER=int(X/1415*100)
open N$ for input as #1
close #1
if H=998992 then cls
if H=998992 then return
if N$="the calculator 2019.998992.key" then cls
if N$="the calculator 2019.998992.key" then return
goto 5:
return
そして、open ****** for input as #++++
のところでキーがなかったりしたらエラーが起きます。
エラールーチンを作ってください。
かなりわかりにくいですが、責任を持って質問は受けます。
訂正:
上の文はBASICでできています。
だから、ループのところにDoEventsを
おかないと危険です。
大変申し訳ありませんが、コードの解説をお願いできませんか?
よろしくお願いします。
すみません。分かりません。
自分で作ったのに構造がうっとうしくて
すっかり忘れてしまいました。
でも、重要なのは
キーナンバーを増やしながら、文字を組み立て、
その文字にナンバーを足し(&)、出力する。
ということです。あとこのキー数は1415個です。
一応VBのバージョンを作りました。
Private Sub Command1_Click()
5
On Error GoTo Ero
DoEvents
H = H + Y
X = X + 1
If PER <> Int(X / 1415 * 100) Then label2.Caption = PER + "%チェック完了"
If H <> Int(H) Then H = Int(H)
If H <> Int(H) Then GoTo 5:
Y = Y + 1
If H = 1000410# Then End
N$ = "the calculator 2019 key\the calculator 2019."
N$ = N$ + Trim$(Str$(H))
N$ = N$ + ".key"
PER = Int(X / 1415 * 100)
Open N$ For Input As #1
Close #1
If H = 998992 Then Exit Sub
If N$ = "the calculator 2019.998992.key" Then Exit Sub
GoTo 5:
Ero:
If Err.Number = 63 Then
MsgBox "キーに不良を発見"
MsgBox "At " + N$
On Error GoTo 0
End If
End Sub
変だったら教えてください。
どうもありがとうございます。
色々考えて、次回作での採用を考えたいと思います。
また何かあったらよろしくお願いします。
役に立ってくれるとウレシイです
今動かしてみたんですが、うまくいきませんでした。
上のルーチンって読み込みの部分だけですか?
ホントに図々しいお願いなのですが、キーファイルを作る
サンプルも作っていただけないでしょうか?
よろしくお願いします。
できた。
Private Sub Command1_Click()
H = 1
A:
DoEvents
H = H + Y
If H <> Int(H) Then H = Int(H)
If H <> Int(H) Then GoTo A:
Y = Y + 1
If H = 1000410# Then End
N$ = "the calculator 2019." 'キー名を構築
N$ = N$ + Trim$(Str$(H))
N$ = N$ + ".key"
Open N$ For Append As #1 '作成
Close #1
If H > 1000000 Then End 'キーナンバーが1000000以上になったら中止
GoTo A:
End Sub
Private Sub Command1_Click()
H = 1
A:
DoEvents
H = H + Y
If H <> Int(H) Then H = Int(H)
If H <> Int(H) Then GoTo A:
Y = Y + 1
If H = 1000410# Then End
N$ = "the calculator 2019." 'キー名を構築
N$ = N$ + Trim$(Str$(H))
N$ = N$ + ".key"
Open N$ For Append As #1 '作成
Close #1
If H > 1000000 Then End 'キーナンバーが1000000以上になったら中止
GoTo A:
End Sub
Hの増幅方法は多種多様です。
え?二回も送信されてる。
ようやく動かすことができました。
この質問に関わってくれた皆様ホントにありがとうございました。
α,Deltaさん,たかみちえさん,PAPYさん
29回も!
ツイート | ![]() |