HSPポータル
サイトマップ お問い合わせ


HSPTV!掲示板


未解決 解決 停止 削除要請

2018
0407
Y_repeatvsaveと暗号化23解決


Y_repeat

リンク

2018/4/7(Sat) 17:12:59|NO.83911

こんにちわ
質問なんですけど
データをvsaveで保存して
その保存したファイルに暗号をかけるって出来るんですか?
自分、save/load苦手なんで
そう出来たらものすごく助かるんですが
暗号は解くのが上手い人でも解けないじゃなくて
解くのがめんどくさいからやめておく
くらいの人を対象にしたかんじで



この記事に返信する


Y_repeat

リンク

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 "復号化後データ"

こんな感じですかね。

暗号化処理は簡単でいいなら排他的論理和あたりを使うと
楽に暗号化&復号化できますよ。



Y_repeat

リンク

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つ変数を選択するのが面倒ですが
こうすれば無駄に容量を取られることもないと思います。



Y_repeat

リンク

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

こんな流れで出来そうな気がします。

ただモジュール変数に関しては、
モジュール内で定義した命令や関数を一度も使わないと
一覧に出て来ないようです。
まあ使って無いということは、保存する必要はないという事なので
これは対策する必要もなさそうですね。



Y_repeat

リンク

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つあるんですけど
質問ばかりですみません



Y_repeat

リンク

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
としか表示されませんが ちゃんと保存されます?



Velgail

リンク

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
安全性的には、スクリプトを逆コンパイルされる、デバッガで止められてスタックポインタを引っこ抜かれる…などで解読されますが、面倒くさいので、要件には合うかと思いますがいかがでしょうか?



Y_repeat

リンク

2018/4/8(Sun) 23:00:02|NO.83952

返信ありがとございます

>あらやさん
モジュール型変数機能を型とすると
その型の複製みたいなかんじで 独自の名前はないっぽいので
内側のモジュール型変数もいっぺんに保存できなきゃどうしようもないので
いっぺんに保存出来そうなんですが
やっぱりなんかコード書いて検証しなきゃ 信頼出来ないっぽいのかな

>猫さん
そのDLLを使ったらある程度堅牢そうですな
でも暗号の方法は付属dllのどっかにあった暗号命令を使ってますね

>Velgailさん
やっぱりスクリプト外部で暗号かけないとダメっすか
でもそう言われてみると出来そうな気はしますが
自信はないっすねw

追記:さんづけ記述し忘れてました



Velgail

リンク

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。サンプルソースがあるため不明)



MillkeyStars

リンク

2018/4/10(Tue) 08:00:56|NO.83975

vsaveで保存されたファイルの構造を見て、変数名だけを取り出したら vsave・vload に関わる変数は除外できるような。

追記 : hspda に変数名と変数ID を取得する命令が存在したので、それを使用すると簡単かなー。



Y_repeat

リンク

2018/4/10(Tue) 18:10:08|NO.83979

こんちわ。返信ありがとうございます
>Velgailさん
ちょっと調べたんですけど
>暗号化ってhspinetにあるrc4encodeで
http://hsp.tv/play/pforum.php?mode=pastwch&num=66480
でやってます
longintは再配布可か不明なんですよね
サンプルの動作が追い切れてなくて
hspinetを使うかんじだとどうなりますか?

って
>vsaveの暗号化
http://hsp.tv/play/pforum.php?mode=pastwch&num=72343
というタイトルで昔に質問してたというw
でも今回は解決出来そうってことで結果オーライみたいなw

>MillkeyStarsさん
変数だけならデバッガ―見ながら 一応書けるんですが
モジュール型変数の扱いがよくわかってなくてですね
DQ1の公開する気のない ステータスだけパクッたゲームとか
制御不能になったりしてます
そっちもモジュール型変数使って ステータス保持してたなー



Velgail

リンク

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による実行部分は同じ。これを別の実行ファイルとして用意してコマンドで実行すれば楽に暗号化できる。
「ただし、パスワードのハック対策」は「本気でやるには」必要。



Y_repeat

リンク

2018/4/10(Tue) 22:38:39|NO.83989

こんばんわ

>Velgailさん
自分のスキルが拙いせいで色々と申し訳ありませんでした
なんかもうこのまんま使う気マンマンだったり

>「ただし、パスワードのハック対策」は「本気でやるには」必要。
自分には少々パスワードを長くするくらいしか出来なそうですね
スクリプトの短さが災いして
どうやっても逆アセンブルで解読されちゃうでしょうし
自分はゲームはPARとか使っちゃうので 自業自得と思って割り切りますよ



Y_repeat

リンク

2018/4/11(Wed) 10:58:54|NO.83996

すんません。忘れてました。解決check!



Y_repeat

リンク

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すると中のモジュール変数も保存される可能性が高いです
って型からたいやきを作るようなものなんで
一意の名前ないっぽいでしょうし
してくれないとお手上げではあるんですけどね

と、資料として書きましたが ここの掲示板にふさわしくなければ
転載削除しますので 言ってください



Y_repeat

リンク

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
この簡単なスクリプトでは保存出来てますね



Y_repeat

リンク

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では大丈夫そうです

>また、モジュール型の変数は、保存した時点とモジュール名、
>モジュール変数定義数が同じでなければ読み込まれません。
モジュール型変数は動的に色々変えれるので
そういうのとは相性悪いってことですな

失礼しました



MillkeyStars

リンク

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



Y_repeat

リンク

2018/4/12(Thu) 17:33:47|NO.84015

こんにちわ

>MillkeyStarsさん
自分も似たようなことっていうか
#enumのようなデータをスクリプトを書く側から作成出来ないか?
と考えたことがあるんですけど
連想配列を使えば出来るか。ってのが答えです
変数を連想配列で管理してるプログラム言語ありますよね

線形探索でも 要素数20〜50くらいなら問題なさそうと思ってます
いきなり文字列比較しないで 長さを比較して一致してから
文字列を比較するかんじで
インスタンスもマクロで隠して決め打ちしたら そんなに操作もめんどくさくなさそう
と思ってます

まだやったことないんですけどね^^;



ONION software Copyright 1997-2023(c) All rights reserved.