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


HSPTV!掲示板


未解決 解決 停止 削除要請

2014
1214
サンダーボルトファイル暗号化ソフトを作ってみた12解決


サンダーボルト

リンク

2014/12/14(Sun) 18:47:51|NO.66457

今まで、いろいろ質問させていただきましたが、ソフトを自作しました。

#packopt name "ファイル暗号化2.exe" title "ファイル暗号化" *manu screen 0,300,300 cls 4 color 0,225 objsize 300,100 button "暗号化",*ang button "復号化",*hgk button "終了",*eed stop *ang screen 0,300,265 cls 4 color 0,225 dialog "",16,"暗号化するファイル" if stat=0:goto *manu ad=refstr mes "暗号化するファイル" mes ad exist ad :size=strsize mes "" mes "サイズ" mes ""+size+"B" mes "" mes "暗号化コード(半角英数)" pas=2 input pas,300,20 objsize 300,100 mes "" button"暗号化", *ang2 stop *ang2 sdim fd,size sdim ffd,size bload ad,fd repeat size v=peek(fd,cnt) v=v+pas poke ffd,cnt,v loop bsave ad,ffd dialog "終了しました" goto *manu *hgk screen 0,300,265 cls 4 color 0,225 dialog "",16,"復号化するファイル" if stat=0:goto *manu ad=refstr mes "復号化するファイル" mes ad exist ad :size=strsize mes "" mes "サイズ" mes ""+size+"B" mes "" mes "復号化コード(半角英数)" pas=2 input pas,300,20 objsize 300,100 mes "" button"復号化", *hgk2 stop *hgk2 sdim fd,size sdim ffd,size bload ad,fd repeat size v=peek(fd,cnt) v=v-pas poke ffd,cnt,v loop bsave ad,ffd dialog "終了しました" goto *manu *eed end

ご意見お願いします



この記事に返信する


cats

リンク

2014/12/14(Sun) 19:21:57|NO.66459

コード少し見ただけですがシーザー暗号ですか。
ただのシーザーならいいんですが、勝手に64バイト以上で保存すると小さいデータを復号できなくなりますよ。



サンダーボルト

リンク

2014/12/14(Sun) 22:27:10|NO.66470




kanahiron

リンク

2014/12/14(Sun) 23:02:51|NO.66472

暗号化コードに0を指定しても何も変わりません(そりゃ単純加算なので当たり前ですが)
また半角英数ってなってますが先頭がアルファベットやアルファベットのみだと0扱いになって暗号化しても変わらないのですがいいのでしょか
せめてコードからハッシュを作ってそれを使いましょうよ

あとファイルサイズの2倍のメモリを確保する素晴らしい仕様なので1GB以上のファイルを暗号/復号するとクラッシュします



ファルコン

リンク

2014/12/14(Sun) 23:24:43|NO.66473

試しに適当な文字列を暗号化させ、復号化させたら文字列の語尾に長い中点が連なった。



cats

リンク

2014/12/14(Sun) 23:50:22|NO.66474

>試しに適当な文字列を暗号化させ、復号化させたら文字列の語尾に長い中点が連なった。
元のファイルサイズを考慮せずに保存しているため、保存時に変数のヌル文字が保存されています。
復号化すると0xFF - {key}の文字コードが連続します。

>クラッシュします
確かに一定バイトずつ演算しないとメモリを食ってしまいますね。
そもそも足し引きだけというのが・・・



サンダーボルト

リンク

2014/12/16(Tue) 18:34:02|NO.66486

まあ、1GB以上のデータなんてそうそうありませんからね



ZP。

リンク

2014/12/19(Fri) 20:05:44|NO.66509

わたしもちょっと作ってみました。
参考になれれば幸いです。

/*━━━━━━━━━━ 画面初期化 ──────────*/ screen 0,140,100 ;画面初期化 objsize 140,40 ;オブジェクトサイズ指定 pos 0,0 :button gosub"暗号化",*ango pos 0,40 :button gosub"復号化",*hkgo font "",12 :pos 3,83 :mes "暗号コード(0〜255)" key=rnd(255) :pos 110,80 :input key,30,20,3 ;キーインプットボックス設置 stop /*━━━━━━━━━━ 暗号化 ──────────*/ *ango dialog "",16,"暗号化するファイル" ;ファイルの選択 if stat=0 :return name=refstr exist name :size=strsize ;ファイルサイズの確認 if size=-1 :dialog "ファイル読み込みエラー",1,"エラー" :return sdim data,size ;メモリ初期化 bload name,data ;ファイル読み込み //----暗号化 repeat size poke data,cnt,peek(data,cnt)+key ;暗号化 loop dialog "暗号化成功",,"成功" //----セーブファイルの選択 mod=0 ;(0=実行中,1=セーブ,2=エラー) do dialog "",17,"暗号化したファイルの保存" if stat=0{ dialog "本当にキャンセルしますか?",3,"確認" if stat=6{ mod=2 } }else{ mod=1 } until mod>0 //----ファイルセーブ name=refstr if mod=1 :bsave name,data,size return ;終了 /*━━━━━━━━━━ ファイル保存復号化 ─────────*/ *hkgo dialog "",16,"復号化するファイル" ;ファイルの選択 if stat=0 :return name=refstr exist name :size=strsize ;ファイルサイズの確認 if size=-1 :dialog "ファイル読み込みエラー",1,"エラー" :return sdim data,size ;メモリ初期化 bload name,data ;ファイル読み込み //----復号化 repeat size poke data,cnt,peek(data,cnt)-key ;暗号化 loop dialog "復号化成功",,"成功" //----セーブファイルの選択 mod=0 ;(0=実行中,1=セーブ,2=エラー) do dialog "",17,"複合化したファイルの保存" if stat=0{ dialog "本当にキャンセルしますか?",3,"確認" if stat=6{ mod=2 } }else{ mod=1 } until mod>0 //----ファイルセーブ name=refstr if mod=1 :bsave name,data,size return



