ineptpdf 6
This commit is contained in:
parent
6c70a073d9
commit
26a54dd3d6
87
ineptpdf.pyw
87
ineptpdf.pyw
|
@ -1,6 +1,6 @@
|
||||||
#! /usr/bin/python
|
#! /usr/bin/python
|
||||||
|
|
||||||
# ineptpdf5.pyw, version 5
|
# ineptpdf.pyw, version 6
|
||||||
|
|
||||||
# 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
|
||||||
|
@ -13,7 +13,7 @@
|
||||||
# 3 - Correctly handle PDF >=1.5 cross-reference streams
|
# 3 - Correctly handle PDF >=1.5 cross-reference streams
|
||||||
# 4 - Removal of ciando's personal ID (anon)
|
# 4 - Removal of ciando's personal ID (anon)
|
||||||
# 5 - removing small bug with V3 ebooks (anon)
|
# 5 - removing small bug with V3 ebooks (anon)
|
||||||
|
# 6 - changed to adeptkey4.der format for 1.7.2 support (anon)
|
||||||
"""
|
"""
|
||||||
Decrypt Adobe ADEPT-encrypted PDF files.
|
Decrypt Adobe ADEPT-encrypted PDF files.
|
||||||
"""
|
"""
|
||||||
|
@ -34,6 +34,7 @@ import Tkinter
|
||||||
import Tkconstants
|
import Tkconstants
|
||||||
import tkFileDialog
|
import tkFileDialog
|
||||||
import tkMessageBox
|
import tkMessageBox
|
||||||
|
import pickle
|
||||||
|
|
||||||
try:
|
try:
|
||||||
from Crypto.Cipher import ARC4
|
from Crypto.Cipher import ARC4
|
||||||
|
@ -1170,38 +1171,52 @@ class PDFDocument(object):
|
||||||
|
|
||||||
def initialize_ebx(self, password, docid, param):
|
def initialize_ebx(self, password, docid, param):
|
||||||
self.is_printable = self.is_modifiable = self.is_extractable = True
|
self.is_printable = self.is_modifiable = self.is_extractable = True
|
||||||
with open(password, 'rb') as f:
|
with open(password, '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])
|
||||||
length = int_value(param.get('Length', 0)) / 8
|
key = [bytesToNumber(key.getChild(x).value) for x in xrange(1, 4)]
|
||||||
rights = str_value(param.get('ADEPT_LICENSE')).decode('base64')
|
try:
|
||||||
rights = zlib.decompress(rights, -15)
|
rsa = RSA.construct(key)
|
||||||
rights = etree.fromstring(rights)
|
except Exception:
|
||||||
expr = './/{http://ns.adobe.com/adept}encryptedKey'
|
continue
|
||||||
bookkey = ''.join(rights.findtext(expr)).decode('base64')
|
length = int_value(param.get('Length', 0)) / 8
|
||||||
bookkey = rsa.decrypt(bookkey)
|
rights = str_value(param.get('ADEPT_LICENSE')).decode('base64')
|
||||||
if bookkey[0] != '\x02':
|
rights = zlib.decompress(rights, -15)
|
||||||
raise ADEPTError('error decrypting book session key')
|
rights = etree.fromstring(rights)
|
||||||
index = bookkey.index('\0') + 1
|
expr = './/{http://ns.adobe.com/adept}encryptedKey'
|
||||||
bookkey = bookkey[index:]
|
bookkey = ''.join(rights.findtext(expr)).decode('base64')
|
||||||
ebx_V = int_value(param.get('V', 4))
|
try:
|
||||||
ebx_type = int_value(param.get('EBX_ENCRYPTIONTYPE', 6))
|
bookkey = rsa.decrypt(bookkey)
|
||||||
# added because of the booktype / decryption book session key error
|
except Exception:
|
||||||
if ebx_V == 3:
|
continue
|
||||||
V = 3
|
if bookkey[0] != '\x02':
|
||||||
elif ebx_V < 4 or ebx_type < 6:
|
keynotfound = 1
|
||||||
V = ord(bookkey[0])
|
continue
|
||||||
bookkey = bookkey[1:]
|
else:
|
||||||
else:
|
keynotfound = 0
|
||||||
V = 2
|
index = bookkey.index('\0') + 1
|
||||||
if length and len(bookkey) != length:
|
bookkey = bookkey[index:]
|
||||||
raise ADEPTError('error decrypting book session key')
|
ebx_V = int_value(param.get('V', 4))
|
||||||
self.decrypt_key = bookkey
|
ebx_type = int_value(param.get('EBX_ENCRYPTIONTYPE', 6))
|
||||||
self.genkey = self.genkey_v3 if V == 3 else self.genkey_v2
|
# added because of the booktype / decryption book session key error
|
||||||
self.decipher = self.decrypt_rc4
|
if ebx_V == 3:
|
||||||
self.ready = True
|
V = 3
|
||||||
|
elif ebx_V < 4 or ebx_type < 6:
|
||||||
|
V = ord(bookkey[0])
|
||||||
|
bookkey = bookkey[1:]
|
||||||
|
else:
|
||||||
|
V = 2
|
||||||
|
if length and len(bookkey) != length:
|
||||||
|
raise ADEPTError('error decrypting book session key')
|
||||||
|
self.decrypt_key = bookkey
|
||||||
|
self.genkey = self.genkey_v3 if V == 3 else self.genkey_v2
|
||||||
|
self.decipher = self.decrypt_rc4
|
||||||
|
self.ready = True
|
||||||
|
break
|
||||||
|
if keynotfound == 1:
|
||||||
|
raise ADEPTError('problem decrypting session key')
|
||||||
return
|
return
|
||||||
|
|
||||||
PASSWORD_PADDING = '(\xbfN^Nu\x8aAd\x00NV\xff\xfa\x01\x08..' \
|
PASSWORD_PADDING = '(\xbfN^Nu\x8aAd\x00NV\xff\xfa\x01\x08..' \
|
||||||
|
@ -1657,8 +1672,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