Added manga-py source
This commit is contained in:
8
manga-py-stable_1.x/manga_py/crypt/__init__.py
Normal file
8
manga-py-stable_1.x/manga_py/crypt/__init__.py
Normal file
@@ -0,0 +1,8 @@
|
||||
from .ac_qq_com import AcQqComCrypt
|
||||
from .base_lib import BaseLib
|
||||
from .kissmanga_com import KissMangaComCrypt
|
||||
from .mangago_me import MangaGoMe
|
||||
from .mangarock_com import MangaRockComCrypt
|
||||
from .manhuagui_com import ManhuaGuiComCrypt
|
||||
from .puzzle import Puzzle
|
||||
from .sunday_webry_com import SundayWebryCom
|
||||
38
manga-py-stable_1.x/manga_py/crypt/ac_qq_com.py
Normal file
38
manga-py-stable_1.x/manga_py/crypt/ac_qq_com.py
Normal file
@@ -0,0 +1,38 @@
|
||||
class AcQqComCrypt:
|
||||
_provider = None
|
||||
_site_key = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/="
|
||||
|
||||
def __init__(self, provider):
|
||||
self._provider = provider
|
||||
|
||||
def decode(self, data):
|
||||
data = self._provider.re.sub('[^A-Za-z0-9%+/=]', '', data)
|
||||
a = ''
|
||||
e = 0
|
||||
while e < len(data) - 4:
|
||||
e += 1
|
||||
b = self._site_key.find(data[e])
|
||||
e += 1
|
||||
d = self._site_key.find(data[e])
|
||||
e += 1
|
||||
f = self._site_key.find(data[e])
|
||||
e += 1
|
||||
g = self._site_key.find(data[e])
|
||||
|
||||
b = b << 2 | d >> 4
|
||||
d = (d & 15) << 4 | f >> 2
|
||||
h = (f & 3) << 6 | g
|
||||
a += chr(b)
|
||||
|
||||
if f != 64:
|
||||
a += chr(d)
|
||||
if g != 64:
|
||||
a += chr(h)
|
||||
return self._protect(a)
|
||||
|
||||
def _protect(self, data):
|
||||
try:
|
||||
data = self._provider.re.search('({.+}})', data).group(1)
|
||||
return self._provider.json.loads(data)
|
||||
except Exception:
|
||||
return {}
|
||||
35
manga-py-stable_1.x/manga_py/crypt/aes.js
Normal file
35
manga-py-stable_1.x/manga_py/crypt/aes.js
Normal file
@@ -0,0 +1,35 @@
|
||||
/*
|
||||
CryptoJS v3.1.2
|
||||
code.google.com/p/crypto-js
|
||||
(c) 2009-2013 by Jeff Mott. All rights reserved.
|
||||
code.google.com/p/crypto-js/wiki/License
|
||||
*/
|
||||
var CryptoJS=CryptoJS||function(u,p){var d={},l=d.lib={},s=function(){},t=l.Base={extend:function(a){s.prototype=this;var c=new s;a&&c.mixIn(a);c.hasOwnProperty("init")||(c.init=function(){c.$super.init.apply(this,arguments)});c.init.prototype=c;c.$super=this;return c},create:function(){var a=this.extend();a.init.apply(a,arguments);return a},init:function(){},mixIn:function(a){for(var c in a)a.hasOwnProperty(c)&&(this[c]=a[c]);a.hasOwnProperty("toString")&&(this.toString=a.toString)},clone:function(){return this.init.prototype.extend(this)}},
|
||||
r=l.WordArray=t.extend({init:function(a,c){a=this.words=a||[];this.sigBytes=c!=p?c:4*a.length},toString:function(a){return(a||v).stringify(this)},concat:function(a){var c=this.words,e=a.words,j=this.sigBytes;a=a.sigBytes;this.clamp();if(j%4)for(var k=0;k<a;k++)c[j+k>>>2]|=(e[k>>>2]>>>24-8*(k%4)&255)<<24-8*((j+k)%4);else if(65535<e.length)for(k=0;k<a;k+=4)c[j+k>>>2]=e[k>>>2];else c.push.apply(c,e);this.sigBytes+=a;return this},clamp:function(){var a=this.words,c=this.sigBytes;a[c>>>2]&=4294967295<<
|
||||
32-8*(c%4);a.length=u.ceil(c/4)},clone:function(){var a=t.clone.call(this);a.words=this.words.slice(0);return a},random:function(a){for(var c=[],e=0;e<a;e+=4)c.push(4294967296*u.random()|0);return new r.init(c,a)}}),w=d.enc={},v=w.Hex={stringify:function(a){var c=a.words;a=a.sigBytes;for(var e=[],j=0;j<a;j++){var k=c[j>>>2]>>>24-8*(j%4)&255;e.push((k>>>4).toString(16));e.push((k&15).toString(16))}return e.join("")},parse:function(a){for(var c=a.length,e=[],j=0;j<c;j+=2)e[j>>>3]|=parseInt(a.substr(j,
|
||||
2),16)<<24-4*(j%8);return new r.init(e,c/2)}},b=w.Latin1={stringify:function(a){var c=a.words;a=a.sigBytes;for(var e=[],j=0;j<a;j++)e.push(String.fromCharCode(c[j>>>2]>>>24-8*(j%4)&255));return e.join("")},parse:function(a){for(var c=a.length,e=[],j=0;j<c;j++)e[j>>>2]|=(a.charCodeAt(j)&255)<<24-8*(j%4);return new r.init(e,c)}},x=w.Utf8={stringify:function(a){try{return decodeURIComponent(escape(b.stringify(a)))}catch(c){throw Error("Malformed UTF-8 data");}},parse:function(a){return b.parse(unescape(encodeURIComponent(a)))}},
|
||||
q=l.BufferedBlockAlgorithm=t.extend({reset:function(){this._data=new r.init;this._nDataBytes=0},_append:function(a){"string"==typeof a&&(a=x.parse(a));this._data.concat(a);this._nDataBytes+=a.sigBytes},_process:function(a){var c=this._data,e=c.words,j=c.sigBytes,k=this.blockSize,b=j/(4*k),b=a?u.ceil(b):u.max((b|0)-this._minBufferSize,0);a=b*k;j=u.min(4*a,j);if(a){for(var q=0;q<a;q+=k)this._doProcessBlock(e,q);q=e.splice(0,a);c.sigBytes-=j}return new r.init(q,j)},clone:function(){var a=t.clone.call(this);
|
||||
a._data=this._data.clone();return a},_minBufferSize:0});l.Hasher=q.extend({cfg:t.extend(),init:function(a){this.cfg=this.cfg.extend(a);this.reset()},reset:function(){q.reset.call(this);this._doReset()},update:function(a){this._append(a);this._process();return this},finalize:function(a){a&&this._append(a);return this._doFinalize()},blockSize:16,_createHelper:function(a){return function(b,e){return(new a.init(e)).finalize(b)}},_createHmacHelper:function(a){return function(b,e){return(new n.HMAC.init(a,
|
||||
e)).finalize(b)}}});var n=d.algo={};return d}(Math);
|
||||
(function(){var u=CryptoJS,p=u.lib.WordArray;u.enc.Base64={stringify:function(d){var l=d.words,p=d.sigBytes,t=this._map;d.clamp();d=[];for(var r=0;r<p;r+=3)for(var w=(l[r>>>2]>>>24-8*(r%4)&255)<<16|(l[r+1>>>2]>>>24-8*((r+1)%4)&255)<<8|l[r+2>>>2]>>>24-8*((r+2)%4)&255,v=0;4>v&&r+0.75*v<p;v++)d.push(t.charAt(w>>>6*(3-v)&63));if(l=t.charAt(64))for(;d.length%4;)d.push(l);return d.join("")},parse:function(d){var l=d.length,s=this._map,t=s.charAt(64);t&&(t=d.indexOf(t),-1!=t&&(l=t));for(var t=[],r=0,w=0;w<
|
||||
l;w++)if(w%4){var v=s.indexOf(d.charAt(w-1))<<2*(w%4),b=s.indexOf(d.charAt(w))>>>6-2*(w%4);t[r>>>2]|=(v|b)<<24-8*(r%4);r++}return p.create(t,r)},_map:"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/="}})();
|
||||
(function(u){function p(b,n,a,c,e,j,k){b=b+(n&a|~n&c)+e+k;return(b<<j|b>>>32-j)+n}function d(b,n,a,c,e,j,k){b=b+(n&c|a&~c)+e+k;return(b<<j|b>>>32-j)+n}function l(b,n,a,c,e,j,k){b=b+(n^a^c)+e+k;return(b<<j|b>>>32-j)+n}function s(b,n,a,c,e,j,k){b=b+(a^(n|~c))+e+k;return(b<<j|b>>>32-j)+n}for(var t=CryptoJS,r=t.lib,w=r.WordArray,v=r.Hasher,r=t.algo,b=[],x=0;64>x;x++)b[x]=4294967296*u.abs(u.sin(x+1))|0;r=r.MD5=v.extend({_doReset:function(){this._hash=new w.init([1732584193,4023233417,2562383102,271733878])},
|
||||
_doProcessBlock:function(q,n){for(var a=0;16>a;a++){var c=n+a,e=q[c];q[c]=(e<<8|e>>>24)&16711935|(e<<24|e>>>8)&4278255360}var a=this._hash.words,c=q[n+0],e=q[n+1],j=q[n+2],k=q[n+3],z=q[n+4],r=q[n+5],t=q[n+6],w=q[n+7],v=q[n+8],A=q[n+9],B=q[n+10],C=q[n+11],u=q[n+12],D=q[n+13],E=q[n+14],x=q[n+15],f=a[0],m=a[1],g=a[2],h=a[3],f=p(f,m,g,h,c,7,b[0]),h=p(h,f,m,g,e,12,b[1]),g=p(g,h,f,m,j,17,b[2]),m=p(m,g,h,f,k,22,b[3]),f=p(f,m,g,h,z,7,b[4]),h=p(h,f,m,g,r,12,b[5]),g=p(g,h,f,m,t,17,b[6]),m=p(m,g,h,f,w,22,b[7]),
|
||||
f=p(f,m,g,h,v,7,b[8]),h=p(h,f,m,g,A,12,b[9]),g=p(g,h,f,m,B,17,b[10]),m=p(m,g,h,f,C,22,b[11]),f=p(f,m,g,h,u,7,b[12]),h=p(h,f,m,g,D,12,b[13]),g=p(g,h,f,m,E,17,b[14]),m=p(m,g,h,f,x,22,b[15]),f=d(f,m,g,h,e,5,b[16]),h=d(h,f,m,g,t,9,b[17]),g=d(g,h,f,m,C,14,b[18]),m=d(m,g,h,f,c,20,b[19]),f=d(f,m,g,h,r,5,b[20]),h=d(h,f,m,g,B,9,b[21]),g=d(g,h,f,m,x,14,b[22]),m=d(m,g,h,f,z,20,b[23]),f=d(f,m,g,h,A,5,b[24]),h=d(h,f,m,g,E,9,b[25]),g=d(g,h,f,m,k,14,b[26]),m=d(m,g,h,f,v,20,b[27]),f=d(f,m,g,h,D,5,b[28]),h=d(h,f,
|
||||
m,g,j,9,b[29]),g=d(g,h,f,m,w,14,b[30]),m=d(m,g,h,f,u,20,b[31]),f=l(f,m,g,h,r,4,b[32]),h=l(h,f,m,g,v,11,b[33]),g=l(g,h,f,m,C,16,b[34]),m=l(m,g,h,f,E,23,b[35]),f=l(f,m,g,h,e,4,b[36]),h=l(h,f,m,g,z,11,b[37]),g=l(g,h,f,m,w,16,b[38]),m=l(m,g,h,f,B,23,b[39]),f=l(f,m,g,h,D,4,b[40]),h=l(h,f,m,g,c,11,b[41]),g=l(g,h,f,m,k,16,b[42]),m=l(m,g,h,f,t,23,b[43]),f=l(f,m,g,h,A,4,b[44]),h=l(h,f,m,g,u,11,b[45]),g=l(g,h,f,m,x,16,b[46]),m=l(m,g,h,f,j,23,b[47]),f=s(f,m,g,h,c,6,b[48]),h=s(h,f,m,g,w,10,b[49]),g=s(g,h,f,m,
|
||||
E,15,b[50]),m=s(m,g,h,f,r,21,b[51]),f=s(f,m,g,h,u,6,b[52]),h=s(h,f,m,g,k,10,b[53]),g=s(g,h,f,m,B,15,b[54]),m=s(m,g,h,f,e,21,b[55]),f=s(f,m,g,h,v,6,b[56]),h=s(h,f,m,g,x,10,b[57]),g=s(g,h,f,m,t,15,b[58]),m=s(m,g,h,f,D,21,b[59]),f=s(f,m,g,h,z,6,b[60]),h=s(h,f,m,g,C,10,b[61]),g=s(g,h,f,m,j,15,b[62]),m=s(m,g,h,f,A,21,b[63]);a[0]=a[0]+f|0;a[1]=a[1]+m|0;a[2]=a[2]+g|0;a[3]=a[3]+h|0},_doFinalize:function(){var b=this._data,n=b.words,a=8*this._nDataBytes,c=8*b.sigBytes;n[c>>>5]|=128<<24-c%32;var e=u.floor(a/
|
||||
4294967296);n[(c+64>>>9<<4)+15]=(e<<8|e>>>24)&16711935|(e<<24|e>>>8)&4278255360;n[(c+64>>>9<<4)+14]=(a<<8|a>>>24)&16711935|(a<<24|a>>>8)&4278255360;b.sigBytes=4*(n.length+1);this._process();b=this._hash;n=b.words;for(a=0;4>a;a++)c=n[a],n[a]=(c<<8|c>>>24)&16711935|(c<<24|c>>>8)&4278255360;return b},clone:function(){var b=v.clone.call(this);b._hash=this._hash.clone();return b}});t.MD5=v._createHelper(r);t.HmacMD5=v._createHmacHelper(r)})(Math);
|
||||
(function(){var u=CryptoJS,p=u.lib,d=p.Base,l=p.WordArray,p=u.algo,s=p.EvpKDF=d.extend({cfg:d.extend({keySize:4,hasher:p.MD5,iterations:1}),init:function(d){this.cfg=this.cfg.extend(d)},compute:function(d,r){for(var p=this.cfg,s=p.hasher.create(),b=l.create(),u=b.words,q=p.keySize,p=p.iterations;u.length<q;){n&&s.update(n);var n=s.update(d).finalize(r);s.reset();for(var a=1;a<p;a++)n=s.finalize(n),s.reset();b.concat(n)}b.sigBytes=4*q;return b}});u.EvpKDF=function(d,l,p){return s.create(p).compute(d,
|
||||
l)}})();
|
||||
CryptoJS.lib.Cipher||function(u){var p=CryptoJS,d=p.lib,l=d.Base,s=d.WordArray,t=d.BufferedBlockAlgorithm,r=p.enc.Base64,w=p.algo.EvpKDF,v=d.Cipher=t.extend({cfg:l.extend(),createEncryptor:function(e,a){return this.create(this._ENC_XFORM_MODE,e,a)},createDecryptor:function(e,a){return this.create(this._DEC_XFORM_MODE,e,a)},init:function(e,a,b){this.cfg=this.cfg.extend(b);this._xformMode=e;this._key=a;this.reset()},reset:function(){t.reset.call(this);this._doReset()},process:function(e){this._append(e);return this._process()},
|
||||
finalize:function(e){e&&this._append(e);return this._doFinalize()},keySize:4,ivSize:4,_ENC_XFORM_MODE:1,_DEC_XFORM_MODE:2,_createHelper:function(e){return{encrypt:function(b,k,d){return("string"==typeof k?c:a).encrypt(e,b,k,d)},decrypt:function(b,k,d){return("string"==typeof k?c:a).decrypt(e,b,k,d)}}}});d.StreamCipher=v.extend({_doFinalize:function(){return this._process(!0)},blockSize:1});var b=p.mode={},x=function(e,a,b){var c=this._iv;c?this._iv=u:c=this._prevBlock;for(var d=0;d<b;d++)e[a+d]^=
|
||||
c[d]},q=(d.BlockCipherMode=l.extend({createEncryptor:function(e,a){return this.Encryptor.create(e,a)},createDecryptor:function(e,a){return this.Decryptor.create(e,a)},init:function(e,a){this._cipher=e;this._iv=a}})).extend();q.Encryptor=q.extend({processBlock:function(e,a){var b=this._cipher,c=b.blockSize;x.call(this,e,a,c);b.encryptBlock(e,a);this._prevBlock=e.slice(a,a+c)}});q.Decryptor=q.extend({processBlock:function(e,a){var b=this._cipher,c=b.blockSize,d=e.slice(a,a+c);b.decryptBlock(e,a);x.call(this,
|
||||
e,a,c);this._prevBlock=d}});b=b.CBC=q;q=(p.pad={}).Pkcs7={pad:function(a,b){for(var c=4*b,c=c-a.sigBytes%c,d=c<<24|c<<16|c<<8|c,l=[],n=0;n<c;n+=4)l.push(d);c=s.create(l,c);a.concat(c)},unpad:function(a){a.sigBytes-=a.words[a.sigBytes-1>>>2]&255}};d.BlockCipher=v.extend({cfg:v.cfg.extend({mode:b,padding:q}),reset:function(){v.reset.call(this);var a=this.cfg,b=a.iv,a=a.mode;if(this._xformMode==this._ENC_XFORM_MODE)var c=a.createEncryptor;else c=a.createDecryptor,this._minBufferSize=1;this._mode=c.call(a,
|
||||
this,b&&b.words)},_doProcessBlock:function(a,b){this._mode.processBlock(a,b)},_doFinalize:function(){var a=this.cfg.padding;if(this._xformMode==this._ENC_XFORM_MODE){a.pad(this._data,this.blockSize);var b=this._process(!0)}else b=this._process(!0),a.unpad(b);return b},blockSize:4});var n=d.CipherParams=l.extend({init:function(a){this.mixIn(a)},toString:function(a){return(a||this.formatter).stringify(this)}}),b=(p.format={}).OpenSSL={stringify:function(a){var b=a.ciphertext;a=a.salt;return(a?s.create([1398893684,
|
||||
1701076831]).concat(a).concat(b):b).toString(r)},parse:function(a){a=r.parse(a);var b=a.words;if(1398893684==b[0]&&1701076831==b[1]){var c=s.create(b.slice(2,4));b.splice(0,4);a.sigBytes-=16}return n.create({ciphertext:a,salt:c})}},a=d.SerializableCipher=l.extend({cfg:l.extend({format:b}),encrypt:function(a,b,c,d){d=this.cfg.extend(d);var l=a.createEncryptor(c,d);b=l.finalize(b);l=l.cfg;return n.create({ciphertext:b,key:c,iv:l.iv,algorithm:a,mode:l.mode,padding:l.padding,blockSize:a.blockSize,formatter:d.format})},
|
||||
decrypt:function(a,b,c,d){d=this.cfg.extend(d);b=this._parse(b,d.format);return a.createDecryptor(c,d).finalize(b.ciphertext)},_parse:function(a,b){return"string"==typeof a?b.parse(a,this):a}}),p=(p.kdf={}).OpenSSL={execute:function(a,b,c,d){d||(d=s.random(8));a=w.create({keySize:b+c}).compute(a,d);c=s.create(a.words.slice(b),4*c);a.sigBytes=4*b;return n.create({key:a,iv:c,salt:d})}},c=d.PasswordBasedCipher=a.extend({cfg:a.cfg.extend({kdf:p}),encrypt:function(b,c,d,l){l=this.cfg.extend(l);d=l.kdf.execute(d,
|
||||
b.keySize,b.ivSize);l.iv=d.iv;b=a.encrypt.call(this,b,c,d.key,l);b.mixIn(d);return b},decrypt:function(b,c,d,l){l=this.cfg.extend(l);c=this._parse(c,l.format);d=l.kdf.execute(d,b.keySize,b.ivSize,c.salt);l.iv=d.iv;return a.decrypt.call(this,b,c,d.key,l)}})}();
|
||||
(function(){for(var u=CryptoJS,p=u.lib.BlockCipher,d=u.algo,l=[],s=[],t=[],r=[],w=[],v=[],b=[],x=[],q=[],n=[],a=[],c=0;256>c;c++)a[c]=128>c?c<<1:c<<1^283;for(var e=0,j=0,c=0;256>c;c++){var k=j^j<<1^j<<2^j<<3^j<<4,k=k>>>8^k&255^99;l[e]=k;s[k]=e;var z=a[e],F=a[z],G=a[F],y=257*a[k]^16843008*k;t[e]=y<<24|y>>>8;r[e]=y<<16|y>>>16;w[e]=y<<8|y>>>24;v[e]=y;y=16843009*G^65537*F^257*z^16843008*e;b[k]=y<<24|y>>>8;x[k]=y<<16|y>>>16;q[k]=y<<8|y>>>24;n[k]=y;e?(e=z^a[a[a[G^z]]],j^=a[a[j]]):e=j=1}var H=[0,1,2,4,8,
|
||||
16,32,64,128,27,54],d=d.AES=p.extend({_doReset:function(){for(var a=this._key,c=a.words,d=a.sigBytes/4,a=4*((this._nRounds=d+6)+1),e=this._keySchedule=[],j=0;j<a;j++)if(j<d)e[j]=c[j];else{var k=e[j-1];j%d?6<d&&4==j%d&&(k=l[k>>>24]<<24|l[k>>>16&255]<<16|l[k>>>8&255]<<8|l[k&255]):(k=k<<8|k>>>24,k=l[k>>>24]<<24|l[k>>>16&255]<<16|l[k>>>8&255]<<8|l[k&255],k^=H[j/d|0]<<24);e[j]=e[j-d]^k}c=this._invKeySchedule=[];for(d=0;d<a;d++)j=a-d,k=d%4?e[j]:e[j-4],c[d]=4>d||4>=j?k:b[l[k>>>24]]^x[l[k>>>16&255]]^q[l[k>>>
|
||||
8&255]]^n[l[k&255]]},encryptBlock:function(a,b){this._doCryptBlock(a,b,this._keySchedule,t,r,w,v,l)},decryptBlock:function(a,c){var d=a[c+1];a[c+1]=a[c+3];a[c+3]=d;this._doCryptBlock(a,c,this._invKeySchedule,b,x,q,n,s);d=a[c+1];a[c+1]=a[c+3];a[c+3]=d},_doCryptBlock:function(a,b,c,d,e,j,l,f){for(var m=this._nRounds,g=a[b]^c[0],h=a[b+1]^c[1],k=a[b+2]^c[2],n=a[b+3]^c[3],p=4,r=1;r<m;r++)var q=d[g>>>24]^e[h>>>16&255]^j[k>>>8&255]^l[n&255]^c[p++],s=d[h>>>24]^e[k>>>16&255]^j[n>>>8&255]^l[g&255]^c[p++],t=
|
||||
d[k>>>24]^e[n>>>16&255]^j[g>>>8&255]^l[h&255]^c[p++],n=d[n>>>24]^e[g>>>16&255]^j[h>>>8&255]^l[k&255]^c[p++],g=q,h=s,k=t;q=(f[g>>>24]<<24|f[h>>>16&255]<<16|f[k>>>8&255]<<8|f[n&255])^c[p++];s=(f[h>>>24]<<24|f[k>>>16&255]<<16|f[n>>>8&255]<<8|f[g&255])^c[p++];t=(f[k>>>24]<<24|f[n>>>16&255]<<16|f[g>>>8&255]<<8|f[h&255])^c[p++];n=(f[n>>>24]<<24|f[g>>>16&255]<<16|f[h>>>8&255]<<8|f[k&255])^c[p++];a[b]=q;a[b+1]=s;a[b+2]=t;a[b+3]=n},keySize:8});u.AES=p._createHelper(d)})();
|
||||
7
manga-py-stable_1.x/manga_py/crypt/aes_zp.js
Normal file
7
manga-py-stable_1.x/manga_py/crypt/aes_zp.js
Normal file
@@ -0,0 +1,7 @@
|
||||
/*
|
||||
CryptoJS v3.1.2
|
||||
code.google.com/p/crypto-js
|
||||
(c) 2009-2013 by Jeff Mott. All rights reserved.
|
||||
code.google.com/p/crypto-js/wiki/License
|
||||
*/
|
||||
CryptoJS.pad.ZeroPadding={pad:function(a,c){var b=4*c;a.clamp();a.sigBytes+=b-(a.sigBytes%b||b)},unpad:function(a){for(var c=a.words,b=a.sigBytes-1;!(c[b>>>2]>>>24-8*(b%4)&255);)b--;a.sigBytes=b+1}};
|
||||
126
manga-py-stable_1.x/manga_py/crypt/base_lib.py
Normal file
126
manga-py-stable_1.x/manga_py/crypt/base_lib.py
Normal file
@@ -0,0 +1,126 @@
|
||||
import base64
|
||||
import codecs
|
||||
import gzip
|
||||
import zlib
|
||||
from binascii import unhexlify
|
||||
from struct import pack, unpack
|
||||
|
||||
from Crypto.Cipher import AES
|
||||
from Crypto.Hash import SHA256, MD5
|
||||
from execjs import compile
|
||||
|
||||
|
||||
class BaseLib:
|
||||
|
||||
@staticmethod
|
||||
def decode_escape(data): # pragma: no cover
|
||||
|
||||
if isinstance(data, str):
|
||||
data = data.encode()
|
||||
try:
|
||||
data = codecs.escape_decode(data)
|
||||
return data[0]
|
||||
except Exception:
|
||||
return ''
|
||||
|
||||
@staticmethod
|
||||
def encode_hex(data): # pragma: no cover
|
||||
return codecs.decode(data, 'hex')
|
||||
|
||||
@staticmethod
|
||||
def to_sha_256(data): # pragma: no cover
|
||||
if isinstance(data, str):
|
||||
data = data.encode()
|
||||
sha = SHA256.new()
|
||||
sha.update(data)
|
||||
return sha.digest()
|
||||
|
||||
@staticmethod
|
||||
def decrypt_aes(iv, key, data, mode: int = AES.MODE_CBC): # pragma: no cover
|
||||
aes = AES.new(key, mode, iv)
|
||||
return aes.decrypt(data)
|
||||
|
||||
@staticmethod
|
||||
def base64decode(data, altchars=None, validate=False): # pragma: no cover
|
||||
return base64.b64decode(data, altchars, validate)
|
||||
|
||||
@staticmethod
|
||||
def base64encode(data, altchars=None): # pragma: no cover
|
||||
return base64.b64encode(data, altchars)
|
||||
|
||||
@staticmethod
|
||||
def exec_js(source, js): # pragma: no cover
|
||||
return compile(source).eval(js)
|
||||
|
||||
@staticmethod
|
||||
def gunzip(data): # pragma: no cover
|
||||
return gzip.decompress(data)
|
||||
|
||||
@staticmethod
|
||||
def gzip(data, lvl: int = 9): # pragma: no cover
|
||||
return gzip.compress(data, lvl)
|
||||
|
||||
@staticmethod
|
||||
def zlib_d(data, **kwargs): # pragma: no cover
|
||||
return zlib.decompress(data, **kwargs)
|
||||
|
||||
@staticmethod
|
||||
def zlib_c(data, **kwargs): # pragma: no cover
|
||||
return zlib.compress(data, **kwargs)
|
||||
|
||||
@staticmethod
|
||||
def md5(string): # pragma: no cover
|
||||
if isinstance(string, str):
|
||||
string = string.encode()
|
||||
_ = MD5.new()
|
||||
_.update(string)
|
||||
return _
|
||||
|
||||
@staticmethod
|
||||
def pack(fmt, *args): # pragma: no cover
|
||||
return pack(fmt, *args)
|
||||
|
||||
@staticmethod
|
||||
def unpack(fmt, string): # pragma: no cover
|
||||
return unpack(fmt, string)
|
||||
|
||||
@staticmethod
|
||||
def pack_auto(int_list) -> bytes:
|
||||
"""
|
||||
:param int_list: list
|
||||
:return: str
|
||||
"""
|
||||
base_frm = '{}B'.format(len(int_list))
|
||||
return pack(base_frm, *int_list)
|
||||
|
||||
@staticmethod
|
||||
def unpack_auto(string) -> list:
|
||||
"""
|
||||
:param string: str
|
||||
:return: tuple
|
||||
"""
|
||||
if isinstance(string, str):
|
||||
string = string.encode()
|
||||
|
||||
return list(string)
|
||||
|
||||
@staticmethod
|
||||
def str2hex(string):
|
||||
hex_str = ''
|
||||
if isinstance(string, bytes):
|
||||
string = string.decode()
|
||||
for char in string:
|
||||
int_char = ord(char)
|
||||
hex_num = hex(int_char).lstrip("0x")
|
||||
hex_str += hex_num
|
||||
return hex_str
|
||||
|
||||
@staticmethod
|
||||
def hex2str(string):
|
||||
clear_str = ''
|
||||
if isinstance(string, bytes):
|
||||
string = string.decode()
|
||||
for counter in range(0, len(string), 2):
|
||||
hex_char = string[counter] + string[counter + 1]
|
||||
clear_str += unhexlify(hex_char)
|
||||
return clear_str
|
||||
16
manga-py-stable_1.x/manga_py/crypt/kissmanga_com.py
Normal file
16
manga-py-stable_1.x/manga_py/crypt/kissmanga_com.py
Normal file
@@ -0,0 +1,16 @@
|
||||
from .base_lib import BaseLib
|
||||
from sys import stderr
|
||||
|
||||
|
||||
class KissMangaComCrypt(BaseLib):
|
||||
|
||||
def decrypt(self, iv, key, data):
|
||||
iv = self.encode_hex(iv)
|
||||
key = self.to_sha_256(key)
|
||||
data = self.base64decode(data)
|
||||
|
||||
try:
|
||||
return self.decrypt_aes(iv, key, data)
|
||||
except Exception as e:
|
||||
print(e, file=stderr)
|
||||
return False
|
||||
68
manga-py-stable_1.x/manga_py/crypt/mangago_me.py
Normal file
68
manga-py-stable_1.x/manga_py/crypt/mangago_me.py
Normal file
@@ -0,0 +1,68 @@
|
||||
from pathlib import Path
|
||||
|
||||
from .base_lib import BaseLib
|
||||
from .puzzle import Puzzle
|
||||
|
||||
|
||||
class MangaGoMe(BaseLib):
|
||||
_key = 'e10adc3949ba59abbe56e057f20f883e'
|
||||
_iv = '1234567890abcdef1234567890abcdef'
|
||||
|
||||
# https://codepen.io/1271/pen/mKYLrG
|
||||
def decrypt(self, data):
|
||||
scripts = [
|
||||
'aes.js',
|
||||
'aes_zp.js',
|
||||
]
|
||||
script = ''
|
||||
path = Path(__file__).resolve().parent
|
||||
for i in scripts:
|
||||
with open(str(path.joinpath(i)), 'r') as f:
|
||||
script += f.read()
|
||||
decrypted = self.exec_js(script,
|
||||
'CryptoJS.AES.decrypt("%s",CryptoJS.enc.Hex.parse("%s"),{iv:CryptoJS.enc.Hex.parse("%s"),padding:CryptoJS.pad.ZeroPadding}).toString(CryptoJS.enc.Utf8)' % (
|
||||
data, self._key, self._iv))
|
||||
order_js = """function replacePos(e,r,i){return e.substr(0,r)+i+e.substring(r+1,e.length)}function dorder(e,r){for(j=r.length-1;j>=0;j--)for(i=e.length-1;i-r[j]>=0;i--)i%2!=0&&(temp=e[i-r[j]],e=replacePos(e=replacePos(e,i-r[j],e[i]),i,temp));return e}"""
|
||||
code = decrypted[19] + decrypted[23] + decrypted[31] + decrypted[39]
|
||||
decrypted = decrypted[:19] + decrypted[20:23] + decrypted[24:31] + decrypted[32:39] + decrypted[40:]
|
||||
return self.exec_js(order_js, 'dorder("%s","%s")' % (decrypted, code))
|
||||
|
||||
@staticmethod
|
||||
def puzzle(_path, _dst, url):
|
||||
values = {
|
||||
'60a2b0ed56cd458c4633d04b1b76b7e9': '18a72a69a64a13a1a43a3aa42a23a66a26a19a51a54a78a34a17a31a35a15a58a29a61a48a73a74a44a52a60a24a63a20a32a7a45a53a75a55a62a59a41a76a68a2a36a21a10a38a33a71a40a67a22a4a50a80a65a27a37a47a70a14a28a16a6a56a30a57a5a11a79a9a77a46a39a25a49a8a12',
|
||||
'400df5e8817565e28b2e141c533ed7db': '61a74a10a45a3a37a72a22a57a39a25a56a52a29a70a60a67a41a63a55a27a28a43a18a5a9a8a40a17a48a44a79a38a47a32a73a4a6a13a34a33a49a2a42a50a76a54a36a35a14a58a7a69a46a16a30a21a11aa51a53a77a26a31a1a19a20a80a24a62a68a59a66a75a12a64a78a71a15a65a23',
|
||||
'84ba0d8098f405b14f4dbbcc04c93bac': '61a26a35a16a55a10a72a37a2a60a66a65a33a44a7a28a70a62a32a56a30a40a58a15a74a47aa36a78a75a11a6a77a67a39a23a9a31a64a59a13a24a80a14a38a45a21a63a19a51a17a34a50a46a5a29a73a8a57a69a48a68a49a71a41a12a52a18a79a76a54a42a22a4a1a3a53a20a25a43a27',
|
||||
'56665708741979f716e5bd64bf733c33': '23a7a41a48a57a27a69a36a76a62a40a75a26a2a51a6a10a65a43a24a1aa20a71a28a30a13a38a79a78a72a14a49a55a56a58a25a70a12a80a3a66a11a39a42a17a15a54a45a34a74a31a8a61a46a73a63a22a64a19a77a50a9a59a37a68a52a18a32a16a33a60a67a21a44a53a5a35a4a29a47',
|
||||
'37abcb7424ce8df47ccb1d2dd9144b49': '67a45a39a72a35a38a61a11a51a60a13a22a31a25a75a30a74a43a69a50a6a26a16a49a77a68a59a64a17a56a18a1a10a54a44a62a53a80a5a23a48a32a29a79a24a70a28a58a71a3a52a42a55a9a14a36a73a34a2a27a57a0a21a41a33a37a76a8a40a65a7a20a12a19a47a4a78a15a63a66a46',
|
||||
'874b83ba76a7e783d13abc2dabc08d76': '26a59a42a43a4a20a61a28a12a64a37a52a2a77a34a13a46a74a70a0a44a29a73a66a55a38a69a67a62a9a63a6a54a79a21a33a8a58a40a47a71a49a22a50a57a78a56a25a17a15a36a16a48a32a5a10a14a80a24a72a76a45a3a53a23a41a60a11a65a19a27a51a68a35a31a1a75a39a30a7a18',
|
||||
'930b87ad89c2e2501f90d0f0e92a6b97': '9a29a49a67a62a40a28a50a64a77a46a31a16a73a14a45a51a44a7a76a22a78a68a37a74a69a25a65a41a11a52aa18a36a10a38a12a15a2a58a48a8a27a75a20a4a80a61a55a42a13a43a47a39a35a60a26a30a63a66a57a33a72a24a71a34a23a3a70a54a56a32a79a5a21a6a59a53a17a1a19',
|
||||
'1269606c6c3d8bb6508426468216d6b1': '49a15a0a60a14a26a34a69a61a24a35a4a77a80a70a40a39a6a68a17a41a56a28a46a79a16a21a1a37a42a44a58a78a18a52a73a32a9a12a50a8a13a20a19a67a36a45a75a48a10a65a7a38a66a3a2a43a27a29a31a72a74a55a23a54a22a59a57a11a62a47a53a30a5a64a25a76a71a51a33a63',
|
||||
'33a3b21bb2d14a09d15f995224ae4284': '30a59a35a34a42a8a10a56a70a64a48a69a26a18a6a16a54a24a73a79a68a33a32a2a63a53a31a14a17a57a41a80a76a40a60a12a43a29a39a4a77a58a66a36a38a52a13a19a0a75a28a55a25a61a71a11a67a49a23a45a5a15a1a50a51a9a44a47a65a74a72a27a7a37a46a20a22a62a78a21a3',
|
||||
'9ae6640761b947e61624671ef841ee78': '62a25a21a75a42a61a73a59a23a19a66a38a71a70a6a55a3a16a43a32a53a37a41a28a49a63a47a17a7a30a78a46a20a67a56a79a65a14a69a60a8a52a22a9a24a2a4a13a36a27a0a18a33a12a44a5a76a26a29a40a1a11a64a48a39a51a80a72a68a10a58a35a77a54a34a74a57a31a50a45a15',
|
||||
'a67e15ed870fe4aab0a502478a5c720f': '8a12a59a52a24a13a37a21a55a56a41a71a65a43a40a66a11a79a67a44a33a20a72a2a31a42a29a34a58a60a27a48a28a15a35a51a76a80a0a63a69a53a39a46a64a50a75a1a57a9a62a74a18a16a73a14a17a6a19a61a23a38a10a3a32a26a36a54a4a30a45a47a70a22a7a68a49a77a5a25a78',
|
||||
'b6a2f75185754b691e4dfe50f84db57c': '47a63a76a58a37a4a56a21a1a48a62a2a36a44a34a42a23a9a60a72a11a74a70a20a77a16a15a35a69a0a55a46a24a6a32a75a68a43a41a78a31a71a52a33a67a25a80a30a5a28a40a65a39a14a29a64a3a53a49a59a12a66a38a27a79a45a18a22a8a61a50a17a51a10a26a13a57a19a7a54a73',
|
||||
'db99689c5a26a09d126c7089aedc0d86': '57a31a46a61a55a41a26a2a39a24a75a4a45a13a23a51a15a8a64a37a72a34a12a3a79a42a80a17a62a49a19a77a48a68a78a65a14a10a29a16a20a76a38a36a54a30a53a40a33a21a44a22a32a5a1a7a70a67a58a0a71a74a43a66a6a63a35a56a73a9a27a25a59a47a52a11a50a18a28a60a69',
|
||||
'd320d2647d70c068b89853e1a269c609': '77a38a53a40a16a3a20a18a63a9a24a64a50a61a45a59a27a37a8a34a11a55a79a13a47a68a12a22a46a33a1a69a52a54a31a23a62a43a0a2a35a28a57a36a51a78a70a5a32a75a41a30a4a80a19a21a42a71a49a10a56a74a17a7a25a6a14a73a29a44a48a39a60a58a15a66a67a72a65a76a26',
|
||||
'c587e77362502aaedad5b7cddfbe3a0d': '50aa59a70a68a30a56a10a49a43a45a29a23a28a61a15a40a71a14a44a32a34a17a26a63a76a75a33a74a12a11a21a67a31a19a80a7a64a8a3a51a53a38a18a6a42a27a9a52a20a41a60a1a22a77a16a54a47a79a24a78a2a46a37a73a65a36a35a39a5a4a25a72a13a62a55a57a58a69a66a48',
|
||||
'f4ab0903149b5d94baba796a5cf05938': '40a37a55a73a18a42a15a59a50a13a22a63a52a58a6a80a47a17a38a71a74a70a30a11a10a19a0a31a36a21a51a68a1a3a14a66a45a2a79a7a76a75a8a67a20a78a25a69a43a28a35a60a4a23a65a54a34a9a5a39a27a57a26a33a12a24a46a72a56a44a49a61a64a29a53a48a32a62a41a16a77',
|
||||
'f5baf770212313f5e9532ec5e6103b61': '55a69a78a75a38a25a20a60a6a80a46a5a48a18a23a24a17a67a64a70a63a57a22a10a49a19a8a16a11a12a61a76a34a27a54a73a44a0a56a3a15a29a28a13a4a2a7a77a74a35a37a26a30a58a9a71a50a1a43a79a47a32a14a53a52a66a72a59a68a31a42a45a62a51a40a39a33a65a41a36a21',
|
||||
'e2169a4bfd805e9aa21d3112d498d68c': '54a34a68a69a26a20a66a1a67a74a22a39a63a70a5a37a75a15a6a14a62a50a46a35a44a45a28a8a40a25a29a76a51a77a17a47a0a42a2a9a48a27a13a64a58a57a18a30a80a23a61a36a60a59a71a32a7a38a41a78a12a49a43a79a24a31a52a19a3a53a72a10a73a11a33a16a4a55a65a21a56',
|
||||
'1796550d20f64decb317f9b770ba0e78': '37a55a39a79a2a53a75a1a30a32a3a13a25a49a45a5a60a62a71a78a63a24a27a33a19a64a67a57a0a8a54a9a41a61a50a73a7a65a58a51a15a14a43a4a35a77a68a72a34a80a22a17a48a10a70a46a40a28a20a74a52a23a38a76a42a18a66a11a59a6a69a31a56a16a47a21a12a44a36a29a26',
|
||||
'bf53be6753a0037c6d80ca670f5d12d5': '55a41a18a19a4a13a36a12a56a69a64a80a30a39a57a50a48a26a46a73a17a52a49a66a11a25a61a51a68a24a70a7a67a53a43a8a29a75a65a42a38a58a9a28a0a78a54a31a22a5a15a3a79a77a59a23a45a40a47a44a6a2a1a35a14a62a63a76a20a16a32a21a71a10a74a60a34a37a33a72a27',
|
||||
'6c41ff7fbed622aa76e19f3564e5d52a': '40a3a13a59a68a34a66a43a67a14a26a46a8a24a33a73a69a31a2a57a10a51a62a77a74a41a47a35a64a52a15a53a6a80a76a50a28a75a56a79a17a45a25a49a48a65a78a27a9a63a12a55a32a21a58a38a0a71a44a30a61a36a16a23a20a70a22a37a4a19a7a60a11a5a18a39a1a54a72a29a42',
|
||||
}
|
||||
ik = '18a72a69a64a13a1a43a3aa42a23a66a26a19a51a54a78a34a17a31a35a15a58a29a61a48a73a74a44a52a60a24a63a20a32a7a45a53a75a55a62a59a41a76a68a2a36a21a10a38a33a71a40a67a22a4a50a80a65a27a37a47a70a14a28a16a6a56a30a57a5a11a79a9a77a46a39a25a49a8a12'
|
||||
|
||||
for k in values:
|
||||
if ~url.find(k):
|
||||
ik = values[k]
|
||||
matrix = {}
|
||||
for n, i in enumerate(ik.split('a')):
|
||||
if len(i) > 0:
|
||||
m = int(i)
|
||||
else:
|
||||
m = 0
|
||||
matrix[n] = m
|
||||
puzzle = Puzzle(9, 9, matrix, 0)
|
||||
puzzle.de_scramble(_path, _dst)
|
||||
22
manga-py-stable_1.x/manga_py/crypt/mangarock_com.py
Normal file
22
manga-py-stable_1.x/manga_py/crypt/mangarock_com.py
Normal file
@@ -0,0 +1,22 @@
|
||||
from .base_lib import BaseLib
|
||||
|
||||
|
||||
class MangaRockComCrypt(BaseLib):
|
||||
def decrypt(self, string):
|
||||
if isinstance(string, str):
|
||||
string = string.encode()
|
||||
n = len(string) + 7
|
||||
|
||||
tmp = self.pack_auto([82, 73, 70, 70])
|
||||
|
||||
tmp += self.pack_auto([
|
||||
n & 0xff,
|
||||
(n >> 8) & 0xff,
|
||||
(n >> 16) & 0xff,
|
||||
(n >> 24) & 0xff,
|
||||
])
|
||||
|
||||
tmp += self.pack_auto([87, 69, 66, 80, 86, 80, 56])
|
||||
for i in range(len(string)):
|
||||
tmp += self.pack('1B', string[i] ^ 101)
|
||||
return tmp
|
||||
24
manga-py-stable_1.x/manga_py/crypt/manhuagui_com.py
Normal file
24
manga-py-stable_1.x/manga_py/crypt/manhuagui_com.py
Normal file
@@ -0,0 +1,24 @@
|
||||
from .base_lib import BaseLib
|
||||
|
||||
|
||||
class ManhuaGuiComCrypt(BaseLib):
|
||||
def decrypt(self, js, default=''):
|
||||
# try:
|
||||
return self.exec_js(self.js_gz_b64_data(), js)
|
||||
# except Exception:
|
||||
# return default
|
||||
|
||||
def js_gz_b64_data(self): # FIXME
|
||||
data = """eJzNVdtymzAQ/RWHhwwqawp2mqbI60yaNr0lvaXXeJgMARFIiEQlYTt1+fcKfOt03Olj8iAQR7tn
|
||||
j3YO0jiSneOzUy1zfolpxWOdC26T2djgAue4m0pxc5hF8lAkDHKc1bRZ5jhLWCxuSsmUOjIhTyPF
|
||||
dneCFYsgM8l0JXmHV0WBKPYtK7CsZtIAAXfPPVu4BeOXOoN+D1aZfJW5JgMD5qm9lY9EaGbm2QhJ
|
||||
hbQbMRo9qgdLMqodhzQhI+HGRviBtjUJUdcL1naJh7VtHTw9fPb86MXLV6/fHJ+8fff+w8fTT5+/
|
||||
fP32/Sy6iBOWXmb51XVxw0X5QypdjSfT25+e3+vvPNp9vPfEeYgWrEpwQmpSw7m3bkEOHPS8mxIU
|
||||
RFACgwJiSHEUQoY7UJkxxj4kaFkwadApmvgi0LZHoBQqb4gCDjlP2DTw51uWZrty0KfSQZ+kIxmi
|
||||
bPEIPWB4EunMLcXE7kGPQIE+LbaQUVLi1DXU21N3yQvr6XCIPniIa2R7215/YBNrklEbsNViWkwg
|
||||
+oV2OfT2/cAjDwooBgNTTU1yHWd2RGaxsUTH9GOTtL27kBajMLrohWTRNW3V+ZvV+bv3Q14vmHvW
|
||||
supGZzrqhxiDMmPilpXK7JhQ2v4ZC/JhTpYZmy0xvkNLxHgfTZGOKscJ29ZDjFXXh6zbvbce+a/a
|
||||
pWU6E/dK5Ny2LFIbf5jqmSma/eWFsakE6SgOSYLNi7JCscZP8RZiRf44wWmCylHL084j9cKBSZPf
|
||||
alJOsl42Jk2aLXe7/ypb1zVd8tc2oYvrppRCC31bMleVRR7jhgtleWW5m24gW2e5Im2yNjk1/Q2+
|
||||
WUKy"""
|
||||
return self.zlib_d(self.base64decode(data)).decode()
|
||||
66
manga-py-stable_1.x/manga_py/crypt/puzzle.py
Normal file
66
manga-py-stable_1.x/manga_py/crypt/puzzle.py
Normal file
@@ -0,0 +1,66 @@
|
||||
from PIL import Image
|
||||
|
||||
|
||||
class Puzzle:
|
||||
need_copy_orig = False
|
||||
|
||||
__x = 0
|
||||
__y = 0
|
||||
__multiply = 1
|
||||
__matrix = None
|
||||
__image_src = None
|
||||
__image_dst = None
|
||||
__block_width = None
|
||||
__block_height = None
|
||||
|
||||
def __init__(self, x: int, y: int, matrix: dict, multiply: int = 1):
|
||||
self.__x = x
|
||||
self.__y = y
|
||||
self.__matrix = matrix
|
||||
self.__multiply = multiply
|
||||
|
||||
def de_scramble(self, path_src: str, path_dst: str):
|
||||
self.__image_src = Image.open(path_src, 'r')
|
||||
self._process()
|
||||
self.__image_dst.save(path_dst)
|
||||
self.__image_src.close()
|
||||
self.__image_dst.close()
|
||||
|
||||
def _process(self):
|
||||
self.__image_dst = Image.new(self.__image_src.mode, self.__image_src.size)
|
||||
self._calc_block_size()
|
||||
self._check_copy_orig_image()
|
||||
self._solve_matrix()
|
||||
|
||||
def _check_copy_orig_image(self):
|
||||
if self.need_copy_orig:
|
||||
self.__image_dst.paste(self.__image_src)
|
||||
|
||||
def _calc_block_size(self):
|
||||
if self.__multiply <= 1:
|
||||
self.__block_width = int(self.__image_src.size[0] / self.__x)
|
||||
self.__block_height = int(self.__image_src.size[1] / self.__y)
|
||||
else:
|
||||
self.__block_width = self.__multiply * int(self.__image_src.size[0] / self.__y / self.__multiply)
|
||||
self.__block_height = self.__multiply * int(self.__image_src.size[1] / self.__x / self.__multiply)
|
||||
|
||||
def _src_rect(self, i):
|
||||
row = int(i / self.__x)
|
||||
col = i - row * self.__x
|
||||
x = col * self.__block_width
|
||||
y = row * self.__block_height
|
||||
return x, y, x + self.__block_width, y + self.__block_height
|
||||
|
||||
def _dst_rect(self, i):
|
||||
row = int(self.__matrix[i] / self.__x)
|
||||
col = self.__matrix[i] - row * self.__y
|
||||
x = col * self.__block_width
|
||||
y = row * self.__block_height
|
||||
return x, y, x + self.__block_width, y + self.__block_height
|
||||
|
||||
def _solve_matrix(self):
|
||||
for i in range(self.__x * self.__y):
|
||||
src_rect = self._src_rect(i)
|
||||
dst_rect = self._dst_rect(i)
|
||||
region = self.__image_src.crop(src_rect)
|
||||
self.__image_dst.paste(region, dst_rect)
|
||||
180
manga-py-stable_1.x/manga_py/crypt/sunday_webry_com.py
Normal file
180
manga-py-stable_1.x/manga_py/crypt/sunday_webry_com.py
Normal file
@@ -0,0 +1,180 @@
|
||||
from PIL import Image
|
||||
|
||||
|
||||
# DO NOT SEE HERE! IT WORKED!
|
||||
|
||||
|
||||
class MatrixSunday:
|
||||
__image_src = None
|
||||
__image_dst = None
|
||||
|
||||
def de_scramble(self, path_src: str, path_dst: str, data: list):
|
||||
self.__image_src = Image.open(path_src, 'r')
|
||||
self.__process(data)
|
||||
self.__image_dst.save(path_dst)
|
||||
self.__image_src.close()
|
||||
self.__image_dst.close()
|
||||
|
||||
def __process(self, data: list):
|
||||
size_src = self.__image_src.size
|
||||
|
||||
self.__image_dst = Image.new(self.__image_src.mode, size_src)
|
||||
|
||||
for i in data:
|
||||
x, y = i['srcX'] + i['width'], i['srcY'] + i['height']
|
||||
dx, dy = i['destX'] + i['width'], i['destY'] + i['height']
|
||||
|
||||
c1 = i['srcX'] < size_src[0]
|
||||
c2 = i['srcX'] + i['width'] >= 0
|
||||
c3 = i['srcY'] < size_src[1]
|
||||
c4 = i['srcY'] + i['height'] >= 0
|
||||
if c1 and c2 and c3 and c4:
|
||||
region = self.__image_src.crop((i['destX'], i['destY'], dx, dy))
|
||||
self.__image_dst.paste(region, (i['srcX'], i['srcY'], x, y))
|
||||
|
||||
|
||||
class SundayWebryCom: # pragma: no cover
|
||||
_result = None
|
||||
|
||||
def solve_by_img(self, src: str, element_width: int, element_height: int, n: int):
|
||||
img = Image.open(src)
|
||||
sizes = img.size
|
||||
img.close()
|
||||
return self.solve(*sizes, element_width, element_height, n)
|
||||
|
||||
def solve(self, width: int, height: int, element_width: int, element_height: int, n: int):
|
||||
e = width
|
||||
t = height
|
||||
r = element_width
|
||||
i = element_height
|
||||
|
||||
y = int(e / r)
|
||||
g = int(t / i)
|
||||
f = e % r
|
||||
b = t % i
|
||||
self._result = []
|
||||
|
||||
s = y - 43 * n % y
|
||||
if s % y == 0:
|
||||
s = (y - 4) % y
|
||||
|
||||
a = g - 47 * n % g
|
||||
if a % g == 0:
|
||||
a = (g - 4) % g
|
||||
if 0 == a:
|
||||
a = g - 1
|
||||
|
||||
self.def1(f, b, s, r, a, i)
|
||||
|
||||
self.def2(y, i, n, a, s, f, r, g, b)
|
||||
|
||||
if f > 0:
|
||||
self.def3(g, n, s, a, y, b, i, r, f)
|
||||
|
||||
self.def4(y, g, n, r, f, s, a, i, b)
|
||||
|
||||
return self._result
|
||||
|
||||
def def1(self, f, b, s, r, a, i):
|
||||
if f > 0 and b > 0:
|
||||
o = s * r
|
||||
u = a * i
|
||||
self._result.append({
|
||||
'srcX': o,
|
||||
'srcY': u,
|
||||
'destX': o,
|
||||
'destY': u,
|
||||
'width': f,
|
||||
'height': b,
|
||||
# 'debug': 1
|
||||
})
|
||||
|
||||
def def2(self, y, i, n, a, s, f, r, g, b):
|
||||
for l in range(y):
|
||||
d = self._calc_x_x(l, y, n)
|
||||
h = self._calc_y_x(d, s, a, g, n)
|
||||
c = self._calc_pos_rest(d, s, f, r)
|
||||
p = h * i
|
||||
o = self._calc_pos_rest(l, s, f, r)
|
||||
u = a * i
|
||||
self._result.append({
|
||||
'srcX': o,
|
||||
'srcY': u,
|
||||
'destX': c,
|
||||
'destY': p,
|
||||
'width': r,
|
||||
'height': b,
|
||||
# 'debug': 2
|
||||
})
|
||||
|
||||
def def3(self, g, n, s, a, y, b, i, r, f):
|
||||
for m in range(g):
|
||||
h = self._calc_y_y(m, g, n)
|
||||
d = self._calc_x_y(h, s, a, y, n)
|
||||
p = self._calc_pos_rest(h, a, b, i)
|
||||
u = self._calc_pos_rest(m, a, b, i)
|
||||
self._result.append({
|
||||
'srcX': s * r,
|
||||
'srcY': u,
|
||||
'destX': d * r,
|
||||
'destY': p,
|
||||
'width': f,
|
||||
'height': i,
|
||||
# 'debug': 3
|
||||
})
|
||||
|
||||
def def4(self, y, g, n, r, f, s, a, i, b):
|
||||
for l in range(y):
|
||||
for m in range(g):
|
||||
d = (l + 29 * n + 31 * m) % y
|
||||
h = (m + 37 * n + 41 * d) % g
|
||||
c = d * r + (f if d >= self._calc_x_y(h, s, a, y, n) else 0)
|
||||
p = h * i + (b if h >= self._calc_y_x(d, s, a, g, n) else 0)
|
||||
o = l * r + (f if l >= s else 0)
|
||||
u = m * i + (b if m >= a else 0)
|
||||
self._result.append({
|
||||
'srcX': o,
|
||||
'srcY': u,
|
||||
'destX': c,
|
||||
'destY': p,
|
||||
'width': r,
|
||||
'height': i,
|
||||
# 'debug': 4
|
||||
})
|
||||
|
||||
@staticmethod
|
||||
def _calc_pos_rest(e, t, r, i):
|
||||
m = 0
|
||||
if e >= t:
|
||||
m = r
|
||||
return e * i + m
|
||||
|
||||
@staticmethod
|
||||
def _calc_x_x(e, t, r):
|
||||
return (e + 61 * r) % t
|
||||
|
||||
@staticmethod
|
||||
def _calc_x_y(e, t, r, i, n):
|
||||
o = (n % 2 == 1)
|
||||
if (e < r and o) or (e >= r and not o):
|
||||
a = i - t
|
||||
s = t
|
||||
else:
|
||||
a = t
|
||||
s = 0
|
||||
return (e + 67 * n + t + 71) % a + s
|
||||
|
||||
@staticmethod
|
||||
def _calc_y_x(e, t, r, i, n):
|
||||
o = (n % 2 == 1)
|
||||
if (e < t and o) or (e >= t and not o):
|
||||
a = r
|
||||
s = 0
|
||||
else:
|
||||
a = i - r
|
||||
s = r
|
||||
return (e + 53 * n + 59 * r) % a + s
|
||||
|
||||
@staticmethod
|
||||
def _calc_y_y(e, t, r):
|
||||
return (e + 73 * r) % t
|
||||
77
manga-py-stable_1.x/manga_py/crypt/viz_com.py
Normal file
77
manga-py-stable_1.x/manga_py/crypt/viz_com.py
Normal file
@@ -0,0 +1,77 @@
|
||||
import re
|
||||
from typing import List, Optional, Tuple
|
||||
from PIL import Image
|
||||
from sys import stderr
|
||||
|
||||
|
||||
WIDTH = 256
|
||||
HEIGHT = 257
|
||||
KEY = 42016
|
||||
|
||||
class VizComMatrix:
|
||||
@classmethod
|
||||
def solve_image(cls, path: str, metadata: dict) -> Optional[Image.Image]:
|
||||
orig = Image.open(path) # type: Image.Image
|
||||
new_size = (orig.size[0] - 90, orig.size[1] - 140)
|
||||
ref = Image.new(orig.mode, new_size) # type: Image.Image
|
||||
ref.paste(orig)
|
||||
|
||||
exif = orig._getexif()
|
||||
if KEY in exif:
|
||||
key = [int(i, 16) for i in exif[KEY].split(':')]
|
||||
width, height = exif[WIDTH], exif[HEIGHT]
|
||||
else:
|
||||
key = []
|
||||
width, height = metadata['width'], metadata['height']
|
||||
small_width = int(width / 10)
|
||||
small_height = int(height / 15)
|
||||
|
||||
cls.paste(ref, orig, (
|
||||
0, small_height + 10,
|
||||
small_width, height - 2 * small_height,
|
||||
), (
|
||||
0, small_height,
|
||||
small_width, height - 2 * small_height,
|
||||
))
|
||||
|
||||
cls.paste(ref, orig, (
|
||||
0, 14 * (small_height + 10),
|
||||
width, orig.height - 14 * (small_height + 10),
|
||||
), (
|
||||
0, 14 * small_height,
|
||||
width, orig.height - 14 * (small_height + 10),
|
||||
))
|
||||
|
||||
cls.paste(ref, orig, (
|
||||
9 * (small_width + 10), small_height + 10,
|
||||
small_width + (width - 10 * small_width), height - 2 * small_height,
|
||||
), (
|
||||
9 * small_width, small_height,
|
||||
small_width + (width - 10 * small_width), height - 2 * small_height,
|
||||
))
|
||||
|
||||
for i, j in enumerate(key):
|
||||
cls.paste(ref, orig, (
|
||||
(i % 8 + 1) * (small_width + 10), (int(i / 8) + 1) * (small_height + 10),
|
||||
small_width, small_height,
|
||||
), (
|
||||
(j % 8 + 1) * small_width, (int(j / 8) + 1) * small_height,
|
||||
small_width, small_height,
|
||||
))
|
||||
|
||||
return ref
|
||||
|
||||
@classmethod
|
||||
def paste(cls, ref: Image.Image, orig: Image.Image, orig_box: Tuple, ref_box: Tuple):
|
||||
ref.paste(orig.crop((
|
||||
int(orig_box[0]), int(orig_box[1]),
|
||||
int(orig_box[0] + orig_box[2]), int(orig_box[1] + orig_box[3]),
|
||||
)), (
|
||||
int(ref_box[0]), int(ref_box[1]),
|
||||
int(ref_box[0] + ref_box[2]), int(ref_box[1] + ref_box[3]),
|
||||
))
|
||||
|
||||
|
||||
solve = VizComMatrix().solve_image
|
||||
|
||||
__all__ = ['solve']
|
||||
Reference in New Issue
Block a user