|
 |
|
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
ご意見お願いします

| |
|
2014/12/14(Sun) 19:21:57|NO.66459
コード少し見ただけですがシーザー暗号ですか。
ただのシーザーならいいんですが、勝手に64バイト以上で保存すると小さいデータを復号できなくなりますよ。
|
|
2014/12/14(Sun) 22:27:10|NO.66470
|
|
2014/12/14(Sun) 23:02:51|NO.66472
暗号化コードに0を指定しても何も変わりません(そりゃ単純加算なので当たり前ですが)
また半角英数ってなってますが先頭がアルファベットやアルファベットのみだと0扱いになって暗号化しても変わらないのですがいいのでしょか
せめてコードからハッシュを作ってそれを使いましょうよ
あとファイルサイズの2倍のメモリを確保する素晴らしい仕様なので1GB以上のファイルを暗号/復号するとクラッシュします
|
|
2014/12/14(Sun) 23:24:43|NO.66473
試しに適当な文字列を暗号化させ、復号化させたら文字列の語尾に長い中点が連なった。
|
|
2014/12/14(Sun) 23:50:22|NO.66474
>試しに適当な文字列を暗号化させ、復号化させたら文字列の語尾に長い中点が連なった。
元のファイルサイズを考慮せずに保存しているため、保存時に変数のヌル文字が保存されています。
復号化すると0xFF - {key}の文字コードが連続します。
>クラッシュします
確かに一定バイトずつ演算しないとメモリを食ってしまいますね。
そもそも足し引きだけというのが・・・
|
|
2014/12/16(Tue) 18:34:02|NO.66486
まあ、1GB以上のデータなんてそうそうありませんからね
|
|
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。様
ありがとうございます。
メモリがジ・エンドになる点については
バッファのオフセット値
とかいうのを使えばいいのでしょうか?
|
|
2014/12/19(Fri) 22:47:18|NO.66513
>ZP。 さん
コード読んだだけなのですが、これでは巨大なファイルの読み込みでメモリが不足してしまいませんか。
1バイトずつでは小さすぎるかもしれませんが1キロバイトずつなど少量で読み込んだ方が
メモリを食わないし、メモリから平文を盗まれる可能性も大幅に低くなりますよ。
|
|
2014/12/19(Fri) 23:00:57|NO.66514
>>メモリがジ・エンドになる点については・・・
メモリ不足になるということでしょうか? (間違っていたら申し訳ないです。)
そうですね。
ファイルの一部のみを読み込んで、処理して、その一部をファイルに書き込む。
これを繰り返していけば、メモリ不足にはならないと思います。
bsaveのオフセットについて(HSPヘルプより)
ファイルのオフセット値を指定すると、その値だけファイルの先頭からずらした場所からが操作の対象になります。
bsave命令でオフセットを指定すると、 ファイルの先頭から任意のサイズを過ぎた場所からセーブを行なうことが可能です。
(この場合は、それオフセットより前のファイル内容は変化しません。
また、オフセット指定時はファイルが存在しない場合エラーとなります。)
|
|
2014/12/19(Fri) 23:01:43|NO.66515
>>catsさん
すみません。投稿が重複してしまいました。
|
|
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 ;終了
長文失礼しました。

| |
|