ineptpdf 6

This commit is contained in:
Anonymous 2010-02-16 21:16:23 +00:00 committed by Apprentice Alf
parent 6c70a073d9
commit 26a54dd3d6
1 changed files with 51 additions and 36 deletions

View File

@ -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,20 +1171,31 @@ 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)
keynotfound = 1
for keyder in keyderlist:
key = ASN1Parser([ord(x) for x in keyder]) key = ASN1Parser([ord(x) for x in keyder])
key = [bytesToNumber(key.getChild(x).value) for x in xrange(1, 4)] key = [bytesToNumber(key.getChild(x).value) for x in xrange(1, 4)]
try:
rsa = RSA.construct(key) rsa = RSA.construct(key)
except Exception:
continue
length = int_value(param.get('Length', 0)) / 8 length = int_value(param.get('Length', 0)) / 8
rights = str_value(param.get('ADEPT_LICENSE')).decode('base64') rights = str_value(param.get('ADEPT_LICENSE')).decode('base64')
rights = zlib.decompress(rights, -15) rights = zlib.decompress(rights, -15)
rights = etree.fromstring(rights) rights = etree.fromstring(rights)
expr = './/{http://ns.adobe.com/adept}encryptedKey' expr = './/{http://ns.adobe.com/adept}encryptedKey'
bookkey = ''.join(rights.findtext(expr)).decode('base64') bookkey = ''.join(rights.findtext(expr)).decode('base64')
try:
bookkey = rsa.decrypt(bookkey) bookkey = rsa.decrypt(bookkey)
except Exception:
continue
if bookkey[0] != '\x02': if bookkey[0] != '\x02':
raise ADEPTError('error decrypting book session key') keynotfound = 1
continue
else:
keynotfound = 0
index = bookkey.index('\0') + 1 index = bookkey.index('\0') + 1
bookkey = bookkey[index:] bookkey = bookkey[index:]
ebx_V = int_value(param.get('V', 4)) ebx_V = int_value(param.get('V', 4))
@ -1202,6 +1214,9 @@ class PDFDocument(object):
self.genkey = self.genkey_v3 if V == 3 else self.genkey_v2 self.genkey = self.genkey_v3 if V == 3 else self.genkey_v2
self.decipher = self.decrypt_rc4 self.decipher = self.decrypt_rc4
self.ready = True 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)