|
|
2018/4/7(Sat) 17:12:59|NO.83911
こんにちわ
質問なんですけど
データをvsaveで保存して
その保存したファイルに暗号をかけるって出来るんですか?
自分、save/load苦手なんで
そう出来たらものすごく助かるんですが
暗号は解くのが上手い人でも解けないじゃなくて
解くのがめんどくさいからやめておく
くらいの人を対象にしたかんじで
|
|
2018/4/7(Sat) 17:30:49|NO.83912
考えてるのは 一回vsaveして 暗号化したファイルを作り vsaveしたfileを削除します
復号は、fileを復号してvload用fileにして vloadしてvload用ファイルを削除するかんじです
|
|
2018/4/7(Sat) 18:29:12|NO.83913
試してませんが可能だと思いますよ。
vsave "暗号化前データ"
bload "暗号化前データ", alldata
delete "暗号化前データ"
・alldata内容を暗号化処理
bsave "暗号化後データ", alldata
こんな流れになるかと思います。
逆に読み込むときは
bload "暗号化後データ", alldata
delete "暗号化後データ"
・alldata内容を復号化処理
bsave "復号化後データ", alldata
vload "復号化後データ"
delete "復号化後データ"
こんな感じですかね。
暗号化処理は簡単でいいなら排他的論理和あたりを使うと
楽に暗号化&復号化できますよ。
|
|
2018/4/7(Sat) 19:22:36|NO.83914
この処理は一年前くらいに考えて答えが出なかった問題なんですが
bload "暗号化前データ", alldata
で、alldataが大きくなり
もう一度、vsaveする時
bload "暗号化前データ", alldata
すると更に大きくならないっすか?
alldataの確保のしなおし(小さい配列として確保)
のタイミングがわからないんですよね
|
|
2018/4/7(Sat) 19:57:46|NO.83915
あー、複数回保存するとalldataまでvsaveに含まれてしまい
結果vsaveファイルが大きくなってしまうということですか?
vsave時には vsave_start、vsave_put、vsave_end を使って保存する変数を選択
そしてbload直前にexistでファイルサイズ確認し、
そのサイズでsdimとすればいいと思いますよ。
vsave_start // alldata以外を選択
vsave_put p1
vsave_put p2
vsave_put p3
…
vsave_end "暗号化前データ"
exist "暗号化前データ"
filesize = strsize
sdim alldata, filesize
bload "暗号化前データ", alldata
1つ1つ変数を選択するのが面倒ですが
こうすれば無駄に容量を取られることもないと思います。
|
|
2018/4/7(Sat) 21:53:07|NO.83916
うーん。やっぱりvsave_putで一つ一つ選択しなきゃダメですかあ
前々回のコンテストの軽いゲームではそれでやったんですが
なんとかしてvsave一発で出来ないのかな。と思ったんですが
変数だけならまだしも あえて使わなかったんですが
モジュール変数が絡むとよくわかんないんですよね
マニュアルには
>すべての変数の内容を配列やモジュール変数も含めて保存しますが、
とあるんですがモジュール変数内にモジュール変数を使ってる場合はどうすればいいのかな。とか
モジュール変数が絡むとよくわかんないです
|
|
2018/4/7(Sat) 22:31:27|NO.83917
モジュール変数は
【変数名@モジュール名】
という形になりますが、変数名一覧を作った方がいいかもしれませんね。
getmaxvar n;
repeat n
getvarname varname, cnt;
mes varname;
loop
これで使ってる変数名がモジュール変数も含めて全て表示されます。
これを応用して
・メモリノートパッド形式で変数名一覧を作成
・保存したくない変数名を検索&削除
・残った変数名のみrepeat vsave_put loopで追加
・ループが終了したらvsave_end
こんな流れで出来そうな気がします。
ただモジュール変数に関しては、
モジュール内で定義した命令や関数を一度も使わないと
一覧に出て来ないようです。
まあ使って無いということは、保存する必要はないという事なので
これは対策する必要もなさそうですね。
|
|
2018/4/7(Sat) 23:01:13|NO.83918
返信ありがとうございまず
現在はそろそろコンテスト向け作品 作成し始めようかなってとこで
まだコード書いてないので 試せなくて申し訳ないです
モジュール変数に関しては
#module one_job one_job_lv
#global
#module job_fig job_fa,job_fb,job_fc
modinit
newmod job_fa,one_job
newmod job_fb,one_job
newmod job_fc,one_job
return
#global
#module job_mag job_ma,job_mb,job_mc
modinit
newmod job_ma,one_job
newmod job_mb,one_job
newmod job_mc,one_job
return
#global
みたいな骨組みでやろうと思ってるんですけど
この骨組みだと どんなかんじでモジュール変数を指定すべきなんでしょうか
one_jobのインスタンスがこの例だと6つあるんですけど
質問ばかりですみません
|
|
2018/4/7(Sat) 23:09:52|NO.83919
簡単に試してみました
#include "hspda.as"
#module one_job one_job_lv
#modinit
one_job_lv=1
return
#modfunc dump
logmes ""+one_job_lv
return
#global
#module job_fig job_fa,job_fb,job_fc
#modinit
newmod job_fa,one_job
newmod job_fb,one_job
newmod job_fc,one_job
return
#modfunc dump_b
dump job_fa
return
#global
#module job_mag job_ma,job_mb,job_mc
#modinit
newmod job_ma,one_job
newmod job_mb,one_job
newmod job_mc,one_job
return
#modfunc dump_c
dump job_ma
return
#global
newmod fig,job_fig
newmod mag,job_mag
dump_b fig
dump_c mag
getmaxvar n;
repeat n
getvarname varname, cnt;
mes varname;
loop
fig
mag
n
varname
としか表示されませんが ちゃんと保存されます?
|
|
2018/4/7(Sat) 23:42:06|NO.83920
外の関数で暗号化・復号すればいいと思いますよ。(つまり、execで動くものや、dllで読み出すもの)
…ちょっと実装はまってて?(またはやらないかもしれないが)
|
|
2018/4/7(Sat) 23:48:28|NO.83921
モジュール変数ではなくモジュール「型」変数ですね。
figとmagの中身がそれぞれのモジュール内にある
全てのモジュール型変数(ややこしいですね)の内容まで入っているはずなので
(たぶん)保存されるとかと思います。
Velgailさんの方法もありですね。
|
|
2018/4/8(Sun) 09:28:14|NO.83922
私はこれを使ってます。
http://type74.org/rijndll.php
安全性的には、スクリプトを逆コンパイルされる、デバッガで止められてスタックポインタを引っこ抜かれる…などで解読されますが、面倒くさいので、要件には合うかと思いますがいかがでしょうか?
|
|
2018/4/8(Sun) 23:00:02|NO.83952
返信ありがとございます
>あらやさん
モジュール型変数機能を型とすると
その型の複製みたいなかんじで 独自の名前はないっぽいので
内側のモジュール型変数もいっぺんに保存できなきゃどうしようもないので
いっぺんに保存出来そうなんですが
やっぱりなんかコード書いて検証しなきゃ 信頼出来ないっぽいのかな
>猫さん
そのDLLを使ったらある程度堅牢そうですな
でも暗号の方法は付属dllのどっかにあった暗号命令を使ってますね
>Velgailさん
やっぱりスクリプト外部で暗号かけないとダメっすか
でもそう言われてみると出来そうな気はしますが
自信はないっすねw
追記:さんづけ記述し忘れてました
|
|
2018/4/8(Sun) 23:12:12|NO.83953
そういえばLongintにRC4くらいはあったなー と思い出してさっくり書いてみました。
暗号化部分
#include "longint.hsp"
#runtime "hsp3cl"
#const BUFSIZE 1024*1024
sdim buf,BUFSIZE
sdim buf2,BUFSIZE
t=dir_cmdline
split t,"?",d
key=d(1)
InitRC4 context,key,strlen(key)
tgt=""
if(getpath(d(0),2)==".cpt"){
tgt=getpath(d(0),1)
}else{
tgt=d(0)+".cpt"
}
bsave tgt,buf2,0
repeat
bload d(0),buf,BUFSIZE,BUFSIZE*cnt
if strsize==0:break
EncryptRC4 context,buf2,buf,strsize
bsave tgt,buf2,strsize,BUFSIZE*cnt
loop
CloseRC4 context
で、利用部分
exec "上の実行ファイル名.exe 暗号化したいファイル(フルパス)?パスワード"
で暗号化・復号は同じコマンド。パスワードとの区切り文字として、"?"を利用しています。「面倒だったので」
(ソースはできうる限りPublic Domain。サンプルソースがあるため不明)
|
|
2018/4/10(Tue) 08:00:56|NO.83975
vsaveで保存されたファイルの構造を見て、変数名だけを取り出したら vsave・vload に関わる変数は除外できるような。
追記 : hspda に変数名と変数ID を取得する命令が存在したので、それを使用すると簡単かなー。
|
|
2018/4/10(Tue) 21:34:40|NO.83985
hspinet.asにあるといわれたので再実装。
#include "hspinet.as"
#runtime "hsp3cl"
t=dir_cmdline
split t,"?",d
key=d(1)
tgt=""
if(getpath(d(0),2)==".cpt"){
tgt=getpath(d(0),1)
}else{
tgt=d(0)+".cpt"
}
exist d(0)
fs=strsize
sdim buf,fs
bload d(0),buf,fs
rc4encode buf,key,fs
bsave tgt,buf,fs
end
execによる実行部分は同じ。これを別の実行ファイルとして用意してコマンドで実行すれば楽に暗号化できる。
「ただし、パスワードのハック対策」は「本気でやるには」必要。
|
|
2018/4/10(Tue) 22:38:39|NO.83989
こんばんわ
>Velgailさん
自分のスキルが拙いせいで色々と申し訳ありませんでした
なんかもうこのまんま使う気マンマンだったり
>「ただし、パスワードのハック対策」は「本気でやるには」必要。
自分には少々パスワードを長くするくらいしか出来なそうですね
スクリプトの短さが災いして
どうやっても逆アセンブルで解読されちゃうでしょうし
自分はゲームはPARとか使っちゃうので 自業自得と思って割り切りますよ
|
|
2018/4/11(Wed) 10:58:54|NO.83996
すんません。忘れてました。解決check!
|
|
2018/4/11(Wed) 16:52:34|NO.83997
こんちわー
>vsaveで保存されたファイルの構造を見て
と書いてあったので ちょっと見てみました
#include "hspda.as"
#module one_job one_job_lv
#modinit
one_job_lv=1
return
#modfunc dump
logmes ""+one_job_lv
return
#global
#module job_fig job_fa,job_fb,job_fc
#modinit
newmod job_fa,one_job
newmod job_fb,one_job
newmod job_fc,one_job
return
#modfunc dump_b
dump job_fa
return
#global
#module job_mag job_ma,job_mb,job_mc
#modinit
newmod job_ma,one_job
newmod job_mb,one_job
newmod job_mc,one_job
return
#modfunc dump_c
dump job_ma
return
#global
newmod fig,job_fig
newmod mag,job_mag
dump_b fig
dump_c mag
getmaxvar n;
repeat n
getvarname varname, cnt;
mes varname;
loop
vsave "tmp.dat"
を実行して teraPadで"tmp.dat"を見ると
one_jobという文字列が6個、出てきます
インスタンスをvsave_putするとどうなるのかな?と思い
#include "hspda.as"
#module one_job one_job_lv
#modinit
one_job_lv=1
return
#modfunc dump
logmes ""+one_job_lv
return
#global
#module job_fig job_fa,job_fb,job_fc
#modinit
newmod job_fa,one_job
newmod job_fb,one_job
newmod job_fc,one_job
return
#modfunc dump_b
dump job_fa
return
#global
#module job_mag job_ma,job_mb,job_mc
#modinit
newmod job_ma,one_job
newmod job_mb,one_job
newmod job_mc,one_job
return
#modfunc dump_c
dump job_ma
return
#global
newmod fig,job_fig
newmod mag,job_mag
dump_b fig
dump_c mag
getmaxvar n;
repeat n
getvarname varname, cnt;
mes varname;
loop
vsave_start
vsave_put fig
vsave_put mag
vsave_end "two_vsave.dat"
というスクリプトを実行して"two_vsave.dat"をterapadで見ると
こっちもone_jobという文字列が6個ありました
インスタンスをvsave_putすると中のモジュール変数も保存される可能性が高いです
って型からたいやきを作るようなものなんで
一意の名前ないっぽいでしょうし
してくれないとお手上げではあるんですけどね
と、資料として書きましたが ここの掲示板にふさわしくなければ
転載削除しますので 言ってください
| |
|
2018/4/11(Wed) 16:59:55|NO.83998
中のモジュールがvsaveで保存されてるかのTESTです
#include "hspda.as"
#module one_job one_job_lv
#modinit
one_job_lv=1
return
#modfunc plus_1
one_job_lv++
return
#modfunc dump
logmes ""+one_job_lv
return
#global
#module job_fig job_fa,job_fb,job_fc
#modinit
newmod job_fa,one_job
newmod job_fb,one_job
newmod job_fc,one_job
return
#modfunc one_job_plus
plus_1 job_fa
plus_1 job_fb
plus_1 job_fb
plus_1 job_fc
plus_1 job_fc
plus_1 job_fc
return
#modfunc dump_b
dump job_fa
dump job_fb
dump job_fc
return
#global
#module job_mag job_ma,job_mb,job_mc
#modinit
newmod job_ma,one_job
newmod job_mb,one_job
newmod job_mc,one_job
return
#modfunc dump_c
dump job_ma
return
#global
newmod fig,job_fig
newmod mag,job_mag
button "plus",*plus
button "vsave",*_vsave
button "vload",*_vload
dump_b fig
dump_c mag
stop
*plus
one_job_plus fig
dump_b fig
stop
*_vsave
vsave "tmp.dat"
stop
*_vload
vload "tmp.dat"
stop
この簡単なスクリプトでは保存出来てますね
|
|
2018/4/11(Wed) 17:07:27|NO.83999
続きましてモジュール型変数のvsave_startのTEST
#include "hspda.as"
#module one_job one_job_lv
#modinit
one_job_lv=1
return
#modfunc plus_1
one_job_lv++
return
#modfunc dump
logmes ""+one_job_lv
return
#global
#module job_fig job_fa,job_fb,job_fc
#modinit
newmod job_fa,one_job
newmod job_fb,one_job
newmod job_fc,one_job
return
#modfunc one_job_plus
plus_1 job_fa
plus_1 job_fb
plus_1 job_fb
plus_1 job_fc
plus_1 job_fc
plus_1 job_fc
return
#modfunc dump_b
dump job_fa
dump job_fb
dump job_fc
return
#global
#module job_mag job_ma,job_mb,job_mc
#modinit
newmod job_ma,one_job
newmod job_mb,one_job
newmod job_mc,one_job
return
#modfunc dump_c
dump job_ma
return
#global
newmod fig,job_fig
newmod mag,job_mag
button "plus",*plus
button "vsave",*_vsave
button "vload",*_vload
dump_b fig
dump_c mag
stop
*plus
one_job_plus fig
dump_b fig
stop
*_vsave
vsave_start
vsave_put fig
vsave_put mag
vsave_end "two_vsave.dat"
stop
*_vload
vload_start "two_vsave.dat"
vload_get fig
vload_get mag
vload_end
stop
この簡単なTESTでは大丈夫そうです
>また、モジュール型の変数は、保存した時点とモジュール名、
>モジュール変数定義数が同じでなければ読み込まれません。
モジュール型変数は動的に色々変えれるので
そういうのとは相性悪いってことですな
失礼しました
| |
|
2018/4/11(Wed) 17:50:46|NO.84000
vload_get / vsave_put の変数名変数で指定できれば良いんですけどね。
現状は、変数 Y_repeat と指定したら、Y_repeat を読み込みに行くんですけど。
それを a = "Y_repeat" として指定できればいろいろと出来るのになーっと。
(グローバル変数をモジュールで一括初期化できるスクリプトはここの掲示板に存在したけど、やっぱモジュール変数は怖いからって実装していなかった。)
http://hsp.tv/play/pforum.php?mode=all&num=78978
|
|
2018/4/12(Thu) 17:33:47|NO.84015
こんにちわ
>MillkeyStarsさん
自分も似たようなことっていうか
#enumのようなデータをスクリプトを書く側から作成出来ないか?
と考えたことがあるんですけど
連想配列を使えば出来るか。ってのが答えです
変数を連想配列で管理してるプログラム言語ありますよね
線形探索でも 要素数20〜50くらいなら問題なさそうと思ってます
いきなり文字列比較しないで 長さを比較して一致してから
文字列を比較するかんじで
インスタンスもマクロで隠して決め打ちしたら そんなに操作もめんどくさくなさそう
と思ってます
まだやったことないんですけどね^^;
|
|