From b8e9ea42d6f340dec29daadba4ef77ab580f620d Mon Sep 17 00:00:00 2001 From: sijiyo <56878076+sijiyo@users.noreply.github.com> Date: Sat, 2 Mar 2024 20:22:57 +0800 Subject: [PATCH] =?UTF-8?q?=E6=95=B0=E7=BE=8E=E6=BB=91=E5=9D=97/shumei=5Fs?= =?UTF-8?q?lide?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- shumei_slide/gap.py | 89 +++ shumei_slide/img/bg.png | Bin 0 -> 25711 bytes shumei_slide/img/show_image.png | Bin 0 -> 28517 bytes shumei_slide/img/slide.png | Bin 0 -> 19494 bytes shumei_slide/main.py | 64 ++ shumei_slide/shumei.js | 1219 +++++++++++++++++++++++++++++++ shumei_slide/track.py | 35 + 7 files changed, 1407 insertions(+) create mode 100644 shumei_slide/gap.py create mode 100644 shumei_slide/img/bg.png create mode 100644 shumei_slide/img/show_image.png create mode 100644 shumei_slide/img/slide.png create mode 100644 shumei_slide/main.py create mode 100644 shumei_slide/shumei.js create mode 100644 shumei_slide/track.py diff --git a/shumei_slide/gap.py b/shumei_slide/gap.py new file mode 100644 index 0000000..43b6d76 --- /dev/null +++ b/shumei_slide/gap.py @@ -0,0 +1,89 @@ +# -*- coding: utf-8 -*- + +import cv2 + + +class SlideCrack(object): + def __init__(self, gap, bg, out): + """ + init code + :param gap: 缺口图片 + :param bg: 背景图片 + :param out: 输出图片 + """ + self.gap = gap + self.bg = bg + self.out = out + + @staticmethod + def clear_white(img): + # 清除图片的空白区域,这里主要清除滑块的空白 + img = cv2.imread(img) + rows, cols, channel = img.shape + min_x = 255 + min_y = 255 + max_x = 0 + max_y = 0 + for x in range(1, rows): + for y in range(1, cols): + t = set(img[x, y]) + if len(t) >= 2: + if x <= min_x: + min_x = x + elif x >= max_x: + max_x = x + + if y <= min_y: + min_y = y + elif y >= max_y: + max_y = y + img1 = img[min_x:max_x, min_y: max_y] + return img1 + + def template_match(self, tpl, target): + th, tw = tpl.shape[:2] + result = cv2.matchTemplate(target, tpl, cv2.TM_CCOEFF_NORMED) + # 寻找矩阵(一维数组当作向量,用Mat定义) 中最小值和最大值的位置 + min_val, max_val, min_loc, max_loc = cv2.minMaxLoc(result) + tl = max_loc + br = (tl[0] + tw, tl[1] + th) + # 绘制矩形边框,将匹配区域标注出来 + # target:目标图像 + # tl:矩形定点 + # br:矩形的宽高 + # (0,0,255):矩形边框颜色 + # 1:矩形边框大小 + cv2.rectangle(target, tl, br, (0, 0, 255), 2) + cv2.imwrite(self.out, target) + return tl[0] + + @staticmethod + def image_edge_detection(img): + edges = cv2.Canny(img, 100, 200) + return edges + + def discern(self): + img1 = self.clear_white(self.gap) + img1 = cv2.cvtColor(img1, cv2.COLOR_RGB2GRAY) + slide = self.image_edge_detection(img1) + + back = cv2.imread(self.bg, 0) + back = self.image_edge_detection(back) + + slide_pic = cv2.cvtColor(slide, cv2.COLOR_GRAY2RGB) + back_pic = cv2.cvtColor(back, cv2.COLOR_GRAY2RGB) + x = self.template_match(slide_pic, back_pic) + # 输出横坐标, 即 滑块在图片上的位置 + return x + + +def get_gap(): + # 滑块图片 + image1 = "img/slide.png" + # 背景图片 + image2 = "img/bg.png" + + # 处理结果图片,用红线标注 + image3 = "img/show_image.png" + sc = SlideCrack(image1, image2, image3) + return sc.discern() diff --git a/shumei_slide/img/bg.png b/shumei_slide/img/bg.png new file mode 100644 index 0000000000000000000000000000000000000000..97a3ba32e63cab93758e4e96249d618f59c71457 GIT binary patch literal 25711 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 literal 0 HcmV?d00001 diff --git a/shumei_slide/img/show_image.png b/shumei_slide/img/show_image.png new file mode 100644 index 0000000000000000000000000000000000000000..24cd30135f740d83706936cb61aa040f91bfaf8c GIT binary patch literal 28517 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

