UNPKG

msful

Version:

Web API server for micro service.

496 lines (466 loc) 14.6 kB
// 軽量暗号化・符号化. // if(!window["global"]) { window["global"] = window; } (function(_g) { "use strict"; // undefined定義. var _u = undefined ; // CustomBase64. var CBase64 = (function() { var o = {}; var EQ = '='; var ENC_CD = "0123456789+abcdefghijklmnopqrstuvwxyz/ABCDEFGHIJKLMNOPQRSTUVWXYZ"; var DEC_CD = (function() { var src = ENC_CD; var ret = {}; var len = src.length; for(var i = 0; i < len; i ++) { ret[src[i]] = i; } return ret; })(); o.encode = function(bin) { var i, j, k; var allLen = allLen = bin.length ; var etc = (allLen % 3)|0; var len = (allLen / 3)|0; var ary = new Array((len * 4) + ((etc != 0) ? 4 : 0)); for (i = 0, j = 0, k = 0; i < len; i++, j += 3, k += 4) { ary[k] = ENC_CD[((bin[j] & 0x000000fc) >> 2)]; ary[k + 1] = ENC_CD[(((bin[j] & 0x00000003) << 4) | ((bin[j+1] & 0x000000f0) >> 4))]; ary[k + 2] = ENC_CD[(((bin[j+1] & 0x0000000f) << 2) | ((bin[j+2] & 0x000000c0) >> 6))]; ary[k + 3] = ENC_CD[(bin[j+2] & 0x0000003f)]; } switch (etc) { case 1: j = len * 3; k = len * 4; ary[k] = ENC_CD[((bin[j] & 0x000000fc) >> 2)]; ary[k + 1] = ENC_CD[((bin[j] & 0x00000003) << 4)]; ary[k + 2] = EQ; ary[k + 3] = EQ; break; case 2: j = len * 3; k = len * 4; ary[k] = ENC_CD[((bin[j] & 0x000000fc) >> 2)]; ary[k + 1] = ENC_CD[(((bin[j] & 0x00000003) << 4) | ((bin[j+1] & 0x000000f0) >> 4))]; ary[k + 2] = ENC_CD[(((bin[j+1] & 0x0000000f) << 2))]; ary[k + 3] = EQ; break; } return ary.join(''); } o.decode = function(base64) { var i, j, k; var allLen = base64.length ; var etc = 0 ; for (i = allLen - 1; i >= 0; i--) { if (base64.charAt(i) == EQ) { etc++; } else { break; } } var len = (allLen / 4)|0; var ret = new Uint8Array((len * 3) - etc); len -= 1; for (i = 0, j = 0, k = 0; i < len; i++, j += 4, k += 3) { ret[k] = (((DEC_CD[base64[j]] & 0x0000003f) << 2) | ((DEC_CD[base64[j+1]] & 0x00000030) >> 4)); ret[k + 1] = (((DEC_CD[base64[j+1]] & 0x0000000f) << 4) | ((DEC_CD[base64[j+2]] & 0x0000003c) >> 2)); ret[k + 2] = (((DEC_CD[base64[j+2]] & 0x00000003) << 6) | (DEC_CD[base64[j+3]] & 0x0000003f)); } switch (etc) { case 0: j = len * 4; k = len * 3; ret[k] = (((DEC_CD[base64[j]] & 0x0000003f) << 2) | ((DEC_CD[base64[j+1]] & 0x00000030) >> 4)); ret[k + 1] = (((DEC_CD[base64[j+1]] & 0x0000000f) << 4) | ((DEC_CD[base64[j+2]] & 0x0000003c) >> 2)); ret[k + 2] = (((DEC_CD[base64[j+2]] & 0x00000003) << 6) | (DEC_CD[base64[j+3]] & 0x0000003f)); break; case 1: j = len * 4; k = len * 3; ret[k] = (((DEC_CD[base64[j]] & 0x0000003f) << 2) | ((DEC_CD[base64[j+1]] & 0x00000030) >> 4)); ret[k + 1] = (((DEC_CD[base64[j+1]] & 0x0000000f) << 4) | ((DEC_CD[base64[j+2]] & 0x0000003c) >> 2)); break; case 2: j = len * 4; k = len * 3; ret[k] = (((DEC_CD[base64[j]] & 0x0000003f) << 2) | ((DEC_CD[base64[j+1]] & 0x00000030) >> 4)); break; } return ret; } return o; })(); // 指定文字の数を取得. var _targetCharCount = function(off,src,value) { var ret = 0; var p; while ((p = src.indexOf(value,off)) != -1) { ret ++; off = p + value.length; } return ret; } // 数値チェック. // num : チェック対象の情報を設定します. // 戻り値 : [true]の場合、文字列情報です. var _isNumeric = (function() { var _IS_NUMERIC_REG = /[^0-9.0-9]/g; return function(num){ var n = "" + num; if (num == null || num == _u) { return false; } else if(typeof(num) == "number") { return true; } else if(n.indexOf("-") == 0) { n = n.substring(1); } return !(n.length == 0 || n.match(_IS_NUMERIC_REG)) && !(_targetCharCount(0,n,".")>1); } })(); // xor128演算乱数装置. var _Xor128 = function(seet) { var r = {v:{a:123456789,b:362436069,c:521288629,d:88675123}}; // シートセット. r.setSeet = function(s) { if (_isNumeric(s)) { var n = this.v; s = s|0; n.a=s=1812433253*(s^(s>>30))+1; n.b=s=1812433253*(s^(s>>30))+2; n.c=s=1812433253*(s^(s>>30))+3; n.d=s=1812433253*(s^(s>>30))+4; } } // 乱数取得. r.next = function() { var n = this.v; var t=n.a; var r=t; t = ( t << 11 ); t = ( t ^ r ); r = t; r = ( r >> 8 ); t = ( t ^ r ); r = n.b; n.a = r; r = n.c; n.b = r; r = n.d; n.c = r; t = ( t ^ r ); r = ( r >> 19 ); r = ( r ^ t ); n.d = r; return r; } r.nextInt = function() { return this.next(); } r.setSeet(seet) ; return r; } // 基本セット. var fcipher = {}; var _head = null; var rand = _Xor128(new Date().getTime()); fcipher.CBase64 = CBase64; // ヘッダデータをセット. fcipher.head = function(h) { _head = h; } // 指定文字列を保証するキーを生成. fcipher.key = function(word, src) { if(src == _u || src == null) { src = "-l_l-u_f-s_m-"; } var srcBin = code16(src, 1) ; var wordBin = code16(word, 1) ; var ret = srcBin.concat(wordBin) ; for( var i = 0 ; i < 16 ; i ++ ) { ret[ i ] = _convert( ret, i, wordBin[ i ] ) ; } for( var i = 15,j = 0 ; i >= 0 ; i --,j ++ ) { ret[ i+16 ] = _convert( ret, i+16, srcBin[ j ] ) ; } return ret ; } // エンコード. fcipher.enc = function(value, pKey, head) { return fcipher.benc(strToArray( ""+value ), pKey, head) ; } // バイナリエンコード. fcipher.benc = function(bin, pKey, head) { head = head == null || head == _u ? ((_head == null) ? "" : _head) : head; // 第一引数がバイナリ. var pubKey = _randKey() ; var key32 = _convertKey(pKey, pubKey) ; var key256 = _key256(key32) ; key32 = null ; var stepNo = _getStepNo(pKey, bin) & 0x0000007f ; var nowStep = _convert256To(key256, pubKey, stepNo) ; _ed(true, bin, key256, nowStep) ; var eb = new Uint8Array(34+bin.length) ; eb[ 0 ] = rand.nextInt() & 0x000000ff; eb[ 1 ] = (~(stepNo^eb[ 0 ])) ; arraycopy(pubKey, 0, eb, 2, 32) ; arraycopy(bin, 0, eb, 34, bin.length) ; return head + CBase64.encode(eb); } // デコード. fcipher.dec = function(value, pKey, head) { return aryToString(fcipher.bdec(value, pKey, head)) ; } // バイナリデコード. fcipher.bdec = function(value, pKey, head) { head = head == null || head == _u ? ((_head == null) ? "" : _head) : head; var bin = CBase64.decode(value.substring(""+head.length)); if( bin.length <= 34 ) { throw new Error("decode:Invalid binary length.") ; } var stepNo = ((~(bin[ 1 ]^bin[0]))&0x0000007f) ; var pubKey = new Uint8Array(32) ; arraycopy(bin, 2, pubKey, 0, 32) ; var bodyLen = bin.length - 34 ; var body = new Uint8Array(bodyLen) ; arraycopy(bin, 34, body, 0, bodyLen) ; bin = null ; var key32 = _convertKey(pKey, pubKey) ; var key256 = _key256(key32) ; key32 = null ; var nowStep = _convert256To(key256, pubKey, stepNo) ; _ed(false, body, key256, nowStep) ; var destStepNo = _getStepNo(pKey, body) & 0x0000007f; if( destStepNo != stepNo ) { throw new Error("decode:Decryption process failed."); } return body; } // ランダムキー生成. var _randKey = function() { var bin = new Uint8Array(32) ; for( var i = 0 ; i < 32 ; i ++ ) { bin[ i ] = ( rand.next() & 0x000000ff ) ; } return bin ; } // コード16データを作成. // s 処理対象情報. // mode // 1 : string // それ以外: 配列. var code16 = function(s, mode) { var ret = mode == 1 ? [177, 75, 163, 143, 73, 49, 207, 40, 87, 41, 169, 91, 184, 67, 254, 89] : [87, 41, 169, 91, 184, 67, 254, 89, 177, 75, 163, 143, 73, 49, 207, 40] ; var n; var len = s.length; mode = mode|0; for(var i = 0; i < len; i ++) { n = (mode==1 ? s.charCodeAt(i)|0 : s[i]|0) & 0x00ffffff; if((i&0x00000001) == 0) { for(var j = 0; j < 16; j+= 2) { ret[j] = ret[j] ^ (n-(i+j)); } for(var j = 1; j < 16; j+= 1) { ret[j] = ret[j] ^ ~(n-(i+j)); } } else { for(var j = 1; j < 16; j+= 1) { ret[j] = ret[j] ^ (n-(i+j)); } for(var j = 0; j < 16; j+= 2) { ret[j] = ret[j] ^ ~(n-(i+j)); } } } for(var i = 0; i < 16; i++) { ret[i] = ret[i] & 0x000000ff; } return ret; } /// 変換処理. var _convert = function(key, no, pause) { switch ((no & 0x00000001)) { case 0: return (((pause ^ key[no])) & 0x000000ff) ; case 1: return (~(pause ^ key[no]) & 0x000000ff) ; } return 0 ; } var _convertKey = function(pKey, key) { var low = code16(pKey,0); var hight = code16(key,0); var ret = new Uint8Array(32); for (var i = 0,j = 0,k = 15; i < 16; i++, j += 2, k--) { ret[j] = _convert(low, i, key[j]); ret[j + 1] = _convert(hight, i, low[k]); } return ret; } var _key256 = function(key32) { var ret = new Uint8Array( 256 ) ; var b = new Uint8Array( 4 ) ; var o ; var n = 0 ; var s,e ; for( var i = 0,j = 0 ; i < 31 ; i += 2,j += 16 ) { s = ( key32[i] & 0x000000ff ) ; e = ( key32[i+1] & 0x000000ff ) ; if( ( n & 0x00000001 ) != 0 ) { n += s ^ (~ e ) ; } else { n -= (~s) ^ e ; } b[0] = (n & 0x000000ff) ; b[1] = (((n & 0x0000ff00)>>8)&0x000000ff) ; b[2] = (((n & 0x00ff0000)>>16)&0x000000ff) ; b[3] = (((n & 0xff000000)>>24)&0x000000ff) ; o = code16(b,0) ; arraycopy( o,0,ret,j,16 ) ; } return ret ; } var _getStepNo = function(pubKey, binary) { var i, j; var bin; var ret = 0; var len = binary.length ; var addCd = (pubKey[(binary[len>>1] & 0x0000001f)] & 0x00000003) + 1; for (i = 0, j = 0; i < len; i += addCd, j += addCd) { bin = ((~binary[i]) & 0x000000ff); ret = ((bin & 0x00000001) + ((bin & 0x00000002) >> 1) + ((bin & 0x00000004) >> 2) + ((bin & 0x00000008) >> 3) + ((bin & 0x00000010) >> 4) + ((bin & 0x00000020) >> 5) + ((bin & 0x00000040) >> 6) + ((bin & 0x00000080) >> 7)) + (j & 0x000000ff) + ret; } if ((ret & 0x00000001) == 0) { for (i = 0; i <32; i++) { bin = (((pubKey[i] & 0x00000001) == 0) ? ((~pubKey[i]) & 0x000000ff) : (pubKey[i] & 0x000000ff)); ret += ((bin & 0x00000001) + ((bin & 0x00000002) >> 1) + ((bin & 0x00000004) >> 2) + ((bin & 0x00000008) >> 3) + ((bin & 0x00000010) >> 4) + ((bin & 0x00000020) >> 5) + ((bin & 0x00000040) >> 6) + ((bin & 0x00000080) >> 7)); } } else { for (i = 0; i < 32; i++) { bin = (((pubKey[i] & 0x00000001) == 0) ? ((~pubKey[i]) & 0x000000ff) : (pubKey[i] & 0x000000ff)); ret -= ((bin & 0x00000001) + ((bin & 0x00000002) >> 1) + ((bin & 0x00000004) >> 2) + ((bin & 0x00000008) >> 3) + ((bin & 0x00000010) >> 4) + ((bin & 0x00000020) >> 5) + ((bin & 0x00000040) >> 6) + ((bin & 0x00000080) >> 7)); } } return ((~ret) & 0x000000ff); } var _flip = function(pause, step) { switch (step & 0x00000007) { case 1: return ((((pause & 0x00000003) << 6) & 0x000000c0) | (((pause & 0x000000fc) >> 2) & 0x0000003f)) & 0x000000ff ; case 2: return ((((pause & 0x0000003f) << 2) & 0x000000fc) | (((pause & 0x000000c0) >> 6) & 0x00000003)) & 0x000000ff ; case 3: return ((((pause & 0x00000001) << 7) & 0x00000080) | (((pause & 0x000000fe) >> 1) & 0x0000007f)) & 0x000000ff ; case 4: return ((((pause & 0x0000000f) << 4) & 0x000000f0) | (((pause & 0x000000f0) >> 4) & 0x0000000f)) & 0x000000ff ; case 5: return ((((pause & 0x0000007f) << 1) & 0x000000fe) | (((pause & 0x00000080) >> 7) & 0x00000001)) & 0x000000ff ; case 6: return ((((pause & 0x00000007) << 5) & 0x000000e0) | (((pause & 0x000000f8) >> 3) & 0x0000001f)) & 0x000000ff ; case 7: return ((((pause & 0x0000001f) << 3) & 0x000000f8) | (((pause & 0x000000e0) >> 5) & 0x00000007)) & 0x000000ff ; } return pause & 0x000000ff ; } var _nflip = function(pause, step) { switch (step & 0x00000007) { case 1: return ((((pause & 0x0000003f) << 2) & 0x000000fc) | (((pause & 0x000000c0) >> 6) & 0x00000003)) & 0x000000ff ; case 2: return ((((pause & 0x00000003) << 6) & 0x000000c0) | (((pause & 0x000000fc) >> 2) & 0x0000003f)) & 0x000000ff ; case 3: return ((((pause & 0x0000007f) << 1) & 0x000000fe) | (((pause & 0x00000080) >> 7) & 0x00000001)) & 0x000000ff ; case 4: return ((((pause & 0x0000000f) << 4) & 0x000000f0) | (((pause & 0x000000f0) >> 4) & 0x0000000f)) & 0x000000ff ; case 5: return ((((pause & 0x00000001) << 7) & 0x00000080) | (((pause & 0x000000fe) >> 1) & 0x0000007f)) & 0x000000ff ; case 6: return ((((pause & 0x0000001f) << 3) & 0x000000f8) | (((pause & 0x000000e0) >> 5) & 0x00000007)) & 0x000000ff ; case 7: return ((((pause & 0x00000007) << 5) & 0x000000e0) | (((pause & 0x000000f8) >> 3) & 0x0000001f)) & 0x000000ff ; } return pause & 0x000000ff ; } var _convert256To = function(key256, pKey, step) { var ns = step ; for (var i = 0, j = 0; i < 256; i++, j = ((j + 1) & 0x0000001f)) { ns = (ns ^ (~(key256[i]))) ; if( (ns & 0x00000001 ) == 0 ) { ns = ~ns ; } key256[i] = _convert(pKey, j, key256[i]); key256[i] = _flip(key256[i], ns); } return ns; } var _ed = function(mode, binary, key256, step) { var len = binary.length ; var ns = step ; if( mode ) { for (var i = 0, j = 0; i < len; i++, j = ((j + 1) & 0x000000ff)) { ns = (ns ^ (~( key256[j]))) ; if( (ns & 0x00000001 ) != 0 ) { ns = ~ns ; } binary[i] = _convert(key256, j, binary[i]); binary[i] = _flip(binary[ i ], ns) ; } } else { for (var i = 0, j = 0; i < len; i++, j = ((j + 1) & 0x000000ff)) { ns = (ns ^ (~( key256[j]))) ; if( (ns & 0x00000001 ) != 0 ) { ns = ~ns ; } binary[i] = _nflip(binary[ i ], ns) ; binary[i] = _convert(key256, j, binary[i]); } } } var strToArray = function(s) { var len = s.length ; var ret = new Uint8Array( len ) ; for( var i = 0 ; i < len ; i ++ ) { ret[ i ] = s.charCodeAt( i )|0 ; } return ret ; } var aryToString = function(s) { var len = s.length ; var ret = ""; for( var i = 0 ; i < len ; i ++ ) { ret += String.fromCharCode( s[ i ] ) ; } return ret; } var arraycopy = function(s, sp, d, dp, len) { len = len|0; sp = sp|0; dp = dp|0; for( var i = 0 ; i < len ; i ++ ) { d[(dp+i)] = s[(sp+i)] ; } } _g.fcipher = fcipher; })(global);