暗号化モジュール

 以前つくって,後になってバグがでてしまっていた暗号化モジュールなんですが,やっと作り直すことができました。ほとんどスクリプトを書き換えたのでかなり大変でしたが,うまく動作してくれているようです。

詳細

ライセンスご自由にお使いください。(NYSL
対応Hot Soup Processor ver.3.0 以上
種別HSPモジュール
/* Copyright (C) 2007-2009 By As(http://hp.vector.co.jp/authors/VA034028/) 文字処理機能付き暗号化モジュール ascrypt  //文字列の符号化を行う ascrypt_enc 暗号化を行う文字列の入った変数, キーの入った文字列型変数, 文字処理を行うアスキーコードが入った配列変数*1 //文字列の復号化を行う ascrypt_enc 暗号化を行う文字列の入った変数, キーの入った文字列型変数, 文字処理を行うアスキーコードが入った配列変数*1 *1 配列変数の0番目の配列は0x00で予約されているため,使用することは出来ません。1番目以降を使用してください また1番目以降においても,0x00~0x80までは使用できません //SAMPLE a = "test" key = "key" word = 0x00, 0x0a, 0x0d //改行させないようにする ascrypt_enc a, key, word */#define global ascrypt_enc(%1, %2, %3, %4=0xff) ascrypt 0, %1, %2, %3, %4#define global ascrypt_dec(%1, %2, %3) ascrypt 1, %1, %2, %3#module module_ascrypt//キー生成#deffunc ascrypt_keygen array _key, var _randomize, var _keystr, local s1, local s2, local s3, local s4, local s5
s1 = _keystr //キーの文字列が代入されるs2 = strlen(s1) //キーの文字数が代入される_randomize = 1randomize s2 //乱数の初期化repeatif rnd(2):s5=1:else:s5=-1 //ランダムに入れ替えるs3 = strf("%d", cnt)if instr(s3, 0, "3")!-1{//繰り返し回数に3が付く場合実行_key(cnt)=-rnd(33)*s5^rnd(s2)if _key(cnt) == 0 : _key(cnt) = 1continue}if cnt\5=0{//5の倍数の場合実行_key(cnt)=-rnd(55)*s5^rnd(s2)if _key(cnt) == 0 : _key(cnt) = 1continue}
_key(cnt)=peek(s1, s4)*s5^rnd(s2) //キー配列if _key(cnt) == 0 : _key(cnt) = 1_randomize+=rnd(_key(cnt)*_key(cnt))+1 //乱数初期化用数値s4++ //キーの位置のカウントif s4 = s2+1 : break //キーの最後まで行ったらループを抜けるloopreturn _randomize//単純な暗号化を行う(関数)#deffunc func_ascrypt_ecrypt int _type, var _var, int _randomize, int _rect, int _shift
randomize _randomize
repeat strlen(_var)switch _typecase 0poke _var, cnt, peek(_var, cnt) +rnd(_rect) + _shift
swbreakcase 1poke _var, cnt, peek(_var, cnt) -rnd(_rect) - _shift
swbreak
swend
loopreturn//単純な暗号化を行う(命令)#defcfunc ascrypt_ecrypt int _type, str _str, int _randomize, int _rect, int _shift, local s1
s1 = _str
randomize _randomize
repeat strlen(s1)switch _typecase 0poke s1, cnt, peek(s1, cnt) +rnd(_rect) + _shift
swbreakcase 1poke s1, cnt, peek(s1, cnt) -rnd(_rect) - _shift
swbreak
swend
loopreturn s1//処理文字の修正#deffunc ascrypt_worddisp var _var, array _word, int _wordlen, int _rect, int _shift, int _size_rect, int _size_shift, local s1, local s2, local s3, local s4, local s5, local s6, local s7, local s8, local s9, local s10
s1 = strlen(_var) //符号化されたデータの全体サイズs2 = int("$"+ascrypt_ecrypt(1, strmid(_var, s1-8, 8), s1, _size_rect, _size_shift)) //符号化する文字列のサイズif (s2 >=s1-_wordlen*8)|(s2 <=0) : return 0 //エラー回避s3 = strmid(_var, s2, s1-s2-8) //抽出した文字位置情報if s3 == "" : return 0 //エラー回避func_ascrypt_ecrypt 1, s3, s2, _rect, _shift //文字位置情報の復号s4 = strlen(s3) //抽出した文字位置情報のサイズrepeat _wordlen
s6 = cnt
s7 = int("$"+strmid(s3, s5,8))
repeat limit(s7, 0, s7)
s5 += 8poke _var, int("$"+strmid(s3, s5, 8)), _word(s6)
loop
s5 += 8loop
memset _var, 0x00, s1-s2, s2 //データ末端の位置情報を削除するreturn s2//符号化&暗号化を行う//ascrypt フラグ(0=符号化 | 1=復号化), 符号化もしくは復号化する文字列型変数, 鍵として使用する文字列, 文字処理を行うアスキーコードが入った配列変数#define size_cirect 26 //文字位置情報を符号化するための乱数範囲(size_cirect+size_shiftで26以上になるとエラーになります)#define size_shift 0 //文字位置情報を符号化するためのシフト範囲#define addcharinfo(%1, %2) s3+=%1 : s3+=strf("%08x", %2)#deffunc ascrypt int _type, var _var, var _key, array _word, int _afterword, local s1, local s2, local s3, local s4, local s5, local s6, local s7, local s8, local s9, local s10, local s11, local s12, local s13, local s14, local s15, local s16, local s17, local s18, local s19, local s20, local s21if (_var == "")|(_key == "") : _var = "" : return 0if _word(0) != 0x00 : dialog "処理する文字の配列変数の0番目に0x00以外の文字を指定することは出来ません",1,"ascryptエラー" : returns1 = length(_word)//文字位置情報で該当の文字にならないようにするs2 = 255repeat s1if _word(cnt) > s3 : s3 = _word(cnt)if _word(cnt) < s2 : s2 = _word(cnt)
loop
s4 = limit (s3-s2 + 1, 1, s3-s2 + 1)
s5 = limit (255 - s3 - s4, 1, 255 - s3 - s4)if _type == 0 {//置き換える文字列if (_afterword == 0x00)|(_afterword>255){
s6 = 0xff} else {
s6 = _afterword
}
}
sdim s7, 8 : sdim s8, 8 : sdim s9, 8 : sdim s10, 8, s1 : dim s11, s1
ascrypt_keygen s12, s13, _key //符号化に使われるキーを生成する//符号化データ 仕様//<符号化されたデータ><0x0D文字があった位置 int型ffffffff>...<0x0D文字の数 ffffffff><0x0D文字があった位置 int型ffffffff>...<NULL文字の数 ffffffff><int型の符号化されたデータのサイズ ffffffff><EOF>s14 = length(s12) //キー配列の数switch _typecase 0//符号化する場合s9 = strlen(_var) //符号化する文字列のサイズswbreakcase 1//復号化する場合ascrypt_worddisp _var, _word, s1, s5, s4, size_cirect, size_shiftif stat == 0 {//エラー処理_var = ""return 0}
s9 = stat //符号化する文字列のサイズswbreak
swend
randomize s13 //乱数の初期化repeat limit(s9, 0, s9) //符号化する文字列のサイズの分だけループif rnd(2) : s15 = 1 : else : s15 = -1 //ランダムに入れ替えるswitch _typecase 0//符号化poke s16, 0, peek(_var, cnt) + (rnd(s12(s17))+rnd(s13))*s15 //s16に一時的に符号化した文字を書き込みs18 = peek(s16, 0)//文字の処理を行うs19 = 0s20 = cnt
repeat s1if s18 == _word(cnt) {
poke _var, s20, s6 //書き換えるs10(cnt) += strf("%08x", s20)
s11(cnt)++
s21 += 8s19 = 1break}
loopif s19 == 0 : poke _var, cnt, s16 //符号化データの書き込みswbreakcase 1//復号化poke _var, cnt, peek(_var, cnt) - (rnd(s12(s17))+rnd(s13))*s15 //直接符号化データを復号化swbreak
swend
s17++ //キーコードのカウントif s17>=s14 : s17 = 0 //キーコードのループloopif _type == 0{//符号化する場合sdim s14//ascrypt_worddisp_addinfo s14, s1 //位置情報の追加repeat s1
s14 += strf("%08x", s11(cnt))
s14 += s10(cnt)
s21 += 8loop
s12=s9 + 8 + s21 //文字情報も含む符号化データ全体のサイズmemexpand _var, s12 //メモリの再確保//符号化データの代入_var+=ascrypt_ecrypt(0, s14, s9, s5, s4) + ascrypt_ecrypt(0, strf("%08x", s9), s12, size_cirect, size_shift)
}return s12
#global#define SAMPLE 0/////サンプル1///////////////////////////////////////////////////////////#if SAMPLE == 1sdim a,4080sdim key,1024sdim b,4080key="test"a="test"word=0x00, 0x0A, 0x0Dinput key,ginfo_winx,21mesbox a, ginfo_winx, 200, 3button gosub "暗号化",*go
button gosub "復号化",*go2
mesbox b, ginfo_winx, 200, 3stop
*go
b=a
ascrypt_enc b, key, word
objprm 4,breturn*go2
a=b
ascrypt_dec a, key, word
objprm 1,areturn#endif/////サンプル2///////////////////////////////////////////////////////////#if SAMPLE == 2sdim a
sdim key
sdim b
a="test"key="test"word = 0x00, 0x0a, 0x0dascrypt_enc a, key, word
sdim key2, 256sdim key, 256b=a
input key2,ginfo_winx,21mesbox a, ginfo_winx, 200, 4//button gosub "暗号化",*gobutton gosub "復号化",*go2
mesbox b, ginfo_winx, 200, 4gsel 0,1stop
*go
b=a
ascrypt_enc b, key2, word
objprm 3,breturn*go2
b=a
ascrypt_dec b, key2, word
objprm 3,breturn#endif///////サンプル3//////////////////////////////////////////////////////////////#if SAMPLE == 3font msgothic,14,16 : pos 5,5objmode 2 : objsize ginfo_winx-10,200a={" ascryptをお試しいただき有難う御座います。この暗号化モジュールには文字処理機能が付いており,ヌル文字(0x00)や改行コード(0x0a,0x0d)などの文字列操作でなにかとバグの原因となってしまう文字をバグが発生しないほかの文字と置き換えることが出来るようになっています。
 例えば,ヌル文字と改行文字を暗号化されたデータに入れたくない場合は下のようにします。