サンダーボルト

リンク

2014/12/19(Fri) 21:43:56|NO.66510

ZP。様

ありがとうございます。

メモリがジ・エンドになる点については
バッファのオフセット値
とかいうのを使えばいいのでしょうか?



cats

リンク

2014/12/19(Fri) 22:47:18|NO.66513

>ZP。 さん
コード読んだだけなのですが、これでは巨大なファイルの読み込みでメモリが不足してしまいませんか。
1バイトずつでは小さすぎるかもしれませんが1キロバイトずつなど少量で読み込んだ方が
メモリを食わないし、メモリから平文を盗まれる可能性も大幅に低くなりますよ。



ZP。

リンク

2014/12/19(Fri) 23:00:57|NO.66514

>>メモリがジ・エンドになる点については・・・
メモリ不足になるということでしょうか? (間違っていたら申し訳ないです。)

そうですね。
ファイルの一部のみを読み込んで、処理して、その一部をファイルに書き込む。
これを繰り返していけば、メモリ不足にはならないと思います。

bsaveのオフセットについて(HSPヘルプより)

ファイルのオフセット値を指定すると、その値だけファイルの先頭からずらした場所からが操作の対象になります。 bsave命令でオフセットを指定すると、 ファイルの先頭から任意のサイズを過ぎた場所からセーブを行なうことが可能です。 (この場合は、それオフセットより前のファイル内容は変化しません。 また、オフセット指定時はファイルが存在しない場合エラーとなります。)



ZP。

リンク

2014/12/19(Fri) 23:01:43|NO.66515

>>catsさん
すみません。投稿が重複してしまいました。



ZP。

リンク

2014/12/20(Sat) 00:32:39|NO.66519

連続投稿すみません。

>>コード読んだだけなのですが、これでは巨大なファイルの読み込みでメモリが不足してしまいませんか。
あくまで参考なので、そこまで書くつもりはありませんでした。

あと、ソースをもう少し改良してみました。(あくまで私の興味ですので。)
・ファイル内容を分割処理で実行するように改良
・巨大ファイルを処理する用に、一時停止、完全停止ボタンを設置

