diff --git a/js/publics/sm4.js b/js/publics/sm4.js index 6dd6127..0ac7358 100644 --- a/js/publics/sm4.js +++ b/js/publics/sm4.js @@ -1 +1,678 @@ -function b(c,d){const e=a();return b=function(f,g){f=f-0x142;let h=e[f];return h;},b(c,d);}(function(c,d){const P=b,e=c();while(!![]){try{const f=-parseInt(P(0x14a))/0x1*(parseInt(P(0x1d6))/0x2)+-parseInt(P(0x1f1))/0x3*(parseInt(P(0x18e))/0x4)+parseInt(P(0x1f2))/0x5*(-parseInt(P(0x182))/0x6)+-parseInt(P(0x1ab))/0x7*(-parseInt(P(0x1a8))/0x8)+parseInt(P(0x1b2))/0x9+-parseInt(P(0x163))/0xa*(-parseInt(P(0x150))/0xb)+parseInt(P(0x187))/0xc;if(f===d)break;else e['push'](e['shift']());}catch(g){e['push'](e['shift']());}}}(a,0x3cc6c),function(c){const Q=b,d={'xkYXm':Q(0x1a0),'KcyiA':function(f,g){return f!==g;},'fLzTE':Q(0x20b),'fjuZi':function(f,g){return f===g;},'HCjGC':'function','PDelW':function(f,g,h){return f(g,h);},'gCaki':function(f,g){return f!==g;},'UBMty':function(f){return f();}};if(typeof exports===d[Q(0x154)]&&d[Q(0x1cc)](typeof module,d[Q(0x207)]))module[Q(0x177)]=c();else{let f;if(d[Q(0x19b)](typeof f,d['HCjGC'])&&f[Q(0x14e)])d[Q(0x1ce)](f,[],c);else{let g;d[Q(0x1cc)](typeof window,d[Q(0x207)])?g=window:d['gCaki'](typeof global,d[Q(0x207)])?g=global:d['KcyiA'](typeof self,d[Q(0x207)])?g=self:g=this,g['base64js']=d[Q(0x1c9)](c);}}}(function(){const R=b,c={'UTbYM':function(d,e){return d==e;},'Axmgo':R(0x155),'MGKoB':function(d,e){return d&&e;},'SHXQF':function(d,e,f){return d(e,f);},'kShin':function(d,e){return d+e;},'UfxTR':R(0x1e4),'DqNIh':function(d,e){return d+e;},'ubsoh':function(d,e){return d&e;},'fkKIt':function(d,e){return d>>e;},'YqFTj':function(d,e){return d&e;},'vSSLb':function(d,e){return d&e;},'avixP':function(d,e){return d%e;},'GyjJc':function(d,e){return d-e;},'jawuS':function(d,e){return de;},'RRKPr':function(d,e){return d+e;},'xrpnk':function(d,e){return d===e;},'mPfZp':function(d,e){return d&e;},'NeGCr':function(d,e){return d<>e;},'YygFe':function(d,e){return d&e;},'ZjLMU':function(d,e){return d>e;},'uiHmb':R(0x178),'vMILW':function(d,e){return d/e;},'oQGqJ':function(d,e){return d(e);},'kNmDe':function(d,e){return d|e;},'WSjSJ':function(d,e){return d|e;},'yxdeN':function(d,e){return d&e;},'OHiUl':function(d,e){return d>>e;},'raQcQ':function(d,e){return d+e;},'uiGrD':function(d,e){return d&e;},'wkyid':function(d,e){return d>0x4),L[N++]=m[aa(0x1f6)](J,0xff)):m[aa(0x1e6)](K,0x1)&&(J=m['hTMVX'](q[G[aa(0x1e7)](H)]<<0xa,m[aa(0x188)](q[G[aa(0x1e7)](m[aa(0x158)](H,0x1))],0x4))|q[G[aa(0x1e7)](m['dojzF'](H,0x2))]>>0x2,L[N++]=m[aa(0x1f6)](m['hgcyj'](J,0x8),0xff),L[N++]=m[aa(0x17b)](J,0xff)),L;}function D(G){const ab=a7;return c[ab(0x179)](c[ab(0x179)](c[ab(0x1b5)](p[c['ubsoh'](c['fkKIt'](G,0x12),0x3f)],p[c[ab(0x200)](G>>0xc,0x3f)]),p[c['fkKIt'](G,0x6)&0x3f]),p[c[ab(0x1be)](G,0x3f)]);}function E(G,H,I){const ac=a7;let J;const K=[];for(let L=H;m[ac(0x143)](L,I);L+=0x3){J=m[ac(0x158)](m['fSgLt'](m[ac(0x14c)](G[L],0x10),m[ac(0x1b4)](G[m['aInVK'](L,0x1)],0x8)),G[L+0x2]),K[ac(0x1bd)](m[ac(0x1fb)](D,J));}return K[ac(0x20e)]('');}function F(G){const ad=a7;let H;const I=G[ad(0x172)],J=c[ad(0x1ac)](I,0x3);let K='';const L=[],M=0x3fff;let N=0x0,O=c[ad(0x1fe)](I,J);for(;c[ad(0x1d7)](N,O);N+=M){L['push'](c[ad(0x194)](E,G,N,c[ad(0x1ae)](c[ad(0x1c5)](N,M),O)?O:c[ad(0x179)](N,M)));}return c[ad(0x165)](J,0x1)?(H=G[c['GyjJc'](I,0x1)],K+=p[c[ad(0x180)](H,0x2)],K+=p[c[ad(0x1c3)](c['NeGCr'](H,0x4),0x3f)],K+='=='):J===0x2&&(H=c[ad(0x1c5)](c['NeGCr'](G[I-0x2],0x8),G[c['GyjJc'](I,0x1)]),K+=p[H>>0xa],K+=p[c[ad(0x1c3)](c[ad(0x168)](H,0x4),0x3f)],K+=p[c[ad(0x17c)](H<<0x2,0x3f)],K+='='),L['push'](K),L[ad(0x20e)]('');}},{}]},{},[])('/');}));function a(){const aG=['toString','match','xkYXm','function','kNmDe','sm4CalciRK','aInVK','nLXGm','gvbap','4|1|0|5|2|6|7|3','yqGap','sm4_crypt_ecb','tEdkI','fVSLv','kExiB','sm4_setkey_enc','XxOEQ','70QPFFSx','kGlmp','xrpnk','sm4_setkey_dec','ndQxQ','ATOvC','byteLength','hXplg','GLNME','TmLWp','concat','vMILW','SHL','tspNR','UsuyE','length','UTbYM','isPadding','EVMrs','LaCaS','exports','Invalid\x20string.\x20Length\x20must\x20be\x20a\x20multiple\x20of\x204','DqNIh','1234567812345678','Bfcuz','YygFe','WOiqM','AoSqY','fbgub','fkKIt','zmXND','90vFAaoa','zjast','kYpWR','sm4Sbox','kBipN','7082568oclUyr','JGztp','dokLI','ceiNP','PKYyH','jVLTF','key\x20error!','1132kUNYvo','PLwfh','Kbiiy','reverse','fTAiZ','zXkMl','JMkhE','WjQXY','kNBGV','KEABO','SM4_ENCRYPT','string','sm4_setkey','fjuZi','Rkgsm','error','stringToByte','WVdNP','object','lXoDJ','input\x20is\x20null!','MyRYf','QbNfZ','KTXUZ','CKBPH','AHhUa','16104ePQAHh','QTPIx','ZySGP','217dMXbqR','avixP','IPSLQ','vTika','code','3|2|4|0|1','SUYJd','324918YztURR','tXIsw','jbyAw','kShin','slice','OHiUl','fromCharCode','wkyid','fromByteArray','uiGrD','OKWut','push','vSSLb','trim','SM4_DECRYPT','FErKH','xmlsX','mPfZp','decryptCustom_ECB','RRKPr','decryptCustom_CBC','xIAfg','ROTL','UBMty','Axmgo','call','KcyiA','encryptDefault_CBC','PDelW','JyHny','padding','nRhaJ','ROvaD','HAgDh','mode','BtStC','129166ptPktE','jawuS','cvLSl','LVQhQ','toByteArray','sm4Lt','QLaFM','split','0|1|8|3|7|4|6|2|5','RiCfd','Ywliy','dXPBF','WSjSJ','GET_ULONG_BE','MODULE_NOT_FOUND','decryptDefault_CBC','ioMMc','charCodeAt','GbWjH','EvJFZ','encryptCustom_ECB','XPgLT','ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/','juEMK','WUnIM','replace','hgcyj','2292WzNMnn','162845EMIwKk','RFzqQ','XPEdv','byteToString','Oghml','sm4_one_round','AKpUb','IoNMm','ZjLMU','Meual','4|2|3|0|1','CoQbJ','GyjJc','encryptDefault_ECB','YqFTj','PzQpT','sm4_crypt_cbc','ctx\x20is\x20null!','aiCck','sm4F','beZPX','fLzTE','PUT_ULONG_BE','uLBug','aSMrM','undefined','dEWTq','OGtle','join','rJozL','oQGqJ','XFwAy','aMkVp','Ygyiy','snHYW','secretKey','uleRR','5|6|7|4|2|0|3|1','nFFdA','3JVbrUJ','2key\x20error!','zotYr','OFowS','amd','RlBDP','720841jkRkDF','WbLQm'];a=function(){return aG;};return a();}function SM4_Context(){const ae=b;this[ae(0x1d4)]=0x1,this[ae(0x174)]=!![],this['sk']=new Array(0x20);}function SM4(){const af=b,c={'uhbau':function(g,h){return g|h;},'LVQhQ':function(g,h){return g|h;},'rJozL':function(g,h){return g|h;},'fTAiZ':function(g,h){return g<>h;},'zmXND':function(g,h){return g-h;},'PKYyH':function(g,h){return g>h;},'DJwtm':function(g,h){return g>>h;},'CKBPH':function(g,h){return g&h;},'cvLSl':function(g,h){return g>h;},'OKWut':function(g,h){return g>h;},'XFwAy':function(g,h){return g-h;},'RiCfd':function(g,h){return g>>h;},'WVdNP':function(g,h){return g^h;},'OGtle':function(g,h){return g^h;},'beZPX':function(g,h){return g^h;},'uLBug':function(g,h){return g^h;},'Kbiiy':function(g,h){return g==h;},'IPSLQ':function(g,h){return g(h);},'QbNfZ':af(0x203),'gvbap':function(g,h){return g==h;},'xIAfg':af(0x18d),'mnAcJ':af(0x1fc),'SUYJd':function(g,h){return g==h;},'ZySGP':function(g,h){return g!==h;},'Ywliy':function(g,h){return g(h);},'juEMK':function(g,h){return g==h;},'KTXUZ':function(g,h){return g^h;},'kBipN':function(g,h){return g^h;},'Rkgsm':function(g,h){return gh;},'UsuyE':function(g,h){return g+h;},'hXplg':af(0x1de),'uleRR':function(g,h){return g*h;},'Gnybi':function(g,h){return g===h;},'kExiB':function(g,h){return g>0x10);continue;case'2':h[j]=p>0x80?c['zmXND'](p,0x100):p;continue;case'3':h[c[ah(0x17e)](j,0x3)]=c[ah(0x18b)](q,0x80)?q-0x100:q;continue;case'4':var p=0xff&c['DJwtm'](g,0x18);continue;case'5':var q=c[ah(0x1a6)](0xff,g);continue;case'6':h[c['AoSqY'](j,0x1)]=c[ah(0x1d8)](o,0x80)?c[ah(0x181)](o,0x100):o;continue;case'7':h[c[ah(0x17e)](j,0x2)]=c['OKWut'](m,0x80)?c['XFwAy'](m,0x100):m;continue;}break;}},this[af(0x16f)]=function(g,h){const ai=af;return c[ai(0x1a6)](g,0xffffffff)<0x0;k-=0x10){const p=c['WddKu'][at(0x1dd)]('|');let q=0x0;while(!![]){switch(p[q++]){case'0':l=l[at(0x16d)](n);continue;case'1':j++;continue;case'2':var m=h[at(0x1b6)](c[at(0x149)](j,0x10),c['nFFdA'](0x10,c['IoNMm'](j,0x1)));continue;case'3':var n=new Array(0x10);continue;case'4':this[at(0x1f7)](g['sk'],m,n);continue;}break;}}let o=l;g['isPadding']&&c[at(0x1fd)](g[at(0x1d4)],this[at(0x1c0)])&&(o=this[at(0x1d0)](o,this[at(0x1c0)]));for(j=0x0;je;},'ndQxQ':function(d,e){return d>e;},'JyHny':function(d,e){return d!=e;},'xmlsX':function(d,e){return d!=e;},'scryw':function(d,e){return d>=e;},'OoEzO':function(d,e){return d<=e;},'rwhas':function(d,e){return d>>e;},'QLaFM':function(d,e){return d|e;},'XPEdv':function(d,e){return d>>e;},'yqGap':function(d,e){return d|e;},'WOiqM':function(d,e){return d&e;},'WxaPo':function(d,e){return d>>e;},'tspNR':function(d,e){return d|e;},'kNBGV':function(d,e){return d&e;},'tEdkI':function(d,e){return d>=e;},'XxOEQ':function(d,e){return d|e;},'KEABO':function(d,e){return d|e;},'zjast':function(d,e){return d|e;},'lXoDJ':function(d,e){return d&e;},'nRhaJ':function(d,e){return d>=e;},'GbWjH':function(d,e){return d&e;},'MyRYf':function(d,e){return d>>e;},'TmLWp':function(d,e){return d===e;},'nLXGm':av(0x199),'kYpWR':function(d,e){return d-e;},'WjQXY':function(d,e){return d 0) { + throw new Error("Invalid string. Length must be a multiple of 4") + } + return r[e - 2] === "=" ? 2 : r[e - 1] === "=" ? 1 : 0 + } + + function c(r) { + return r.length * 3 / 4 - d(r) + } + + function v(r) { + let e, t, n, i, a; + const u = r.length; + i = d(r); + a = new f(u * 3 / 4 - i); + t = i > 0 ? u - 4 : u; + let c = 0; + for (e = 0; e < t; e += 4) { + n = o[r.charCodeAt(e)] << 18 | o[r.charCodeAt(e + 1)] << 12 | o[r.charCodeAt(e + 2)] << 6 | o[r.charCodeAt(e + 3)]; + a[c++] = n >> 16 & 255; + a[c++] = n >> 8 & 255; + a[c++] = n & 255 + } + if (i === 2) { + n = o[r.charCodeAt(e)] << 2 | o[r.charCodeAt(e + 1)] >> 4; + a[c++] = n & 255 + } else { + if (i === 1) { + n = o[r.charCodeAt(e)] << 10 | o[r.charCodeAt(e + 1)] << 4 | o[r.charCodeAt(e + 2)] >> 2; + a[c++] = n >> 8 & 255; + a[c++] = n & 255 + } + } + return a + } + + function l(r) { + return n[r >> 18 & 63] + n[r >> 12 & 63] + n[r >> 6 & 63] + n[r & 63] + } + + function h(r, e, t) { + let n; + const o = []; + for (let f = e; f < t; f += 3) { + n = (r[f] << 16) + (r[f + 1] << 8) + r[f + 2]; + o.push(l(n)) + } + return o.join("") + } + + function s(r) { + let e; + const t = r.length; + const o = t % 3; + let f = ""; + const i = []; + const a = 16383; + let u = 0, d = t - o; + for (; u < d; u += a) { + i.push(h(r, u, u + a > d ? d : u + a)) + } + if (o === 1) { + e = r[t - 1]; + f += n[e >> 2]; + f += n[e << 4 & 63]; + f += "==" + } else { + if (o === 2) { + e = (r[t - 2] << 8) + r[t - 1]; + f += n[e >> 10]; + f += n[e >> 4 & 63]; + f += n[e << 2 & 63]; + f += "=" + } + } + i.push(f); + return i.join("") + } + }, {}] + }, {}, [])("/") +}); + +function SM4_Context() { + this.mode = 1; + this.isPadding = true; + this.sk = new Array(32); +} + +function SM4() { + this.SM4_ENCRYPT = 1; + this.SM4_DECRYPT = 0; + + const SboxTable = [0xd6, 0x90, 0xe9, 0xfe, 0xcc, 0xe1, 0x3d, 0xb7, 0x16, 0xb6, 0x14, 0xc2, 0x28, 0xfb, 0x2c, 0x05, + 0x2b, 0x67, 0x9a, 0x76, 0x2a, 0xbe, 0x04, 0xc3, 0xaa, 0x44, 0x13, 0x26, 0x49, 0x86, 0x06, 0x99, + 0x9c, 0x42, 0x50, 0xf4, 0x91, 0xef, 0x98, 0x7a, 0x33, 0x54, 0x0b, 0x43, 0xed, 0xcf, 0xac, 0x62, + 0xe4, 0xb3, 0x1c, 0xa9, 0xc9, 0x08, 0xe8, 0x95, 0x80, 0xdf, 0x94, 0xfa, 0x75, 0x8f, 0x3f, 0xa6, + 0x47, 0x07, 0xa7, 0xfc, 0xf3, 0x73, 0x17, 0xba, 0x83, 0x59, 0x3c, 0x19, 0xe6, 0x85, 0x4f, 0xa8, + 0x68, 0x6b, 0x81, 0xb2, 0x71, 0x64, 0xda, 0x8b, 0xf8, 0xeb, 0x0f, 0x4b, 0x70, 0x56, 0x9d, 0x35, + 0x1e, 0x24, 0x0e, 0x5e, 0x63, 0x58, 0xd1, 0xa2, 0x25, 0x22, 0x7c, 0x3b, 0x01, 0x21, 0x78, 0x87, + 0xd4, 0x00, 0x46, 0x57, 0x9f, 0xd3, 0x27, 0x52, 0x4c, 0x36, 0x02, 0xe7, 0xa0, 0xc4, 0xc8, 0x9e, + 0xea, 0xbf, 0x8a, 0xd2, 0x40, 0xc7, 0x38, 0xb5, 0xa3, 0xf7, 0xf2, 0xce, 0xf9, 0x61, 0x15, 0xa1, + 0xe0, 0xae, 0x5d, 0xa4, 0x9b, 0x34, 0x1a, 0x55, 0xad, 0x93, 0x32, 0x30, 0xf5, 0x8c, 0xb1, 0xe3, + 0x1d, 0xf6, 0xe2, 0x2e, 0x82, 0x66, 0xca, 0x60, 0xc0, 0x29, 0x23, 0xab, 0x0d, 0x53, 0x4e, 0x6f, + 0xd5, 0xdb, 0x37, 0x45, 0xde, 0xfd, 0x8e, 0x2f, 0x03, 0xff, 0x6a, 0x72, 0x6d, 0x6c, 0x5b, 0x51, + 0x8d, 0x1b, 0xaf, 0x92, 0xbb, 0xdd, 0xbc, 0x7f, 0x11, 0xd9, 0x5c, 0x41, 0x1f, 0x10, 0x5a, 0xd8, + 0x0a, 0xc1, 0x31, 0x88, 0xa5, 0xcd, 0x7b, 0xbd, 0x2d, 0x74, 0xd0, 0x12, 0xb8, 0xe5, 0xb4, 0xb0, + 0x89, 0x69, 0x97, 0x4a, 0x0c, 0x96, 0x77, 0x7e, 0x65, 0xb9, 0xf1, 0x09, 0xc5, 0x6e, 0xc6, 0x84, + 0x18, 0xf0, 0x7d, 0xec, 0x3a, 0xdc, 0x4d, 0x20, 0x79, 0xee, 0x5f, 0x3e, 0xd7, 0xcb, 0x39, 0x48]; + + const FK = [0xa3b1bac6, 0x56aa3350, 0x677d9197, 0xb27022dc]; + + const CK = [0x00070e15, 0x1c232a31, 0x383f464d, 0x545b6269, + 0x70777e85, 0x8c939aa1, 0xa8afb6bd, 0xc4cbd2d9, + 0xe0e7eef5, 0xfc030a11, 0x181f262d, 0x343b4249, + 0x50575e65, 0x6c737a81, 0x888f969d, 0xa4abb2b9, + 0xc0c7ced5, 0xdce3eaf1, 0xf8ff060d, 0x141b2229, + 0x30373e45, 0x4c535a61, 0x686f767d, 0x848b9299, + 0xa0a7aeb5, 0xbcc3cad1, 0xd8dfe6ed, 0xf4fb0209, + 0x10171e25, 0x2c333a41, 0x484f565d, 0x646b7279]; + + this.GET_ULONG_BE = function (b, i) { + return (b[i] & 0xff) << 24 | ((b[i + 1] & 0xff) << 16) | ((b[i + 2] & 0xff) << 8) | (b[i + 3] & 0xff) & 0xffffffff; + } + + this.PUT_ULONG_BE = function (n, b, i) { + var t1 = (0xFF & (n >> 24)); + var t2 = (0xFF & (n >> 16)); + var t3 = (0xFF & (n >> 8)); + var t4 = (0xFF & (n)); + b[i] = t1 > 128 ? t1 - 256 : t1; + b[i + 1] = t2 > 128 ? t2 - 256 : t2; + b[i + 2] = t3 > 128 ? t3 - 256 : t3; + b[i + 3] = t4 > 128 ? t4 - 256 : t4; + } + + this.SHL = function (x, n) { + return (x & 0xFFFFFFFF) << n; + } + + this.ROTL = function (x, n) { + // const s = this.SHL(x, n); + // const ss = x >> (32 - n); + return this.SHL(x, n) | x >> (32 - n); + } + + + this.sm4Lt = function (ka) { + let bb; + let c; + const a = new Array(4); + const b = new Array(4); + this.PUT_ULONG_BE(ka, a, 0); + b[0] = this.sm4Sbox(a[0]); + b[1] = this.sm4Sbox(a[1]); + b[2] = this.sm4Sbox(a[2]); + b[3] = this.sm4Sbox(a[3]); + bb = this.GET_ULONG_BE(b, 0); + c = bb ^ this.ROTL(bb, 2) ^ this.ROTL(bb, 10) ^ this.ROTL(bb, 18) ^ this.ROTL(bb, 24); + return c; + } + + this.sm4F = function (x0, x1, x2, x3, rk) { + return x0 ^ this.sm4Lt(x1 ^ x2 ^ x3 ^ rk); + } + + this.sm4CalciRK = function (ka) { + let bb; + let rk; + const a = new Array(4); + const b = new Array(4); + this.PUT_ULONG_BE(ka, a, 0); + b[0] = this.sm4Sbox(a[0]); + b[1] = this.sm4Sbox(a[1]); + b[2] = this.sm4Sbox(a[2]); + b[3] = this.sm4Sbox(a[3]); + bb = this.GET_ULONG_BE(b, 0); + rk = bb ^ this.ROTL(bb, 13) ^ this.ROTL(bb, 23); + return rk; + } + + + this.sm4Sbox = function (inch) { + const i = inch & 0xFF; + const retVal = SboxTable[i]; + return retVal > 128 ? retVal - 256 : retVal; + } + + this.sm4_setkey_enc = function (ctx, key) { + if (ctx == null) { + alert("ctx is null!"); + return false; + } + if (key == null || key.length !== 16) { + alert("key error!"); + return false; + } + ctx.mode = this.SM4_ENCRYPT; + this.sm4_setkey(ctx.sk, key); + + }; + + //生成解密密钥 + this.sm4_setkey_dec = function (ctx, key) { + if (ctx == null) { + Error("ctx is null!"); + } + + if (key == null || key.length !== 16) { + Error("2key error!"); + } + + // var i = 0; + ctx.mode = 0; + this.sm4_setkey(ctx.sk, key); + ctx.sk = ctx.sk.reverse(); + } + + this.sm4_setkey = function (SK, key) { + const MK = new Array(4); + const k = new Array(36); + // var i = 0; + MK[0] = this.GET_ULONG_BE(key, 0); + MK[1] = this.GET_ULONG_BE(key, 4); + MK[2] = this.GET_ULONG_BE(key, 8); + MK[3] = this.GET_ULONG_BE(key, 12); + k[0] = MK[0] ^ FK[0]; + k[1] = MK[1] ^ FK[1]; + k[2] = MK[2] ^ FK[2]; + k[3] = MK[3] ^ FK[3]; + for (let i = 0; i < 32; i++) { + k[(i + 4)] = (k[i] ^ this.sm4CalciRK(k[(i + 1)] ^ k[(i + 2)] ^ k[(i + 3)] ^ CK[i])); + SK[i] = k[(i + 4)]; + } + + } + this.padding = function (input, mode) { + let p; + if (input == null) { + return null; + } + let ret = null; + if (mode === this.SM4_ENCRYPT) { + p = parseInt(16 - input.length % 16); + ret = input.slice(0); + for (let i = 0; i < p; i++) { + ret[input.length + i] = p; + } + } else { + p = input[input.length - 1]; + ret = input.slice(0, input.length - p); + } + return ret; + } + this.sm4_one_round = function (sk, input, output) { + let i = 0; + const ulbuf = new Array(36); + ulbuf[0] = this.GET_ULONG_BE(input, 0); + ulbuf[1] = this.GET_ULONG_BE(input, 4); + ulbuf[2] = this.GET_ULONG_BE(input, 8); + ulbuf[3] = this.GET_ULONG_BE(input, 12); + while (i < 32) { + ulbuf[(i + 4)] = this.sm4F(ulbuf[i], ulbuf[(i + 1)], ulbuf[(i + 2)], ulbuf[(i + 3)], sk[i]); + i++; + } + this.PUT_ULONG_BE(ulbuf[35], output, 0); + this.PUT_ULONG_BE(ulbuf[34], output, 4); + this.PUT_ULONG_BE(ulbuf[33], output, 8); + this.PUT_ULONG_BE(ulbuf[32], output, 12); + + } + + + this.sm4_crypt_ecb = function (ctx, input) { + if (input == null) { + alert("input is null!"); + } + if ((ctx.isPadding) && (ctx.mode === this.SM4_ENCRYPT)) { + input = this.padding(input, this.SM4_ENCRYPT); + } + + let i = 0; + let length = input.length; + let bous = []; + for (; length > 0; length -= 16) { + var out = new Array(16); + var ins = input.slice(i * 16, (16 * (i + 1))); + this.sm4_one_round(ctx.sk, ins, out) + bous = bous.concat(out); + i++; + } + + let output = bous; + if (ctx.isPadding && ctx.mode === this.SM4_DECRYPT) { + output = this.padding(output, this.SM4_DECRYPT); + } + for (i = 0; i < output.length; i++) { + if (output[i] < 0) { + output[i] = output[i] + 256; + } + } + return output; + } + + this.sm4_crypt_cbc = function (ctx, iv, input) { + let out; + let ins; + let out1; + let k; + if (iv == null || iv.length !== 16) { + alert("iv error!"); + } + + if (input == null) { + alert("input is null!"); + } + + if (ctx.isPadding && ctx.mode === this.SM4_ENCRYPT) { + input = this.padding(input, this.SM4_ENCRYPT); + } + + let i = 0; + let length = input.length; + let bous = []; + if (ctx.mode === this.SM4_ENCRYPT) { + k = 0; + for (; length > 0; length -= 16) { + out = new Array(16); + out1 = new Array(16); + ins = input.slice(k * 16, (16 * (k + 1))); + + for (i = 0; i < 16; i++) { + out[i] = (ins[i] ^ iv[i]); + } + this.sm4_one_round(ctx.sk, out, out1); + iv = out1.slice(0, 16); + bous = bous.concat(out1); + k++; + } + } else { + let temp = []; + k = 0; + for (; length > 0; length -= 16) { + out = new Array(16); + out1 = new Array(16); + ins = input.slice(k * 16, (16 * (k + 1))); + temp = ins.slice(0, 16); + this.sm4_one_round(ctx.sk, ins, out); + for (i = 0; i < 16; i++) { + out1[i] = (out[i] ^ iv[i]); + } + iv = temp.slice(0, 16); + bous = bous.concat(out1); + k++; + } + } + + let output = bous; + if (ctx.isPadding && ctx.mode === this.SM4_DECRYPT) { + output = this.padding(output, this.SM4_DECRYPT); + } + + for (i = 0; i < output.length; i++) { + if (output[i] < 0) { + output[i] = output[i] + 256; + } + } + return output; + } +} + + +const SM4Util = function () { + // 和后端secretKey一致才能正确解密,可自定义传入,如果不传,则使用下面的默认secretKey + this.secretKey ="zhgd@bonus123456"; + // 当时用CBC模式的时候,除了secretKey,还需要 iv,可自定义传入,如果不传,则使用下面的默认iv + this.iv ="1234567812345678"; + this.hexString = false; + // ECB模式加密,默认secretKey + this.encryptDefault_ECB = function (plainText) { + try { + const sm4 = new SM4(); + const ctx = new SM4_Context(); + ctx.isPadding = true; + ctx.mode = sm4.SM4_ENCRYPT; + const keyBytes = this.stringToByte(this.secretKey); + sm4.sm4_setkey_enc(ctx, keyBytes); + const encrypted = sm4.sm4_crypt_ecb(ctx, this.stringToByte(plainText)); + const cipherText = base64js.fromByteArray(encrypted); + if (cipherText != null && cipherText.trim().length > 0) { + cipherText.replace(/(\s*|\t|\r|\n)/g, ""); + } + return cipherText; + } catch (e) { + console.error(e); + return null; + } + } + // ECB模式加密,自定义secretKey + this.encryptCustom_ECB = function (plainText, secretKey) { + try { + const sm4 = new SM4(); + const ctx = new SM4_Context(); + ctx.isPadding = true; + ctx.mode = sm4.SM4_ENCRYPT; + const keyBytes = this.stringToByte(secretKey); + sm4.sm4_setkey_enc(ctx, keyBytes); + const encrypted = sm4.sm4_crypt_ecb(ctx, this.stringToByte(plainText)); + const cipherText = base64js.fromByteArray(encrypted); + if (cipherText != null && cipherText.trim().length > 0) { + cipherText.replace(/(\s*|\t|\r|\n)/g, ""); + } + return cipherText; + } catch (e) { + console.error(e); + return null; + } + } + //解密_ECB,默认secretKey + this.decryptDefault_ECB = function (cipherText) { + try { + let sm4 = new SM4(); + let ctx = new SM4_Context(); + ctx.isPadding = true; + ctx.mode = sm4.SM4_ENCRYPT; + let keyBytes = this.stringToByte(this.secretKey); + sm4.sm4_setkey_dec(ctx, keyBytes); + let decrypted = sm4.sm4_crypt_ecb(ctx, base64js.toByteArray(cipherText)); + return this.byteToString(decrypted); + } catch (e) { + console.error(e); + return null; + } + } + //解密_ECB,自定义secretKey + this.decryptCustom_ECB = function (cipherText, secretKey) { + try { + let sm4 = new SM4(); + let ctx = new SM4_Context(); + ctx.isPadding = true; + ctx.mode = sm4.SM4_ENCRYPT; + let keyBytes = this.stringToByte(secretKey); + sm4.sm4_setkey_dec(ctx, keyBytes); + let decrypted = sm4.sm4_crypt_ecb(ctx, base64js.toByteArray(cipherText)); + return this.byteToString(decrypted); + } catch (e) { + console.error(e); + return null; + } + } + + // CBC模式加密,默认 iv 和 secretKey + this.encryptDefault_CBC = function (plainText) { + try { + const sm4 = new SM4(); + const ctx = new SM4_Context(); + ctx.isPadding = true; + ctx.mode = sm4.SM4_ENCRYPT; + + const keyBytes = this.stringToByte(this.secretKey); + const ivBytes = this.stringToByte(this.iv); + + sm4.sm4_setkey_enc(ctx, keyBytes); + const encrypted = sm4.sm4_crypt_cbc(ctx, ivBytes, this.stringToByte(plainText)); + const cipherText = base64js.fromByteArray(encrypted); + if (cipherText != null && cipherText.trim().length > 0) { + cipherText.replace(/(\s*|\t|\r|\n)/g, ""); + } + return cipherText; + } catch (e) { + console.error(e); + return null; + } + } + // CBC模式加密,自定义 iv 和 secretKey + this.encryptCustom_CBC = function (plainText, iv, secretKey) { + try { + const sm4 = new SM4(); + const ctx = new SM4_Context(); + ctx.isPadding = true; + ctx.mode = sm4.SM4_ENCRYPT; + + const keyBytes = this.stringToByte(secretKey); + const ivBytes = this.stringToByte(iv); + + sm4.sm4_setkey_enc(ctx, keyBytes); + const encrypted = sm4.sm4_crypt_cbc(ctx, ivBytes, this.stringToByte(plainText)); + const cipherText = base64js.fromByteArray(encrypted); + if (cipherText != null && cipherText.trim().length > 0) { + cipherText.replace(/(\s*|\t|\r|\n)/g, ""); + } + return cipherText; + } catch (e) { + console.error(e); + return null; + } + } + //解密_CBC,默认 iv 和 secretKey + this.decryptDefault_CBC = function (cipherText) { + try { + let sm4 = new SM4(); + let ctx = new SM4_Context(); + ctx.isPadding = true; + ctx.mode = sm4.SM4_ENCRYPT; + let keyBytes = this.stringToByte(this.secretKey); + let ivBytes = this.stringToByte(this.iv); + sm4.sm4_setkey_dec(ctx, keyBytes); + let decrypted = sm4.sm4_crypt_cbc(ctx, ivBytes, base64js.toByteArray(cipherText)); + return this.byteToString(decrypted); + } catch (e) { + console.error(e); + return null; + } + } + //解密_CBC,自定义 iv 和 secretKey + this.decryptCustom_CBC = function (cipherText, iv, secretKey) { + try { + let sm4 = new SM4(); + let ctx = new SM4_Context(); + ctx.isPadding = true; + ctx.mode = sm4.SM4_ENCRYPT; + let keyBytes = this.stringToByte(secretKey); + let ivBytes = this.stringToByte(iv); + sm4.sm4_setkey_dec(ctx, keyBytes); + let decrypted = sm4.sm4_crypt_cbc(ctx, ivBytes, base64js.toByteArray(cipherText)); + return this.byteToString(decrypted); + } catch (e) { + console.error(e); + return null; + } + } + + this.stringToByte = function (str) { + const bytes = []; + let len, c; + len = str.length; + for (let i = 0; i < len; i++) { + c = str.charCodeAt(i); + if (c >= 0x010000 && c <= 0x10FFFF) { + bytes.push(((c >> 18) & 0x07) | 0xF0); + bytes.push(((c >> 12) & 0x3F) | 0x80); + bytes.push(((c >> 6) & 0x3F) | 0x80); + bytes.push((c & 0x3F) | 0x80); + } else if (c >= 0x000800 && c <= 0x00FFFF) { + bytes.push(((c >> 12) & 0x0F) | 0xE0); + bytes.push(((c >> 6) & 0x3F) | 0x80); + bytes.push((c & 0x3F) | 0x80); + } else if (c >= 0x000080 && c <= 0x0007FF) { + bytes.push(((c >> 6) & 0x1F) | 0xC0); + bytes.push((c & 0x3F) | 0x80); + } else { + bytes.push(c & 0xFF); + } + } + return bytes; + } + + + this.byteToString = function (arr) { + if (typeof arr === 'string') { + return arr; + } + let str = '', + _arr = arr; + for (let i = 0; i < _arr.length; i++) { + const one = _arr[i].toString(2), + v = one.match(/^1+?(?=0)/); + if (v && one.length === 8) { + const bytesLength = v[0].length; + let store = _arr[i].toString(2).slice(7 - bytesLength); + for (let st = 1; st < bytesLength; st++) { + store += _arr[st + i].toString(2).slice(2); + } + str += String.fromCharCode(parseInt(store, 2)); + i += bytesLength - 1; + } else { + str += String.fromCharCode(_arr[i]); + } + } + return str; + } +}; diff --git a/js/smutil/ecdsa-modified-1.0.js b/js/smutil/ecdsa-modified-1.0.js index bca357b..4755e83 100644 --- a/js/smutil/ecdsa-modified-1.0.js +++ b/js/smutil/ecdsa-modified-1.0.js @@ -41,7 +41,7 @@ if (typeof KJUR.crypto == "undefined" || !KJUR.crypto) KJUR.crypto = {}; * *

*/ -KJUR.crypto.ECDSA = function(params) { +KJUR.crypto.ECDSA =function(params) { var curveName = "secp256r1"; // curve name default var ecparams = null; var prvKeyHex = null; diff --git a/js/smutil/sm2.js b/js/smutil/sm2.js index 6a2b87d..ee965b2 100644 --- a/js/smutil/sm2.js +++ b/js/smutil/sm2.js @@ -8,7 +8,7 @@ function SM2Cipher(cipherMode) { if (typeof (cipherMode) != 'undefined') { this.cipherMode = cipherMode } else { - this.cipherMode = SM2CipherMode.C1C2C3//Ĭ0 + this.cipherMode = SM2CipherMode.C1C2C3//Ĭ��0 } } SM2Cipher.prototype = { @@ -83,6 +83,7 @@ SM2Cipher.prototype = { var c3 = new Array(32); this.Dofinal(c3); var hexString = bytesToHex(c1.getEncoded(false)) + bytesToHex(data) + bytesToHex(c3); + console.log(this.cipherMode ) if (this.cipherMode == SM2CipherMode.C1C3C2) { hexString = bytesToHex(c1.getEncoded(false)) + bytesToHex(c3) + bytesToHex(data) } @@ -125,7 +126,7 @@ SM2Cipher.prototype = { GetBigIntegerByteArray : function(bi) { - //BigIntger.toByteArray()תΪзŵĶƣ˷תΪ޷ŵĶƲſ̨Java˵ļӽܵЧ + //BigIntger.toByteArray()תΪ�з��ŵĶ����ƣ��˷���תΪ�޷��ŵĶ����Ʋſ������̨Java�˵ļӽ��ܵ�Ч var tmpd = []; if (bi == null) { return tmpd; @@ -155,7 +156,7 @@ window.SM2CipherMode = { function SM2CipherUtil() { var cipher = new SM2Cipher(); - //ȡԿ˽Կ + //��ȡ��Կ��˽Կ this.sm2GengenerateKeys = function() { var ec = new KJUR.crypto.ECDSA({"curve": "sm2"}); var keypair = ec.generateKeyPairHex(); @@ -164,7 +165,6 @@ function SM2CipherUtil() { this.sm2Encrypt = function(publicKey, text) { var userKey = cipher.CreatePoint(publicKey); var msgData = strToUtf8Bytes(text); - //16ַ return cipher.Encrypt(userKey, msgData); }; this.sm2Decrypt = function(privateKey, cipherText) { diff --git a/js/smutil/utils.js b/js/smutil/utils.js index eb5bf2d..1a897ae 100644 --- a/js/smutil/utils.js +++ b/js/smutil/utils.js @@ -1,4 +1,4 @@ -//ת16 +//???????????16???? function bytesToHex(arr) { var str = ""; for (var i = 0; i < arr.length; i++) { @@ -7,7 +7,7 @@ function bytesToHex(arr) { return str; }; -//16ת +//16??????????????? function hexToBytes(str) { var arr = []; var hexStrLength = str.length; @@ -17,7 +17,7 @@ function hexToBytes(str) { return arr; }; -//ַתUTF-8Ķ +//????UTF-8??????????? function strToUtf8Bytes(str) { var bytes = new Array(); var len, c; @@ -43,7 +43,7 @@ function strToUtf8Bytes(str) { return bytes; }; -//תUTF-8ַ +//???????????UTF-8????? function bytesToUtf8Str(arr) { try { var str = '', _arr = arr; @@ -63,7 +63,7 @@ function bytesToUtf8Str(arr) { } return str; } catch(e) { - alert("תUTF8UTF8Ķ"); + alert("?UTF8??????UTF8???????????"); } };