\ta = "test"\tkey = "我輩は猫である。"\tword = 0x00, 0x0a, 0x0d\tascrypt_enc a, key, word
 aが暗号化される元のデータが入った文字列型変数,keyは復号化で必要になる鍵が入った文字列方変数,wordが文字処理を行う文字が入った配列変数です。この文字処理配列変数に含まれている文字コードは暗号化データには含まれることがありません。また,配列変数の0番目の配列は0x00で予約されているため,使用することは出来ません。ユーザーは,1番目から文字コードを指定する必要があります。
 また,同スクリプトには3つのサンプルが含まれています。「#define SAMPLE *」にてサンプルを切り替えることができます。"}key = "我輩は猫である。"#if 1//全ての文字を処理するrepeat 256word(cnt) = cnt
loop#else//ヌル文字と改行文字とタブ文字を処理word = 0x00, 0x0d, 0x0a, '\n'#endifascrypt_enc a, key, word, '0xff'
mes "符号化:"mesbox a,,,3b=a
ascrypt_dec b, key, word
mes "復号化:"mesbox b,,,3#endif#undef SAMPLE

3 thoughts on “暗号化モジュール

  1. どうもです!
    マルチバイトの後続バイトなどの文字を含めてファイルを保存する場合,HSPでは読み込み時にバグが発生してしまうようです。(文字が他のコードのものに置き換わってしまう)

    なので,その文字だけを暗号化せずに別な場所に避けて置きます。要するに,めんどくさいゆえの仕様です^^;

    ずいぶん前のコードなのでバグがあるかもしれません–;

  2. 使わせていただきます!
    ところで、この"文字処理を行うアスキーコードが入った配列変数"とはいったいどのような意味でしょう。
    そのアスキーだけ暗号化を行わないってことですかね。

  3. 暗号化する文字列が11文字だと、暗号化に失敗するようです。

コメントは停止中です。