/*━━━━━━━━━━ 画面初期化 ──────────*/ //----変数初期化 zmod=0 ;(0=待機中,1=実行中,2=一時停止,3=完全停止) //----画面初期化 screen 0,140,120 ;画面初期化 syscolor 15 :boxf color 210,210,210 :boxf 0,100,140,120 objsize 140,40 ;オブジェクトサイズ指定 pos 0,0 :button gosub"暗号化",*ango :ID_ango=stat pos 0,40 :button gosub"復号化",*hkgo :ID_hkgo=stat color :font "",12 :pos 3,83 :mes "暗号コード(0〜255)" key=rnd(255) :pos 110,80 :input key,30,20,3 :ID_key=stat ;キーインプットボックス設置 color :font "",12 :pos 3,103 :mes "待機中" stop /*━━━━━━━━━━ 暗号化 ──────────*/ *ango //----システム処理 if zmod=1{ ;一時停止ボタンが押された場合 zmod=2 ;モードを変更 objprm ID_ango,"再開" ;再開ボタンに変更 return ;戻る } if zmod=2{ ;一時停止ボタンが押された場合 zmod=1 ;モードを変更 objprm ID_ango,"一時停止" ;一時停止ボタンに変更 return ;戻る } //----読み込みファイルの選択 dialog "",16,"暗号化するファイル" ;ファイルの選択 if stat=0 :return loadname=refstr exist loadname :size=strsize ;ファイルサイズの確認 if size=-1 :dialog "ファイル読み込みエラー",1,"エラー" :return //----保存先ファイルの選択 dialog "",17,"暗号化するファイル" ;ファイルの選択 if stat=0 :return savename=refstr //----画面の変更 zmod=1 ;実行モードを変更 objprm ID_ango,"一時停止" ;暗号ボタンを一時停止ボタンに変更 objprm ID_hkgo,"完全停止" ;暗号ボタンを停止ボタンに変更 objenable ID_key,0 ;キーの変更を無効化 //----暗号化 maxsize=32000 ;一回に保存するデーターの最大サイズ sdim data,maxsize //----ファイル暗号化処理 repeat size/maxsize+1 bload loadname,data,maxsize,cnt*maxsize ;一部のみ読み込み lop=limit(size-maxsize*cnt,0,maxsize) ;ループ数 repeat lop poke data,cnt,peek(data,cnt)+key ;暗号化 loop if cnt{ bsave savename,data,lop,cnt*maxsize }else{ ;始めは新規作成 bsave savename,data,lop } await 1 ;一定時間待つ redraw 0 color 210,210,210 :boxf 0,100,140,120 a=100.0/(size/maxsize+1)*cnt color :font "",12 :pos 3,103 :mes "暗号化実行中:"+strf("%.1f",a)+"%終了" redraw 1 if zmod=2{ redraw 0 color 210,210,210 :boxf 0,100,140,120 a=100.0/(size/maxsize+1)*cnt color :font "",12 :pos 3,103 :mes "暗号化一時停止中:"+strf("%.1f",a)+"%終了" redraw 1 do :await 100 :until zmod=1 | zmod=3 ;一時停止が解除されたら実効再開。もしくは完全停止が押された場合 } if zmod=3 :break ;強制的に停止 loop color 210,210,210 :boxf 0,100,140,120 color :font "",12 :pos 3,103 :mes "待機中" objprm ID_ango,"暗号化" ;ボタンを戻す objprm ID_hkgo,"復号化" ;ボタンを戻す objenable ID_key,1 ;キーの変更を有効化 if zmod=1 :dialog "処理が完了しました。",,"完了" if zmod=3 :dialog "ユーザーにより処理が停止されました。\n作成したファイルを削除しますか?",3,"完了" :if stat=6{delete savename} zmod=0 ;実行モードの変更 return ;終了 /*━━━━━━━━━━ 復号化 ─────────*/ *hkgo //----システム処理 if zmod!=0{ ;一時停止ボタンが押された場合 dialog "本当に実行を停止しますか?",3,"警告" if stat=6{ zmod=3 ;モードを変更 objprm ID_ango,"再開" ;再開ボタンに変更 } return ;戻る } //----読み込みファイルの選択 dialog "",16,"復号化するファイル" ;ファイルの選択 if stat=0 :return loadname=refstr exist loadname :size=strsize ;ファイルサイズの確認 if size=-1 :dialog "ファイル読み込みエラー",1,"エラー" :return //----保存先ファイルの選択 dialog "",17,"復号化するファイル" ;ファイルの選択 if stat=0 :return savename=refstr //----画面の変更 zmod=1 ;実行モードを変更 objprm ID_ango,"一時停止" ;暗号ボタンを一時停止ボタンに変更 objprm ID_hkgo,"完全停止" ;暗号ボタンを停止ボタンに変更 objenable ID_key,0 ;キーの変更を無効化 //----暗号化 maxsize=32000 ;一回に保存するデーターの最大サイズ sdim data,maxsize //----ファイル復号化処理 repeat size/maxsize+1 bload loadname,data,maxsize,cnt*maxsize ;一部のみ読み込み lop=limit(size-maxsize*cnt,0,maxsize) ;ループ数 repeat lop poke data,cnt,peek(data,cnt)-key ;復号化 loop if cnt{ bsave savename,data,lop,cnt*maxsize }else{ ;始めは新規作成 bsave savename,data,lop } await 1 ;一定時間待つ redraw 0 color 210,210,210 :boxf 0,100,140,120 a=100.0/(size/maxsize+1)*cnt color :font "",12 :pos 3,103 :mes "復号化実行中:"+strf("%.1f",a)+"%終了" redraw 1 if zmod=2{ redraw 0 color 210,210,210 :boxf 0,100,140,120 a=100.0/(size/maxsize+1)*cnt color :font "",12 :pos 3,103 :mes "復号化一時停止中:"+strf("%.1f",a)+"%終了" redraw 1 do :await 100 :until zmod=1 | zmod=3 ;一時停止が解除されたら実効再開。もしくは完全停止が押された場合 } loop color 210,210,210 :boxf 0,100,140,120 color :font "",12 :pos 3,103 :mes "待機中" objprm ID_ango,"暗号化" ;ボタンを戻す objprm ID_hkgo,"復号化" ;ボタンを戻す objenable ID_key,1 ;キーの変更を有効化 if zmod=1 :dialog "処理が完了しました。",,"完了" if zmod=3 :dialog "ユーザーにより処理が停止されました。\n作成したファイルを削除しますか?",3,"完了" :if stat=6{delete savename} zmod=0 ;実行モードの変更 return ;終了

長文失礼しました。



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