caTQg^dIGYK_w2|Cn_+&Q zaVOdL&t;cB|4qbO=&OH6rVX#SkGEc=l5B+?J0NZaS`#M!GYolby1DO1I6>F z)WyboS_4ORH?1v<4xOq_8~IWV|JYEN7+T%OrlD2lumPrS@1Fu%oRTe9w;f zBRQ8?f<5{=W4vuow8d97#X2YE-(<0gbw{h3HY}Axyt|wJdZsz6ZSck1wk4dUyzth+ z#Kyj@fpDRB=|^uAX7=Lw&iWDMOZjj6B8!}fo8q%gth+#S9wLt`$5w96Cs4Ctx-IoVLQNnT%==y4Q{@L?~9TtfIl zcdouXvCbC=-;s}dhpXiN@IbnG#y-mFo)Zh6}}3DuQAcoOUU6$h>5 z?|scxuBVSIn1VYnzIZ};Onk9(>EP5l-_J68T?);^XGaQCb%K|1#Zmqzr!>{zr^<~> z8}E)}$>RdT)rd=>J8uez!fAM%)A`uNt(^Hvdikk6O(TFnWAnNzKq*zgoIj;J<^*Tl zDQ{!ZlB%@F04`^ay5!+#(%xdD}%gC-racDSAd6`2|7LqH-M>6<>StsRZT0Tf;W*4%MVzR#0^~>? zGO96u5N1aBylv|WyZSi32Zj68^t#gThVHNk)(g6M8wkAF`n62o0KzU|{>HkL^-D2x zY2z|1shm(3&ALgUJCpfLSsl>N|94re;rN}8@x^t8BYG%vClJ_i5%59dxcAZqlBh>= z#>fe$;Do|BJg;+o$@k|GYvM>q(*of~1*YX?gv1<}7+y&9t#^>Q! zfKomWqe82Db~Dt7-XNMpAz6)XqJd@dA1eBUu7K=B!0sj4)6#J-!6+~6QW{i|Wp{rZ z2>)27$q(OmItSnfeE*^R5UY4Cm{ZQ#uTawDZzlj$^IAc` zMXnYYqZ36nj*A)-N_))lJ$?_n@u5>a$Ang=h^m@4e?Sf#$ssS+>EMz4wHn_I*O&iX z5oa04zsJQjCJEVHKO)I3lDIgUs&ZpP;RvHmMQ-!_N~bLjpyP=8b#TY29%8;HF6IJL zc@c02RIZ3xp!oMU)-Ua@39t+N&l&D6CAi{mU`W#Bm9aW}B0j4vE3CioM4pwH(!PX? z=yyHR`kYKi#PgEybSzCf2H$B^*rD)`2ggjE^GNdn1|ImJSxb zi+xdJJiuX(Di2FHRyBR~L30-A$$@Tu@O4h-K=yPx&tuKt#=GB9{5v>0i|Gtwu!|#% z@wU0(?;Tp&_L*uKN2b79+~Sn%r4JZhAUk%4$5>|Z?xvL=4L2a4?h#7kq?H>BGvib~ z_ZZJ-5=jt~gfO7AvB7ZklsX?@Lg0i>jU&}1nJyVB5Iz!bBK*VNwrvDbNIP2f z;cy(&nPybUxuDXkOOzzhEWZ-hP&%fPuD~6R+c-~Y*Ocx4voivhKP7!f-P%ks9Sm-F zN*P_U)J|}GvjX8M7;9YUItvcMxt+0ra48BaQK36;yb5exZ~Bl`$T0H<;tG#VgrRsX&Lu0Sf9tgXH3FQzCd~99_|J3wE z{e9q)QUDoDsH^{;Y9#EA_rSAC$k0i3~4PSiZ|j(B|YG+jc5}? zljryQ$bVTC0Ra9k%X)|INO(pOE@SCaJ>jn>gq9lpq$X^6r9A}IIsuE=QCy0*Qs?c3x;qt=TK8<((2W6^lCyHsr zy265(#=Fl;=!w;OBI71fR!~E6jd%MQhFm&{_Wb^a*h1uVlTB{1iOHCx(5Yu|KioIo z@=17*!_Mw*s??fyzKe?{TLi|#USkZmCc=I2=4N!(_*V{{h-dU(n&Vp$2;awP|CC-Q?R+WV+|x@~5H@B|cOLzE2|tkc}@HU=m}BgnmKwEng}v z?rrlc$TV<>nx~!4!i%R03+@BAJol1?ROq)I!} z+J0Wubd(+kxJ5agi3`*ZDgBzpC`d%6ylXyZ(lgZH%tO>Xi znD%!rR!dE*`RNrp^#eL2VzituqBFln+pZoU8c*v-a1w3LDe7y^e*_}OilWxRp~_cw zf2&R`x~3QOjGQ^8T94)_?aiY{B`V@!^eA;YBkpfJ9ci^5Y3@du3_VX9ME4P1Kx2ke zMJ#=+M|!2+J@#keDM=akzH(Sl8-f((aYX<*jF z*kBPYW)W6BTpgg`wH*b?Xi~MrA|82WwVQd!lS)&`)G;xn`q4;sxk(EHwyoQy7);XQ zscz+r5ow8Mo)%%;5j^L3+ja_`;%sOHS;*h&BNaco2L=r~!{ewWW!YG1!H>Lcm9VcB z33(jk<+b&sCehpDV4)*jtqfI*sCLC$Gj7TjQ37XBagbAM4P@!hCIQ41lBOUP8Qtpug`0=%N8ytkrBagv<$IC}v1xydfQm z)YW9hhviD`t%Xy33su-^VScnt>0rwVwM+2R7_(|^VXY=VP}5NMtZI7GN&(E@6@$~n z&`ei|6g3U1LD5KD(9--BQ_&0(5u{)edr_1%{_?h^Vgio3uu(l2Dmcs4FH-IzwWm2d ztr(K=ulM%ioP2UZ^B3lJV6r>J6l3-G#^M{~7iGrk!K|2sBmP{0AV;?uVg8rkZnaIx zyun6AQtUv7Zq-M7FiABIlIV_`Wbf)EdI)vSZkdN086+f0&o%WVWgoRuO|6S&lrs@k zM1@=ZT@**_bCe+LmHS7D+o4>tE-`dUNTp-L7-|MdR4Q53(|Sk}1iiUiJh74a0DDD- zRzKL9-%U|b6s)foFsAbQmT@9dq%ZJ_gt|+6Dmqj`iY7A)0n^*|OU-uF9#BV`HG(5I zjRVRdfM(iG(G|w2=~73K_^l^>W{oL99F@j5-fVh*B848B*YJltG7)n#z3vtdsyFkt zO|EL{lrWIyRV|m!VuB^r#c)NF&QH6}t&h4q>hR=Czw-Ti=^y@>9Q~7rAK3Kd;uFgb z>A^$lH zU?(QPTz?W&OO(dD1dnQFvyRNFrcyGWP8fYufC8)MFrv^i%P0p2-zvPyf|7u3Y+RNW z3NPVzwIDlF(%_17F;9B~FExg~R|`kr&ICkue;eAYEi5>b#M)}Ag5EY{ad9??Gy87s z{xB)0GfKfdN<%ulv4Tgt9%!8bU8TvbbcQj~7))s;&iS-=adulT$o@nSwON-sKhx8? zSB*L&+&_%dWH;PHjDPE14~FzwW>W9Z*<0p+~yc>CjKrp{K_I<{hGyLu2~)VRI9ZcZ%)h^}nK>8UO-Au2v5RI6_4ff563fS&Ogf^U zW(ZArk{gK@Uo7Yk>tKm5(paCSCj3x%c3nbK3JQq15x*cg`?18*#{BfUu4L$mQxiX* zMhAg#L77q?dmm72u4t0#bn^TA@W2xop1hvH66NvqIu1XBK(M7Lvsh>e8X_<+FUSm? zQum<#FctIJ^URU(Krol5b(MceOSGmC#;@`YrYOeP#&OmHC3^n4-U_J=Exm2mtcK7| z7OyWH55ddPxYmaa&I#~&hmJnIu0B#WvJT&?YU-^oo8XSd?Mzx_k)-K|6&4Nw>MhRj zzq`Izg6P38HEC^{SG;O*Wvny+6X@0$%VF}<`j`oe3omkr$|=%XJ=R7!DstYo6mMH> zAPmBXVgpdVJCKak-37fAqYKXJwov)$R^hSp(!nW>YZ446%mf#Vpu~tg!EqFMMjFjw zWxTyj*2?nI9^lb}7BhweX|{gCZb=GLtw9#2W)X^H$~3OVm5EO01CB3B^OWc9gmA%l zKE1;jSp$Vz^S9}Rx-T5_-EI`TDjI8 zj@h^BHMFK?vX1Tl(Hq!#ilORoGD7VE2OJ__*4q%1kPnf2PN6JF02vs%lPEscx=3~4 z91KSTo*{%i{B9F1%V`n-gi&1;XMv_Ww)PiG+aVn2zDrGRXf1R`bU;RYmB(_KoIF-J zL8uV6>2sptZEuUTJ6BZemEKyzj@|#PFpWG2$ojR z{71{6XHb1&0@%WLZrf^31STM&v;RLBCnO=haqB(nz}&?=oo_8fjI;AZ=u^lHl>cc4 zkAR6npVa4AhJ&LETbomg12b2%k}5 z(9jPbRHoMzkf^H%=pUtVB!o(3pW>j4D+P2gmJ$VX^@}=$o3P5c6h2C$J-?$G@S@0F zf-shn4nJ*EJk7=3?D#4kW0KIzn!F*LJyr$o!)5a35;qbqktpc2Sr6!g`snyj8qG}s zJSiURhsT!!*eT{*E^W#SOGRDsmW^@bEWyO6B}}3$m&KXbMVUpNJl*=dDB)h#Qbj5- zmROFMzYP`#?6?f}JgxUOY#?`QdOb3FcW<2DJBK#GJbEW!<+1lxn_12qEEZGM|y!APKWn z7Y*<8J5z$LH3DPheM*IW^r@Lvx+r{z@QV4Fp*t}~Vz@}xTdeF7@ao>sb z_~W2yuSP_~-LL;20X8EvCQ-0&y4r#CgJF;wsq`>5k`IRYEBP&kI%9H0-e8cMC|}*P z2QOq23nJ}{q69rCYpk54unh)0z&UH@7X-r_!a)d^R)D1Xc3%_$Ku}$t6A1TmI??f& z<^w}DGRo>W$(s@gBW~iPiWktuscKy{SL|-Ox*jk07B!Dj_d7>uhI-{+HauO9V&XdM z591=jepM|a5mX7+RlNzN=02HNp>r`zpmE2qS1j82GGDi3=o&GbYQ539i~=TfDhq_s zazvXjcy;|1l|ZB71YB~JDrh$;OX1x_wx~sRBMdV-zwgQc*e+3bi|Y#Ob;A-quT*^l zw9Dg6RIO$bZcahYo8$l#-L;N2jcdkm4~HY{!jX|3@=>j6FBF2({t9~#g#co8DnksT z4nH7HqShjWX^I&rq0ONMmaL6dHHxLl z$x|pFdS!ipa#^HV34&P@pFLu;9so=i$)uYk6^!bxgyxDie^f_R?GF^Q;T&((Ol|@7a!9HZ1IaHP@8Q>IR#hrU$ zeQyO)>`~d>y(fm1leAZ$*5?ShtwTYS>o>RlZlD#x3l!i7_4A={0H`6|5POscOp*$q zyo4Vj!D6w6*u*n?urvcyh08x!MhUA>ZN z27a~rTdE)`lenH;m`75)#7OuHMoH2yRd}_y#Q1#z;Df|p$Y%(EaOvtLyfW66hr!03 zr&zUq9m*Dr;YKdJTI;OYp^(XEK75uZS0BlNSXuZgEmW~c))(nx@3f#A2n;1!s8KXk z%orMG88(q91Gq$ag%314FpDHeaf-Dl0w;MeUag*FUV@q#6G{@rBHmg!Mtqz?ZB~xv zQmM6U&&G=1!U`v$eL^N-&qZmPn2@Lf#7vhdF!VxF@hAedMTv4nESWt= zh_p0y?-k%Eyoc-oM%Js4ad`wtiZ1~t=8;OE{|T~Jl~*p*tuvciCxe7)`ZQg!6T)D} zQ<71|yj8&K0EqPPiG!)=JIn(BlIOY;Xj+@*j(8|m1l$w_f$hcDixT z(v`Xy$Sq$AhFWk%?81dylnj%~EA7oY7VvSc^hIyLjt=Vw2~$#Z4!$)*{#l8CUY5?c z;g=dK&VnVCymle%U<#;BrN7OTl?V;o;F=KT?JrpXE|Ymt#q!g|JITbq&a-SK{XM*I zaUgKw*9Y;HDH@tZoJ%XyRDYi@tL-T0Nua7I1yVKn#z+j2u_8E$GYATU5PN(o_1aIQ zsX9)UMBCMf+JEitB8Wp$##GwPhLy^un>>r+%m(69gnMc!>J|y49;ByRtH~cXqos)c z*WCrUvzNa6GQTf41EraX_{utKq>accb$)8MeJWT%FE^!(UG!}n2ylL+(>`Dci`Oh< zr1n2F9OHSRO|4(&JP1J7T+K)+kO$Ct(}Atk_%Sa4PpU{XNR~+(7)!3ZlLm#8FEmTT z3Gzw}>jh%k5m)?Kj!~$Yh`Ua7nUX-zm_f{FaCwKyYr^91pyyUY?4IIQP@Q}^rl3do zfQ;>DwoMnc9P!6ATT#8t>|M>JrhUlw*iG zGJR9j8x^2|m#Eiuy`{*M`0%?ncw&Vim@DN0vk-HXJ#$iANSvg^I9H-=d^h{x(HtxC zLoZG%w?Pynh3Q-_m}|pBSqvDER{VtsjiK>MXsrz$T%ObEgH`J9V?EW^ZrbQ?S{7y9 z56l2^l$Kf{S{PwB(|xf{)m%e3JYkYcFMin&!hjYV2v@3wpsX{t5lqMPijGDvt`jWq z#6*yBE5|%dmhPbFbn}Y0^Nkaj$mqr_7ok_CyKKJC$X-K!{!C*WCap}$A_CpMkOszz zz|$NEX}28nsj0oh*ygbM2f$Y6XlU$3Fr%~+^c*B+9e!B8!$>Rv1t@=jt%L{Z+xtVO$M z$R))>wL_`c)*pA}4IWf=Y-xn|d$(71O{!m){_r*bwO_m+9Mi9O#)5q@V?anj@L<=r z!UVO&&EB?GPdRNp;)??ZHy1`b7gKGHR36ir!OMqX?mR=@1qt!R%mXR4Zo%#Tlcg?B zF28dyrgIXs%{mwn01~{5I>&0e6y9N72&V}B=?DDr;bydtt z?_vR*2kH1=@(uHxi*YpvujaMAIym(9L8XP>nUK8;uJWpxbc$Z;h}PqE{a8MauhH<_ zhmEwB2RCcC@mVBm%$OW9|HJ%{QjnYY>~hvlqpK-A6wKqW4irlSJOHi z?=*!Ia>i&)aG^Kq^jr$3J?M)s<_>3dHNW#Y3&y|q;hF-ucmv-E9jtT~jL5n8rcf{y zPJ2!lHG1JIx^;-&B63ZubX<-?N_{vTRA0h0ojBFg`VPMczh#z9ZJbV=qg(khwL&78 ycb7OpW)?x7$JqZ$px7O;Tnv6Vy(=R8m#F{#V<6MZ|NFd%=O<5p_Q1sX>;5myT8d8q literal 0 HcmV?d00001 diff --git a/shumei_slide/img/slide.png b/shumei_slide/img/slide.png new file mode 100644 index 0000000000000000000000000000000000000000..6d5e11d4a70f791780bc94e0cf0913c00f5b4cd6 GIT binary patch literal 19494 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 literal 0 HcmV?d00001 diff --git a/shumei_slide/main.py b/shumei_slide/main.py new file mode 100644 index 0000000..7cc513f --- /dev/null +++ b/shumei_slide/main.py @@ -0,0 +1,64 @@ +import requests,re,json,base64,execjs +from urllib import request +from gap import * +from track import * +with open('shumei.js', 'r', encoding='utf-8') as f: + js = execjs.compile(f.read()) +def get_image(organization): + url = 'https://captcha1.fengkongcloud.cn/ca/v1/register' + params = { + "organization": organization, + "data": "{}", + "appId": "default", + "model": "slide", + "rversion": '1.0.4', + "lang": "zh-cn", + "channel": "DEFAULT", + "callback": get_callback(), + "sdkver": '1.1.3', + "captchaUuid": get_captchaUuid() + } + res = requests.get(url, params=params).text + match = re.search(r'({.+})', res).group(1) + data = json.loads(match) + request.urlretrieve('https://castatic.fengkongcloud.cn'+data['detail']['bg'], './img/bg.png') + request.urlretrieve('https://castatic.fengkongcloud.cn'+data['detail']['fg'], './img/slide.png') + distance = round(get_gap()/2) + rid = data['detail']['rid'] + return distance,rid +def get_main(organization): + distance,rid = get_image(organization) + track = get_track(distance) + je = js.call('DES_Encrypt', str(distance / 300), "5ea96022") + ww = js.call('DES_Encrypt', str(track[-1][-1] + random.randint(10, 100)), "17a94a08") + mu = js.call('DES_Encrypt', json.dumps(track, separators=(',', ':')), "e7e1eb0d") + params = { + "je": je, + "ww": ww, + "mu": mu, + "rid": rid, + "captchaUuid": get_captchaUuid(), + "organization": organization, + "callback": get_callback(), + "rversion": '1.0.4', + "sdkver": '1.1.3', + "nu": "C0kH/bWLjw8=", # mouseEndX=300, "390aac0d" + "dy": "Rfpr5oqb5y4=", # trueHeight=150, "a9001672" + "en": "y+ugz9NIWys=", + "tb": "3jSn4gNaAVM=", # 1,'6f5e9847' + "kq": "mtlOTdT5LOE=", + "mp": "WYfkIZp7GoA=", + "oc": "h9oFKi8cHpg=", + "xy": "YabT6nmJOC0=", # "zh-cn" + "jo": "l3aEINYnwpY=", + "protocol": "180", + "ostype": "web", + "act.os": "web_pc", + } + url = 'https://captcha1.fengkongcloud.cn/ca/v2/fverify' + res = requests.get(url, params=params).text + match = re.search(r'({.+})', res).group(1) + print(match) +if __name__ == '__main__': + organization = "RlokQwRlVjUrTUlkIqOg" + get_main(organization) \ No newline at end of file diff --git a/shumei_slide/shumei.js b/shumei_slide/shumei.js new file mode 100644 index 0000000..68e3304 --- /dev/null +++ b/shumei_slide/shumei.js @@ -0,0 +1,1219 @@ +var CryptoJS = CryptoJS || (function (Math, undefined) { + var C = {}; + var C_lib = C.lib = {}; + var Base = C_lib.Base = (function () { + function F() {}; + return { + extend: function (overrides) { + F.prototype = this; + var subtype = new F(); + if (overrides) { + subtype.mixIn(overrides); + } + if (!subtype.hasOwnProperty('init') || this.init === subtype.init) { + subtype.init = function () { + subtype.$super.init.apply(this, arguments); + }; + } + subtype.init.prototype = subtype; + subtype.$super = this; + return subtype; + }, create: function () { + var instance = this.extend(); + instance.init.apply(instance, arguments); + return instance; + }, init: function () {}, mixIn: function (properties) { + for (var propertyName in properties) { + if (properties.hasOwnProperty(propertyName)) { + this[propertyName] = properties[propertyName]; + } + } + if (properties.hasOwnProperty('toString')) { + this.toString = properties.toString; + } + }, clone: function () { + return this.init.prototype.extend(this); + } + }; + }()); + var WordArray = C_lib.WordArray = Base.extend({ + init: function (words, sigBytes) { + words = this.words = words || []; + if (sigBytes != undefined) { + this.sigBytes = sigBytes; + } else { + this.sigBytes = words.length * 4; + } + }, toString: function (encoder) { + return (encoder || Hex).stringify(this); + }, concat: function (wordArray) { + var thisWords = this.words; + var thatWords = wordArray.words; + var thisSigBytes = this.sigBytes; + var thatSigBytes = wordArray.sigBytes; + this.clamp(); + if (thisSigBytes % 4) { + for (var i = 0; i < thatSigBytes; i++) { + var thatByte = (thatWords[i >>> 2] >>> (24 - (i % 4) * 8)) & 0xff; + thisWords[(thisSigBytes + i) >>> 2] |= thatByte << (24 - ((thisSigBytes + i) % 4) * 8); + } + } else if (thatWords.length > 0xffff) { + for (var i = 0; i < thatSigBytes; i += 4) { + thisWords[(thisSigBytes + i) >>> 2] = thatWords[i >>> 2]; + } + } else { + thisWords.push.apply(thisWords, thatWords); + } + this.sigBytes += thatSigBytes; + return this; + }, clamp: function () { + var words = this.words; + var sigBytes = this.sigBytes; + words[sigBytes >>> 2] &= 0xffffffff << (32 - (sigBytes % 4) * 8); + words.length = Math.ceil(sigBytes / 4); + }, clone: function () { + var clone = Base.clone.call(this); + clone.words = this.words.slice(0); + return clone; + }, random: function (nBytes) { + var words = []; + var r = (function (m_w) { + var m_w = m_w; + var m_z = 0x3ade68b1; + var mask = 0xffffffff; + return function () { + m_z = (0x9069 * (m_z & 0xFFFF) + (m_z >> 0x10)) & mask; + m_w = (0x4650 * (m_w & 0xFFFF) + (m_w >> 0x10)) & mask; + var result = ((m_z << 0x10) + m_w) & mask; + result /= 0x100000000; + result += 0.5; + return result * (Math.random() > .5 ? 1 : -1); + } + }); + for (var i = 0, rcache; i < nBytes; i += 4) { + var _r = r((rcache || Math.random()) * 0x100000000); + rcache = _r() * 0x3ade67b7; + words.push((_r() * 0x100000000) | 0); + } + return new WordArray.init(words, nBytes); + } + }); + var C_enc = C.enc = {}; + var Hex = C_enc.Hex = { + stringify: function (wordArray) { + var words = wordArray.words; + var sigBytes = wordArray.sigBytes; + var hexChars = []; + for (var i = 0; i < sigBytes; i++) { + var bite = (words[i >>> 2] >>> (24 - (i % 4) * 8)) & 0xff; + hexChars.push((bite >>> 4).toString(16)); + hexChars.push((bite & 0x0f).toString(16)); + } + return hexChars.join(''); + }, parse: function (hexStr) { + var hexStrLength = hexStr.length; + var words = []; + for (var i = 0; i < hexStrLength; i += 2) { + words[i >>> 3] |= parseInt(hexStr.substr(i, 2), 16) << (24 - (i % 8) * 4); + } + return new WordArray.init(words, hexStrLength / 2); + } + }; + var Latin1 = C_enc.Latin1 = { + stringify: function (wordArray) { + var words = wordArray.words; + var sigBytes = wordArray.sigBytes; + var latin1Chars = []; + for (var i = 0; i < sigBytes; i++) { + var bite = (words[i >>> 2] >>> (24 - (i % 4) * 8)) & 0xff; + latin1Chars.push(String.fromCharCode(bite)); + } + return latin1Chars.join(''); + }, parse: function (latin1Str) { + var latin1StrLength = latin1Str.length; + var words = []; + for (var i = 0; i < latin1StrLength; i++) { + words[i >>> 2] |= (latin1Str.charCodeAt(i) & 0xff) << (24 - (i % 4) * 8); + } + return new WordArray.init(words, latin1StrLength); + } + }; + var Utf8 = C_enc.Utf8 = { + stringify: function (wordArray) { + try { + return decodeURIComponent(escape(Latin1.stringify(wordArray))); + } catch (e) { + throw new Error('Malformed UTF-8 data'); + } + }, parse: function (utf8Str) { + return Latin1.parse(unescape(encodeURIComponent(utf8Str))); + } + }; + var BufferedBlockAlgorithm = C_lib.BufferedBlockAlgorithm = Base.extend({ + reset: function () { + this._data = new WordArray.init(); + this._nDataBytes = 0; + }, _append: function (data) { + if (typeof data == 'string') { + data = Utf8.parse(data); + } + this._data.concat(data); + this._nDataBytes += data.sigBytes; + }, _process: function (doFlush) { + var data = this._data; + var dataWords = data.words; + var dataSigBytes = data.sigBytes; + var blockSize = this.blockSize; + var blockSizeBytes = blockSize * 4; + var nBlocksReady = dataSigBytes / blockSizeBytes; + if (doFlush) { + nBlocksReady = Math.ceil(nBlocksReady); + } else { + nBlocksReady = Math.max((nBlocksReady | 0) - this._minBufferSize, 0); + } + var nWordsReady = nBlocksReady * blockSize; + var nBytesReady = Math.min(nWordsReady * 4, dataSigBytes); + if (nWordsReady) { + for (var offset = 0; offset < nWordsReady; offset += blockSize) { + this._doProcessBlock(dataWords, offset); + } + var processedWords = dataWords.splice(0, nWordsReady); + data.sigBytes -= nBytesReady; + } + return new WordArray.init(processedWords, nBytesReady); + }, clone: function () { + var clone = Base.clone.call(this); + clone._data = this._data.clone(); + return clone; + }, _minBufferSize: 0 + }); + var Hasher = C_lib.Hasher = BufferedBlockAlgorithm.extend({ + cfg: Base.extend(), + init: function (cfg) { + this.cfg = this.cfg.extend(cfg); + this.reset(); + }, reset: function () { + BufferedBlockAlgorithm.reset.call(this); + this._doReset(); + }, update: function (messageUpdate) { + this._append(messageUpdate); + this._process(); + return this; + }, finalize: function (messageUpdate) { + if (messageUpdate) { + this._append(messageUpdate); + } + var hash = this._doFinalize(); + return hash; + }, blockSize: 512 / 32, + _createHelper: function (hasher) { + return function (message, cfg) { + return new hasher.init(cfg).finalize(message); + }; + }, _createHmacHelper: function (hasher) { + return function (message, key) { + return new C_algo.HMAC.init(hasher, key).finalize(message); + }; + } + }); + var C_algo = C.algo = {}; + return C; +}(Math)); + +(function () { + var C = CryptoJS; + var C_lib = C.lib; + var WordArray = C_lib.WordArray; + var C_enc = C.enc; + var Base64 = C_enc.Base64 = { + stringify: function (wordArray) { + var words = wordArray.words; + var sigBytes = wordArray.sigBytes; + var map = this._map; + wordArray.clamp(); + var base64Chars = []; + for (var i = 0; i < sigBytes; i += 3) { + var byte1 = (words[i >>> 2] >>> (24 - (i % 4) * 8)) & 0xff; + var byte2 = (words[(i + 1) >>> 2] >>> (24 - ((i + 1) % 4) * 8)) & 0xff; + var byte3 = (words[(i + 2) >>> 2] >>> (24 - ((i + 2) % 4) * 8)) & 0xff; + var triplet = (byte1 << 16) | (byte2 << 8) | byte3; + for (var j = 0; + (j < 4) && (i + j * 0.75 < sigBytes); j++) { + base64Chars.push(map.charAt((triplet >>> (6 * (3 - j))) & 0x3f)); + } + } + var paddingChar = map.charAt(64); + if (paddingChar) { + while (base64Chars.length % 4) { + base64Chars.push(paddingChar); + } + } + return base64Chars.join(''); + }, parse: function (base64Str) { + var base64StrLength = base64Str.length; + var map = this._map; + var reverseMap = this._reverseMap; + if (!reverseMap) { + reverseMap = this._reverseMap = []; + for (var j = 0; j < map.length; j++) { + reverseMap[map.charCodeAt(j)] = j; + } + } + var paddingChar = map.charAt(64); + if (paddingChar) { + var paddingIndex = base64Str.indexOf(paddingChar); + if (paddingIndex !== -1) { + base64StrLength = paddingIndex; + } + } + return parseLoop(base64Str, base64StrLength, reverseMap); + }, _map: 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=' + }; + function parseLoop(base64Str, base64StrLength, reverseMap) { + var words = []; + var nBytes = 0; + for (var i = 0; i < base64StrLength; i++) { + if (i % 4) { + var bits1 = reverseMap[base64Str.charCodeAt(i - 1)] << ((i % 4) * 2); + var bits2 = reverseMap[base64Str.charCodeAt(i)] >>> (6 - (i % 4) * 2); + words[nBytes >>> 2] |= (bits1 | bits2) << (24 - (nBytes % 4) * 8); + nBytes++; + } + } + return WordArray.create(words, nBytes); + } +}()); + +CryptoJS.lib.Cipher || (function (undefined) { + var C = CryptoJS; + var C_lib = C.lib; + var Base = C_lib.Base; + var WordArray = C_lib.WordArray; + var BufferedBlockAlgorithm = C_lib.BufferedBlockAlgorithm; + var C_enc = C.enc; + var Utf8 = C_enc.Utf8; + var Base64 = C_enc.Base64; + var C_algo = C.algo; + var EvpKDF = C_algo.EvpKDF; + var Cipher = C_lib.Cipher = BufferedBlockAlgorithm.extend({ + cfg: Base.extend(), + createEncryptor: function (key, cfg) { + return this.create(this._ENC_XFORM_MODE, key, cfg); + }, createDecryptor: function (key, cfg) { + return this.create(this._DEC_XFORM_MODE, key, cfg); + }, init: function (xformMode, key, cfg) { + this.cfg = this.cfg.extend(cfg); + this._xformMode = xformMode; + this._key = key; + this.reset(); + }, reset: function () { + BufferedBlockAlgorithm.reset.call(this); + this._doReset(); + }, process: function (dataUpdate) { + this._append(dataUpdate); + return this._process(); + }, finalize: function (dataUpdate) { + if (dataUpdate) { + this._append(dataUpdate); + } + var finalProcessedData = this._doFinalize(); + return finalProcessedData; + }, keySize: 128 / 32, + ivSize: 128 / 32, + _ENC_XFORM_MODE: 1, + _DEC_XFORM_MODE: 2, + _createHelper: (function () { + function selectCipherStrategy(key) { + if (typeof key == 'string') { + return PasswordBasedCipher; + } else { + return SerializableCipher; + } + } + return function (cipher) { + return { + encrypt: function (message, key, cfg) { + return selectCipherStrategy(key).encrypt(cipher, message, key, cfg); + }, decrypt: function (ciphertext, key, cfg) { + return selectCipherStrategy(key).decrypt(cipher, ciphertext, key, cfg); + } + }; + }; + }()) + }); + var StreamCipher = C_lib.StreamCipher = Cipher.extend({ + _doFinalize: function () { + var finalProcessedBlocks = this._process(!!'flush'); + return finalProcessedBlocks; + }, blockSize: 1 + }); + var C_mode = C.mode = {}; + var BlockCipherMode = C_lib.BlockCipherMode = Base.extend({ + createEncryptor: function (cipher, iv) { + return this.Encryptor.create(cipher, iv); + }, createDecryptor: function (cipher, iv) { + return this.Decryptor.create(cipher, iv); + }, init: function (cipher, iv) { + this._cipher = cipher; + this._iv = iv; + } + }); + var CBC = C_mode.CBC = (function () { + var CBC = BlockCipherMode.extend(); + CBC.Encryptor = CBC.extend({ + processBlock: function (words, offset) { + var cipher = this._cipher; + var blockSize = cipher.blockSize; + xorBlock.call(this, words, offset, blockSize); + cipher.encryptBlock(words, offset); + this._prevBlock = words.slice(offset, offset + blockSize); + } + }); + CBC.Decryptor = CBC.extend({ + processBlock: function (words, offset) { + var cipher = this._cipher; + var blockSize = cipher.blockSize; + var thisBlock = words.slice(offset, offset + blockSize); + cipher.decryptBlock(words, offset); + xorBlock.call(this, words, offset, blockSize); + this._prevBlock = thisBlock; + } + }); + + function xorBlock(words, offset, blockSize) { + var iv = this._iv; + if (iv) { + var block = iv; + this._iv = undefined; + } else { + var block = this._prevBlock; + } + for (var i = 0; i < blockSize; i++) { + words[offset + i] ^= block[i]; + } + } + return CBC; + }()); + var C_pad = C.pad = {}; + var Pkcs7 = C_pad.Pkcs7 = { + pad: function (data, blockSize) { + var blockSizeBytes = blockSize * 4; + var nPaddingBytes = blockSizeBytes - data.sigBytes % blockSizeBytes; + var paddingWord = (nPaddingBytes << 24) | (nPaddingBytes << 16) | (nPaddingBytes << 8) | nPaddingBytes; + var paddingWords = []; + for (var i = 0; i < nPaddingBytes; i += 4) { + paddingWords.push(paddingWord); + } + var padding = WordArray.create(paddingWords, nPaddingBytes); + data.concat(padding); + }, unpad: function (data) { + var nPaddingBytes = data.words[(data.sigBytes - 1) >>> 2] & 0xff; + data.sigBytes -= nPaddingBytes; + } + }; + var BlockCipher = C_lib.BlockCipher = Cipher.extend({ + cfg: Cipher.cfg.extend({ + mode: CBC, + padding: Pkcs7 + }), + reset: function () { + Cipher.reset.call(this); + var cfg = this.cfg; + var iv = cfg.iv; + var mode = cfg.mode; + if (this._xformMode == this._ENC_XFORM_MODE) { + var modeCreator = mode.createEncryptor; + } else { + var modeCreator = mode.createDecryptor; + this._minBufferSize = 1; + } if (this._mode && this._mode.__creator == modeCreator) { + this._mode.init(this, iv && iv.words); + } else { + this._mode = modeCreator.call(mode, this, iv && iv.words); + this._mode.__creator = modeCreator; + } + }, _doProcessBlock: function (words, offset) { + this._mode.processBlock(words, offset); + }, _doFinalize: function () { + var padding = this.cfg.padding; + if (this._xformMode == this._ENC_XFORM_MODE) { + padding.pad(this._data, this.blockSize); + var finalProcessedBlocks = this._process(!!'flush'); + } else { + var finalProcessedBlocks = this._process(!!'flush'); + padding.unpad(finalProcessedBlocks); + } + return finalProcessedBlocks; + }, blockSize: 128 / 32 + }); + var CipherParams = C_lib.CipherParams = Base.extend({ + init: function (cipherParams) { + this.mixIn(cipherParams); + }, toString: function (formatter) { + return (formatter || this.formatter).stringify(this); + } + }); + var C_format = C.format = {}; + var OpenSSLFormatter = C_format.OpenSSL = { + stringify: function (cipherParams) { + var ciphertext = cipherParams.ciphertext; + var salt = cipherParams.salt; + if (salt) { + var wordArray = WordArray.create([0x53616c74, 0x65645f5f]).concat(salt).concat(ciphertext); + } else { + var wordArray = ciphertext; + } + return wordArray.toString(Base64); + }, parse: function (openSSLStr) { + var ciphertext = Base64.parse(openSSLStr); + var ciphertextWords = ciphertext.words; + if (ciphertextWords[0] == 0x53616c74 && ciphertextWords[1] == 0x65645f5f) { + var salt = WordArray.create(ciphertextWords.slice(2, 4)); + ciphertextWords.splice(0, 4); + ciphertext.sigBytes -= 16; + } + return CipherParams.create({ + ciphertext: ciphertext, + salt: salt + }); + } + }; + var SerializableCipher = C_lib.SerializableCipher = Base.extend({ + cfg: Base.extend({ + format: OpenSSLFormatter + }), + encrypt: function (cipher, message, key, cfg) { + cfg = this.cfg.extend(cfg); + var encryptor = cipher.createEncryptor(key, cfg); + var ciphertext = encryptor.finalize(message); + var cipherCfg = encryptor.cfg; + return CipherParams.create({ + ciphertext: ciphertext, + key: key, + iv: cipherCfg.iv, + algorithm: cipher, + mode: cipherCfg.mode, + padding: cipherCfg.padding, + blockSize: cipher.blockSize, + formatter: cfg.format + }); + }, decrypt: function (cipher, ciphertext, key, cfg) { + cfg = this.cfg.extend(cfg); + ciphertext = this._parse(ciphertext, cfg.format); + var plaintext = cipher.createDecryptor(key, cfg).finalize(ciphertext.ciphertext); + return plaintext; + }, _parse: function (ciphertext, format) { + if (typeof ciphertext == 'string') { + return format.parse(ciphertext, this); + } else { + return ciphertext; + } + } + }); + var C_kdf = C.kdf = {}; + var OpenSSLKdf = C_kdf.OpenSSL = { + execute: function (password, keySize, ivSize, salt) { + if (!salt) { + salt = WordArray.random(64 / 8); + } + var key = EvpKDF.create({ + keySize: keySize + ivSize + }).compute(password, salt); + var iv = WordArray.create(key.words.slice(keySize), ivSize * 4); + key.sigBytes = keySize * 4; + return CipherParams.create({ + key: key, + iv: iv, + salt: salt + }); + } + }; + var PasswordBasedCipher = C_lib.PasswordBasedCipher = SerializableCipher.extend({ + cfg: SerializableCipher.cfg.extend({ + kdf: OpenSSLKdf + }), + encrypt: function (cipher, message, password, cfg) { + cfg = this.cfg.extend(cfg); + var derivedParams = cfg.kdf.execute(password, cipher.keySize, cipher.ivSize); + cfg.iv = derivedParams.iv; + var ciphertext = SerializableCipher.encrypt.call(this, cipher, message, derivedParams.key, cfg); + ciphertext.mixIn(derivedParams); + return ciphertext; + }, decrypt: function (cipher, ciphertext, password, cfg) { + cfg = this.cfg.extend(cfg); + ciphertext = this._parse(ciphertext, cfg.format); + var derivedParams = cfg.kdf.execute(password, cipher.keySize, cipher.ivSize, ciphertext.salt); + cfg.iv = derivedParams.iv; + var plaintext = SerializableCipher.decrypt.call(this, cipher, ciphertext, derivedParams.key, cfg); + return plaintext; + } + }); +}()); + +CryptoJS.mode.ECB = (function () { + var ECB = CryptoJS.lib.BlockCipherMode.extend(); + ECB.Encryptor = ECB.extend({ + processBlock: function (words, offset) { + this._cipher.encryptBlock(words, offset); + } + }); + ECB.Decryptor = ECB.extend({ + processBlock: function (words, offset) { + this._cipher.decryptBlock(words, offset); + } + }); + return ECB; +}()); + +CryptoJS.pad.ZeroPadding = { + pad: function (data, blockSize) { + var blockSizeBytes = blockSize * 4; + data.clamp(); + data.sigBytes += blockSizeBytes - ((data.sigBytes % blockSizeBytes) || blockSizeBytes); + }, unpad: function (data) { + var dataWords = data.words; + var i = data.sigBytes - 1; + while (!((dataWords[i >>> 2] >>> (24 - (i % 4) * 8)) & 0xff)) { + i--; + } + data.sigBytes = i + 1; + } +}; + +(function () { + var C = CryptoJS; + var C_lib = C.lib; + var WordArray = C_lib.WordArray; + var BlockCipher = C_lib.BlockCipher; + var C_algo = C.algo; + var PC1 = [57, 49, 41, 33, 25, 17, 9, 1, 58, 50, 42, 34, 26, 18, 10, 2, 59, 51, 43, 35, 27, 19, 11, 3, 60, 52, 44, 36, 63, 55, 47, 39, 31, 23, 15, 7, 62, 54, 46, 38, 30, 22, 14, 6, 61, 53, 45, 37, 29, 21, 13, 5, 28, 20, 12, 4]; + var PC2 = [14, 17, 11, 24, 1, 5, 3, 28, 15, 6, 21, 10, 23, 19, 12, 4, 26, 8, 16, 7, 27, 20, 13, 2, 41, 52, 31, 37, 47, 55, 30, 40, 51, 45, 33, 48, 44, 49, 39, 56, 34, 53, 46, 42, 50, 36, 29, 32]; + var BIT_SHIFTS = [1, 2, 4, 6, 8, 10, 12, 14, 15, 17, 19, 21, 23, 25, 27, 28]; + var SBOX_P = [{ + 0x0: 0x808200, + 0x10000000: 0x8000, + 0x20000000: 0x808002, + 0x30000000: 0x2, + 0x40000000: 0x200, + 0x50000000: 0x808202, + 0x60000000: 0x800202, + 0x70000000: 0x800000, + 0x80000000: 0x202, + 0x90000000: 0x800200, + 0xa0000000: 0x8200, + 0xb0000000: 0x808000, + 0xc0000000: 0x8002, + 0xd0000000: 0x800002, + 0xe0000000: 0x0, + 0xf0000000: 0x8202, + 0x8000000: 0x0, + 0x18000000: 0x808202, + 0x28000000: 0x8202, + 0x38000000: 0x8000, + 0x48000000: 0x808200, + 0x58000000: 0x200, + 0x68000000: 0x808002, + 0x78000000: 0x2, + 0x88000000: 0x800200, + 0x98000000: 0x8200, + 0xa8000000: 0x808000, + 0xb8000000: 0x800202, + 0xc8000000: 0x800002, + 0xd8000000: 0x8002, + 0xe8000000: 0x202, + 0xf8000000: 0x800000, + 0x1: 0x8000, + 0x10000001: 0x2, + 0x20000001: 0x808200, + 0x30000001: 0x800000, + 0x40000001: 0x808002, + 0x50000001: 0x8200, + 0x60000001: 0x200, + 0x70000001: 0x800202, + 0x80000001: 0x808202, + 0x90000001: 0x808000, + 0xa0000001: 0x800002, + 0xb0000001: 0x8202, + 0xc0000001: 0x202, + 0xd0000001: 0x800200, + 0xe0000001: 0x8002, + 0xf0000001: 0x0, + 0x8000001: 0x808202, + 0x18000001: 0x808000, + 0x28000001: 0x800000, + 0x38000001: 0x200, + 0x48000001: 0x8000, + 0x58000001: 0x800002, + 0x68000001: 0x2, + 0x78000001: 0x8202, + 0x88000001: 0x8002, + 0x98000001: 0x800202, + 0xa8000001: 0x202, + 0xb8000001: 0x808200, + 0xc8000001: 0x800200, + 0xd8000001: 0x0, + 0xe8000001: 0x8200, + 0xf8000001: 0x808002 + }, { + 0x0: 0x40084010, + 0x1000000: 0x4000, + 0x2000000: 0x80000, + 0x3000000: 0x40080010, + 0x4000000: 0x40000010, + 0x5000000: 0x40084000, + 0x6000000: 0x40004000, + 0x7000000: 0x10, + 0x8000000: 0x84000, + 0x9000000: 0x40004010, + 0xa000000: 0x40000000, + 0xb000000: 0x84010, + 0xc000000: 0x80010, + 0xd000000: 0x0, + 0xe000000: 0x4010, + 0xf000000: 0x40080000, + 0x800000: 0x40004000, + 0x1800000: 0x84010, + 0x2800000: 0x10, + 0x3800000: 0x40004010, + 0x4800000: 0x40084010, + 0x5800000: 0x40000000, + 0x6800000: 0x80000, + 0x7800000: 0x40080010, + 0x8800000: 0x80010, + 0x9800000: 0x0, + 0xa800000: 0x4000, + 0xb800000: 0x40080000, + 0xc800000: 0x40000010, + 0xd800000: 0x84000, + 0xe800000: 0x40084000, + 0xf800000: 0x4010, + 0x10000000: 0x0, + 0x11000000: 0x40080010, + 0x12000000: 0x40004010, + 0x13000000: 0x40084000, + 0x14000000: 0x40080000, + 0x15000000: 0x10, + 0x16000000: 0x84010, + 0x17000000: 0x4000, + 0x18000000: 0x4010, + 0x19000000: 0x80000, + 0x1a000000: 0x80010, + 0x1b000000: 0x40000010, + 0x1c000000: 0x84000, + 0x1d000000: 0x40004000, + 0x1e000000: 0x40000000, + 0x1f000000: 0x40084010, + 0x10800000: 0x84010, + 0x11800000: 0x80000, + 0x12800000: 0x40080000, + 0x13800000: 0x4000, + 0x14800000: 0x40004000, + 0x15800000: 0x40084010, + 0x16800000: 0x10, + 0x17800000: 0x40000000, + 0x18800000: 0x40084000, + 0x19800000: 0x40000010, + 0x1a800000: 0x40004010, + 0x1b800000: 0x80010, + 0x1c800000: 0x0, + 0x1d800000: 0x4010, + 0x1e800000: 0x40080010, + 0x1f800000: 0x84000 + }, { + 0x0: 0x104, + 0x100000: 0x0, + 0x200000: 0x4000100, + 0x300000: 0x10104, + 0x400000: 0x10004, + 0x500000: 0x4000004, + 0x600000: 0x4010104, + 0x700000: 0x4010000, + 0x800000: 0x4000000, + 0x900000: 0x4010100, + 0xa00000: 0x10100, + 0xb00000: 0x4010004, + 0xc00000: 0x4000104, + 0xd00000: 0x10000, + 0xe00000: 0x4, + 0xf00000: 0x100, + 0x80000: 0x4010100, + 0x180000: 0x4010004, + 0x280000: 0x0, + 0x380000: 0x4000100, + 0x480000: 0x4000004, + 0x580000: 0x10000, + 0x680000: 0x10004, + 0x780000: 0x104, + 0x880000: 0x4, + 0x980000: 0x100, + 0xa80000: 0x4010000, + 0xb80000: 0x10104, + 0xc80000: 0x10100, + 0xd80000: 0x4000104, + 0xe80000: 0x4010104, + 0xf80000: 0x4000000, + 0x1000000: 0x4010100, + 0x1100000: 0x10004, + 0x1200000: 0x10000, + 0x1300000: 0x4000100, + 0x1400000: 0x100, + 0x1500000: 0x4010104, + 0x1600000: 0x4000004, + 0x1700000: 0x0, + 0x1800000: 0x4000104, + 0x1900000: 0x4000000, + 0x1a00000: 0x4, + 0x1b00000: 0x10100, + 0x1c00000: 0x4010000, + 0x1d00000: 0x104, + 0x1e00000: 0x10104, + 0x1f00000: 0x4010004, + 0x1080000: 0x4000000, + 0x1180000: 0x104, + 0x1280000: 0x4010100, + 0x1380000: 0x0, + 0x1480000: 0x10004, + 0x1580000: 0x4000100, + 0x1680000: 0x100, + 0x1780000: 0x4010004, + 0x1880000: 0x10000, + 0x1980000: 0x4010104, + 0x1a80000: 0x10104, + 0x1b80000: 0x4000004, + 0x1c80000: 0x4000104, + 0x1d80000: 0x4010000, + 0x1e80000: 0x4, + 0x1f80000: 0x10100 + }, { + 0x0: 0x80401000, + 0x10000: 0x80001040, + 0x20000: 0x401040, + 0x30000: 0x80400000, + 0x40000: 0x0, + 0x50000: 0x401000, + 0x60000: 0x80000040, + 0x70000: 0x400040, + 0x80000: 0x80000000, + 0x90000: 0x400000, + 0xa0000: 0x40, + 0xb0000: 0x80001000, + 0xc0000: 0x80400040, + 0xd0000: 0x1040, + 0xe0000: 0x1000, + 0xf0000: 0x80401040, + 0x8000: 0x80001040, + 0x18000: 0x40, + 0x28000: 0x80400040, + 0x38000: 0x80001000, + 0x48000: 0x401000, + 0x58000: 0x80401040, + 0x68000: 0x0, + 0x78000: 0x80400000, + 0x88000: 0x1000, + 0x98000: 0x80401000, + 0xa8000: 0x400000, + 0xb8000: 0x1040, + 0xc8000: 0x80000000, + 0xd8000: 0x400040, + 0xe8000: 0x401040, + 0xf8000: 0x80000040, + 0x100000: 0x400040, + 0x110000: 0x401000, + 0x120000: 0x80000040, + 0x130000: 0x0, + 0x140000: 0x1040, + 0x150000: 0x80400040, + 0x160000: 0x80401000, + 0x170000: 0x80001040, + 0x180000: 0x80401040, + 0x190000: 0x80000000, + 0x1a0000: 0x80400000, + 0x1b0000: 0x401040, + 0x1c0000: 0x80001000, + 0x1d0000: 0x400000, + 0x1e0000: 0x40, + 0x1f0000: 0x1000, + 0x108000: 0x80400000, + 0x118000: 0x80401040, + 0x128000: 0x0, + 0x138000: 0x401000, + 0x148000: 0x400040, + 0x158000: 0x80000000, + 0x168000: 0x80001040, + 0x178000: 0x40, + 0x188000: 0x80000040, + 0x198000: 0x1000, + 0x1a8000: 0x80001000, + 0x1b8000: 0x80400040, + 0x1c8000: 0x1040, + 0x1d8000: 0x80401000, + 0x1e8000: 0x400000, + 0x1f8000: 0x401040 + }, { + 0x0: 0x80, + 0x1000: 0x1040000, + 0x2000: 0x40000, + 0x3000: 0x20000000, + 0x4000: 0x20040080, + 0x5000: 0x1000080, + 0x6000: 0x21000080, + 0x7000: 0x40080, + 0x8000: 0x1000000, + 0x9000: 0x20040000, + 0xa000: 0x20000080, + 0xb000: 0x21040080, + 0xc000: 0x21040000, + 0xd000: 0x0, + 0xe000: 0x1040080, + 0xf000: 0x21000000, + 0x800: 0x1040080, + 0x1800: 0x21000080, + 0x2800: 0x80, + 0x3800: 0x1040000, + 0x4800: 0x40000, + 0x5800: 0x20040080, + 0x6800: 0x21040000, + 0x7800: 0x20000000, + 0x8800: 0x20040000, + 0x9800: 0x0, + 0xa800: 0x21040080, + 0xb800: 0x1000080, + 0xc800: 0x20000080, + 0xd800: 0x21000000, + 0xe800: 0x1000000, + 0xf800: 0x40080, + 0x10000: 0x40000, + 0x11000: 0x80, + 0x12000: 0x20000000, + 0x13000: 0x21000080, + 0x14000: 0x1000080, + 0x15000: 0x21040000, + 0x16000: 0x20040080, + 0x17000: 0x1000000, + 0x18000: 0x21040080, + 0x19000: 0x21000000, + 0x1a000: 0x1040000, + 0x1b000: 0x20040000, + 0x1c000: 0x40080, + 0x1d000: 0x20000080, + 0x1e000: 0x0, + 0x1f000: 0x1040080, + 0x10800: 0x21000080, + 0x11800: 0x1000000, + 0x12800: 0x1040000, + 0x13800: 0x20040080, + 0x14800: 0x20000000, + 0x15800: 0x1040080, + 0x16800: 0x80, + 0x17800: 0x21040000, + 0x18800: 0x40080, + 0x19800: 0x21040080, + 0x1a800: 0x0, + 0x1b800: 0x21000000, + 0x1c800: 0x1000080, + 0x1d800: 0x40000, + 0x1e800: 0x20040000, + 0x1f800: 0x20000080 + }, { + 0x0: 0x10000008, + 0x100: 0x2000, + 0x200: 0x10200000, + 0x300: 0x10202008, + 0x400: 0x10002000, + 0x500: 0x200000, + 0x600: 0x200008, + 0x700: 0x10000000, + 0x800: 0x0, + 0x900: 0x10002008, + 0xa00: 0x202000, + 0xb00: 0x8, + 0xc00: 0x10200008, + 0xd00: 0x202008, + 0xe00: 0x2008, + 0xf00: 0x10202000, + 0x80: 0x10200000, + 0x180: 0x10202008, + 0x280: 0x8, + 0x380: 0x200000, + 0x480: 0x202008, + 0x580: 0x10000008, + 0x680: 0x10002000, + 0x780: 0x2008, + 0x880: 0x200008, + 0x980: 0x2000, + 0xa80: 0x10002008, + 0xb80: 0x10200008, + 0xc80: 0x0, + 0xd80: 0x10202000, + 0xe80: 0x202000, + 0xf80: 0x10000000, + 0x1000: 0x10002000, + 0x1100: 0x10200008, + 0x1200: 0x10202008, + 0x1300: 0x2008, + 0x1400: 0x200000, + 0x1500: 0x10000000, + 0x1600: 0x10000008, + 0x1700: 0x202000, + 0x1800: 0x202008, + 0x1900: 0x0, + 0x1a00: 0x8, + 0x1b00: 0x10200000, + 0x1c00: 0x2000, + 0x1d00: 0x10002008, + 0x1e00: 0x10202000, + 0x1f00: 0x200008, + 0x1080: 0x8, + 0x1180: 0x202000, + 0x1280: 0x200000, + 0x1380: 0x10000008, + 0x1480: 0x10002000, + 0x1580: 0x2008, + 0x1680: 0x10202008, + 0x1780: 0x10200000, + 0x1880: 0x10202000, + 0x1980: 0x10200008, + 0x1a80: 0x2000, + 0x1b80: 0x202008, + 0x1c80: 0x200008, + 0x1d80: 0x0, + 0x1e80: 0x10000000, + 0x1f80: 0x10002008 + }, { + 0x0: 0x100000, + 0x10: 0x2000401, + 0x20: 0x400, + 0x30: 0x100401, + 0x40: 0x2100401, + 0x50: 0x0, + 0x60: 0x1, + 0x70: 0x2100001, + 0x80: 0x2000400, + 0x90: 0x100001, + 0xa0: 0x2000001, + 0xb0: 0x2100400, + 0xc0: 0x2100000, + 0xd0: 0x401, + 0xe0: 0x100400, + 0xf0: 0x2000000, + 0x8: 0x2100001, + 0x18: 0x0, + 0x28: 0x2000401, + 0x38: 0x2100400, + 0x48: 0x100000, + 0x58: 0x2000001, + 0x68: 0x2000000, + 0x78: 0x401, + 0x88: 0x100401, + 0x98: 0x2000400, + 0xa8: 0x2100000, + 0xb8: 0x100001, + 0xc8: 0x400, + 0xd8: 0x2100401, + 0xe8: 0x1, + 0xf8: 0x100400, + 0x100: 0x2000000, + 0x110: 0x100000, + 0x120: 0x2000401, + 0x130: 0x2100001, + 0x140: 0x100001, + 0x150: 0x2000400, + 0x160: 0x2100400, + 0x170: 0x100401, + 0x180: 0x401, + 0x190: 0x2100401, + 0x1a0: 0x100400, + 0x1b0: 0x1, + 0x1c0: 0x0, + 0x1d0: 0x2100000, + 0x1e0: 0x2000001, + 0x1f0: 0x400, + 0x108: 0x100400, + 0x118: 0x2000401, + 0x128: 0x2100001, + 0x138: 0x1, + 0x148: 0x2000000, + 0x158: 0x100000, + 0x168: 0x401, + 0x178: 0x2100400, + 0x188: 0x2000001, + 0x198: 0x2100000, + 0x1a8: 0x0, + 0x1b8: 0x2100401, + 0x1c8: 0x100401, + 0x1d8: 0x400, + 0x1e8: 0x2000400, + 0x1f8: 0x100001 + }, { + 0x0: 0x8000820, + 0x1: 0x20000, + 0x2: 0x8000000, + 0x3: 0x20, + 0x4: 0x20020, + 0x5: 0x8020820, + 0x6: 0x8020800, + 0x7: 0x800, + 0x8: 0x8020000, + 0x9: 0x8000800, + 0xa: 0x20800, + 0xb: 0x8020020, + 0xc: 0x820, + 0xd: 0x0, + 0xe: 0x8000020, + 0xf: 0x20820, + 0x80000000: 0x800, + 0x80000001: 0x8020820, + 0x80000002: 0x8000820, + 0x80000003: 0x8000000, + 0x80000004: 0x8020000, + 0x80000005: 0x20800, + 0x80000006: 0x20820, + 0x80000007: 0x20, + 0x80000008: 0x8000020, + 0x80000009: 0x820, + 0x8000000a: 0x20020, + 0x8000000b: 0x8020800, + 0x8000000c: 0x0, + 0x8000000d: 0x8020020, + 0x8000000e: 0x8000800, + 0x8000000f: 0x20000, + 0x10: 0x20820, + 0x11: 0x8020800, + 0x12: 0x20, + 0x13: 0x800, + 0x14: 0x8000800, + 0x15: 0x8000020, + 0x16: 0x8020020, + 0x17: 0x20000, + 0x18: 0x0, + 0x19: 0x20020, + 0x1a: 0x8020000, + 0x1b: 0x8000820, + 0x1c: 0x8020820, + 0x1d: 0x20800, + 0x1e: 0x820, + 0x1f: 0x8000000, + 0x80000010: 0x20000, + 0x80000011: 0x800, + 0x80000012: 0x8020020, + 0x80000013: 0x20820, + 0x80000014: 0x20, + 0x80000015: 0x8020000, + 0x80000016: 0x8000000, + 0x80000017: 0x8000820, + 0x80000018: 0x8020820, + 0x80000019: 0x8000020, + 0x8000001a: 0x8000800, + 0x8000001b: 0x0, + 0x8000001c: 0x20800, + 0x8000001d: 0x820, + 0x8000001e: 0x20020, + 0x8000001f: 0x8020800 + }]; + var SBOX_MASK = [0xf8000001, 0x1f800000, 0x01f80000, 0x001f8000, 0x0001f800, 0x00001f80, 0x000001f8, 0x8000001f]; + var DES = C_algo.DES = BlockCipher.extend({ + _doReset: function () { + var key = this._key; + var keyWords = key.words; + var keyBits = []; + for (var i = 0; i < 56; i++) { + var keyBitPos = PC1[i] - 1; + keyBits[i] = (keyWords[keyBitPos >>> 5] >>> (31 - keyBitPos % 32)) & 1; + } + var subKeys = this._subKeys = []; + for (var nSubKey = 0; nSubKey < 16; nSubKey++) { + var subKey = subKeys[nSubKey] = []; + var bitShift = BIT_SHIFTS[nSubKey]; + for (var i = 0; i < 24; i++) { + subKey[(i / 6) | 0] |= keyBits[((PC2[i] - 1) + bitShift) % 28] << (31 - i % 6); + subKey[4 + ((i / 6) | 0)] |= keyBits[28 + (((PC2[i + 24] - 1) + bitShift) % 28)] << (31 - i % 6); + } + subKey[0] = (subKey[0] << 1) | (subKey[0] >>> 31); + for (var i = 1; i < 7; i++) { + subKey[i] = subKey[i] >>> ((i - 1) * 4 + 3); + } + subKey[7] = (subKey[7] << 5) | (subKey[7] >>> 27); + } + var invSubKeys = this._invSubKeys = []; + for (var i = 0; i < 16; i++) { + invSubKeys[i] = subKeys[15 - i]; + } + }, encryptBlock: function (M, offset) { + this._doCryptBlock(M, offset, this._subKeys); + }, decryptBlock: function (M, offset) { + this._doCryptBlock(M, offset, this._invSubKeys); + }, _doCryptBlock: function (M, offset, subKeys) { + this._lBlock = M[offset]; + this._rBlock = M[offset + 1]; + exchangeLR.call(this, 4, 0x0f0f0f0f); + exchangeLR.call(this, 16, 0x0000ffff); + exchangeRL.call(this, 2, 0x33333333); + exchangeRL.call(this, 8, 0x00ff00ff); + exchangeLR.call(this, 1, 0x55555555); + for (var round = 0; round < 16; round++) { + var subKey = subKeys[round]; + var lBlock = this._lBlock; + var rBlock = this._rBlock; + var f = 0; + for (var i = 0; i < 8; i++) { + f |= SBOX_P[i][((rBlock ^ subKey[i]) & SBOX_MASK[i]) >>> 0]; + } + this._lBlock = rBlock; + this._rBlock = lBlock ^ f; + } + var t = this._lBlock; + this._lBlock = this._rBlock; + this._rBlock = t; + exchangeLR.call(this, 1, 0x55555555); + exchangeRL.call(this, 8, 0x00ff00ff); + exchangeRL.call(this, 2, 0x33333333); + exchangeLR.call(this, 16, 0x0000ffff); + exchangeLR.call(this, 4, 0x0f0f0f0f); + M[offset] = this._lBlock; + M[offset + 1] = this._rBlock; + }, keySize: 64 / 32, + ivSize: 64 / 32, + blockSize: 64 / 32 + }); + function exchangeLR(offset, mask) { + var t = ((this._lBlock >>> offset) ^ this._rBlock) & mask; + this._rBlock ^= t; + this._lBlock ^= t << offset; + } + function exchangeRL(offset, mask) { + var t = ((this._rBlock >>> offset) ^ this._lBlock) & mask; + this._lBlock ^= t; + this._rBlock ^= t << offset; + } + C.DES = BlockCipher._createHelper(DES); + var TripleDES = C_algo.TripleDES = BlockCipher.extend({ + _doReset: function () { + var key = this._key; + var keyWords = key.words; + this._des1 = DES.createEncryptor(WordArray.create(keyWords.slice(0, 2))); + this._des2 = DES.createEncryptor(WordArray.create(keyWords.slice(2, 4))); + this._des3 = DES.createEncryptor(WordArray.create(keyWords.slice(4, 6))); + }, encryptBlock: function (M, offset) { + this._des1.encryptBlock(M, offset); + this._des2.decryptBlock(M, offset); + this._des3.encryptBlock(M, offset); + }, decryptBlock: function (M, offset) { + this._des3.decryptBlock(M, offset); + this._des2.encryptBlock(M, offset); + this._des1.decryptBlock(M, offset); + }, keySize: 192 / 32, + ivSize: 64 / 32, + blockSize: 64 / 32 + }); + C.TripleDES = BlockCipher._createHelper(TripleDES); +}()); + + +function DES_Encrypt(word,key) { + var srcs = CryptoJS.enc.Utf8.parse(word); + var encrypted = CryptoJS.DES.encrypt(srcs, CryptoJS.enc.Utf8.parse(key), { + mode: CryptoJS.mode.ECB, + padding: CryptoJS.pad.ZeroPadding + }); + return encrypted.toString(); +} diff --git a/shumei_slide/track.py b/shumei_slide/track.py new file mode 100644 index 0000000..a7418d2 --- /dev/null +++ b/shumei_slide/track.py @@ -0,0 +1,35 @@ +import random,time +from datetime import datetime + + +def get_track(distance): + """生成轨迹""" + base_track = [ + [0, 0, 0], [0, -2, 102], [9, -3, 205], + [44, -5, 303], [82, -4, 409], [125, -3, 503], + [138, -2, 601], [166, -1, 702], [194, -1, 805], + [211, -1, 903], [222, -1, 1005], [224, -1, 1101], + [228, -1, 1201], [228, -1, 1316], [232, -2, 1401], + [232, -2, 1514], [232, -2, 1601], [233, -2, 1705], + [233, -2, 1801], [233, -2, 1902], [236, -3, 2001], + [236, -3, 2101], [236, -3, 2201], [236, -3, 2309], + [236, -3, 2402], [236, -3, 2512], [236, -3, 2601], + [236, -3, 2715], [236, -3, 2809], [236, -3, 2902] + ] + random_y = random.randint(0, 5) + radio = distance / base_track[-1][0] + new_track = [] + for x, y, t in base_track: + y = y + random_y if y else 0 + point = [round(x * radio), y, round(t * radio)] + new_track.append(point) + return new_track + +def get_callback(): + return 'sm_' + str(int(time.time() * 1000)) +def get_captchaUuid(): + """生成请求参数captchaUuid smcp.min.js""" + text = "ABCDEFGHJKMNPQRSTWXYZabcdefhijkmnprstwxyz2345678" + random18_str = ''.join(random.choices(text, k=18)) + time_str = datetime.now().strftime('%Y%m%d%H%M%S') + return time_str + random18_str \ No newline at end of file