mirror of
https://github.com/noDRM/DeDRM_tools.git
synced 2024-11-16 19:06:09 +06:00
ineptepub v4
This commit is contained in:
parent
e9a7312759
commit
f0d920c158
|
@ -1,6 +1,6 @@
|
||||||
#! /usr/bin/python
|
#! /usr/bin/python
|
||||||
|
|
||||||
# ineptepub.pyw, version 3
|
# ineptepub.pyw, version 4
|
||||||
|
|
||||||
# To run this program install Python 2.6 from http://www.python.org/download/
|
# To run this program install Python 2.6 from http://www.python.org/download/
|
||||||
# and PyCrypto from http://www.voidspace.org.uk/python/modules.shtml#pycrypto
|
# and PyCrypto from http://www.voidspace.org.uk/python/modules.shtml#pycrypto
|
||||||
|
@ -11,6 +11,7 @@
|
||||||
# 1 - Initial release
|
# 1 - Initial release
|
||||||
# 2 - Rename to INEPT, fix exit code
|
# 2 - Rename to INEPT, fix exit code
|
||||||
# 3 - Add cmd or gui choosing
|
# 3 - Add cmd or gui choosing
|
||||||
|
# 4 - changed to adeptkey4.der format for 1.7.2 support (anon)
|
||||||
|
|
||||||
"""
|
"""
|
||||||
Decrypt Adobe ADEPT-encrypted EPUB books.
|
Decrypt Adobe ADEPT-encrypted EPUB books.
|
||||||
|
@ -31,6 +32,7 @@ import Tkinter
|
||||||
import Tkconstants
|
import Tkconstants
|
||||||
import tkFileDialog
|
import tkFileDialog
|
||||||
import tkMessageBox
|
import tkMessageBox
|
||||||
|
import pickle
|
||||||
|
|
||||||
try:
|
try:
|
||||||
from Crypto.Cipher import AES
|
from Crypto.Cipher import AES
|
||||||
|
@ -194,35 +196,52 @@ def cli_main(argv=sys.argv):
|
||||||
print "usage: %s KEYFILE INBOOK OUTBOOK" % (progname,)
|
print "usage: %s KEYFILE INBOOK OUTBOOK" % (progname,)
|
||||||
return 1
|
return 1
|
||||||
keypath, inpath, outpath = argv[1:]
|
keypath, inpath, outpath = argv[1:]
|
||||||
with open(keypath, 'rb') as f:
|
with open(keypath, 'r') as f:
|
||||||
keyder = f.read()
|
keyderlist = pickle.load(f)
|
||||||
key = ASN1Parser([ord(x) for x in keyder])
|
keynotfound = 1
|
||||||
key = [bytesToNumber(key.getChild(x).value) for x in xrange(1, 4)]
|
for keyder in keyderlist:
|
||||||
rsa = RSA.construct(key)
|
key = ASN1Parser([ord(x) for x in keyder])
|
||||||
with closing(ZipFile(open(inpath, 'rb'))) as inf:
|
key = [bytesToNumber(key.getChild(x).value) for x in xrange(1, 4)]
|
||||||
namelist = set(inf.namelist())
|
try:
|
||||||
if 'META-INF/rights.xml' not in namelist or \
|
rsa = RSA.construct(key)
|
||||||
'META-INF/encryption.xml' not in namelist:
|
except Exception:
|
||||||
raise ADEPTError('%s: not an ADEPT EPUB' % (inpath,))
|
keynotfound = 1
|
||||||
for name in META_NAMES:
|
continue
|
||||||
namelist.remove(name)
|
with closing(ZipFile(open(inpath, 'rb'))) as inf:
|
||||||
rights = etree.fromstring(inf.read('META-INF/rights.xml'))
|
namelist = set(inf.namelist())
|
||||||
adept = lambda tag: '{%s}%s' % (NSMAP['adept'], tag)
|
if 'META-INF/rights.xml' not in namelist or \
|
||||||
expr = './/%s' % (adept('encryptedKey'),)
|
'META-INF/encryption.xml' not in namelist:
|
||||||
bookkey = ''.join(rights.findtext(expr))
|
raise ADEPTError('%s: not an ADEPT EPUB' % (inpath,))
|
||||||
bookkey = rsa.decrypt(bookkey.decode('base64'))
|
for name in META_NAMES:
|
||||||
# Padded as per RSAES-PKCS1-v1_5
|
namelist.remove(name)
|
||||||
if bookkey[-17] != '\x00':
|
rights = etree.fromstring(inf.read('META-INF/rights.xml'))
|
||||||
raise ADEPTError('problem decrypting session key')
|
adept = lambda tag: '{%s}%s' % (NSMAP['adept'], tag)
|
||||||
encryption = inf.read('META-INF/encryption.xml')
|
expr = './/%s' % (adept('encryptedKey'),)
|
||||||
decryptor = Decryptor(bookkey[-16:], encryption)
|
bookkey = ''.join(rights.findtext(expr))
|
||||||
kwds = dict(compression=ZIP_DEFLATED, allowZip64=False)
|
try:
|
||||||
with closing(ZipFile(open(outpath, 'wb'), 'w', **kwds)) as outf:
|
bookkey = rsa.decrypt(bookkey.decode('base64'))
|
||||||
zi = ZipInfo('mimetype', compress_type=ZIP_STORED)
|
except Exception:
|
||||||
outf.writestr(zi, inf.read('mimetype'))
|
keynotfound = 1
|
||||||
for path in namelist:
|
continue
|
||||||
data = inf.read(path)
|
# Padded as per RSAES-PKCS1-v1_5
|
||||||
outf.writestr(path, decryptor.decrypt(path, data))
|
if bookkey[-17] != '\x00':
|
||||||
|
keynotfound = 1
|
||||||
|
inf.close()
|
||||||
|
continue
|
||||||
|
else:
|
||||||
|
keynotfound = 0
|
||||||
|
encryption = inf.read('META-INF/encryption.xml')
|
||||||
|
decryptor = Decryptor(bookkey[-16:], encryption)
|
||||||
|
kwds = dict(compression=ZIP_DEFLATED, allowZip64=False)
|
||||||
|
with closing(ZipFile(open(outpath, 'wb'), 'w', **kwds)) as outf:
|
||||||
|
zi = ZipInfo('mimetype', compress_type=ZIP_STORED)
|
||||||
|
outf.writestr(zi, inf.read('mimetype'))
|
||||||
|
for path in namelist:
|
||||||
|
data = inf.read(path)
|
||||||
|
outf.writestr(path, decryptor.decrypt(path, data))
|
||||||
|
break
|
||||||
|
if keynotfound == 1:
|
||||||
|
raise ADEPTError('problem decrypting session key')
|
||||||
return 0
|
return 0
|
||||||
|
|
||||||
|
|
||||||
|
@ -238,8 +257,8 @@ class DecryptionDialog(Tkinter.Frame):
|
||||||
Tkinter.Label(body, text='Key file').grid(row=0)
|
Tkinter.Label(body, text='Key file').grid(row=0)
|
||||||
self.keypath = Tkinter.Entry(body, width=30)
|
self.keypath = Tkinter.Entry(body, width=30)
|
||||||
self.keypath.grid(row=0, column=1, sticky=sticky)
|
self.keypath.grid(row=0, column=1, sticky=sticky)
|
||||||
if os.path.exists('adeptkey.der'):
|
if os.path.exists('adeptkey4.der'):
|
||||||
self.keypath.insert(0, 'adeptkey.der')
|
self.keypath.insert(0, 'adeptkey4.der')
|
||||||
button = Tkinter.Button(body, text="...", command=self.get_keypath)
|
button = Tkinter.Button(body, text="...", command=self.get_keypath)
|
||||||
button.grid(row=0, column=2)
|
button.grid(row=0, column=2)
|
||||||
Tkinter.Label(body, text='Input file').grid(row=1)
|
Tkinter.Label(body, text='Input file').grid(row=1)
|
||||||
|
|
Loading…
Reference in New Issue
Block a user