Как декодировать eexec файла шрифта?

У меня есть файл шрифта .pfa, и я хотел бы прочитать "алгоритм" для рендеринга шрифта. Однако большая часть информации скрыта в двоичном виде в строке:

currentfile eexec
743F8413F3636CA85A9FFEFB50B4BB27302A5F6C876586CCC1670A7EF5521E6ADE15AAB4
DD2DDDB83735311FC63DB80D2C96AECFA05BB67F865EA35934B4B79A203A8DD489B09C79
FF6EB9DBCFD889C3E73F8C94BC342AF671D6F688870A62EE1A0DF216E150FFEC64A8C2B7
509AD05C011599C1AD84E6C4B668E07EA219BD72663D8AF4CA8EC8E23AA90DE90BE940C6
6DB849CEDB3B64961365A7CCE47F4FC9E30FDEE4B14B90C2E0D8C344EBC974EABF417B3D
28251A78ACEE2BFC4212B1E3E9C7EBC3262821EE98E538713C64DF0BC13C19337B1307DB
D795D285F959C924FC14AEF7E9D406406CDEE1A35377887A16B13DD51717A86284369FA7
6ABB6A4488B9174A561DA854C33821F3172E4CF956EC9B65F829D69E02BC0EE23044DB1D
9A4D45A14A3998115BEE5DDC582F158DB2E..................

Как нам «расшифровать» эту информацию?


person Pacerier    schedule 23.03.2013    source источник
comment
Это описано в Adobe Type 1, Font Format, публикации Adobe Systems доступно в Интернете.   -  person Henry    schedule 23.03.2013
comment
Да, но сначала нам нужно расшифровать закодированную информацию. Когда я декодирую 743F8413F3636CA85A9FFEFB50B4BB.... в ascii, я получаю t?�ócl¨Z�þûP´»'0*_l�e�ÌÁg......... Я делаю что-то не так?   -  person Pacerier    schedule 23.03.2013
comment
Взгляните на главу 7 Шифрование   -  person Henry    schedule 23.03.2013
comment
Некоторая информация об этом содержится в PS Insider Secrets Дона Ланкастера (tinaja.com/post01.shtml).   -  person luser droog    schedule 24.03.2013


Ответы (4)


Если вы действительно не хотите написать свою собственную расшифровку eexec, а затем свою собственную расшифровку charstring, я предлагаю вам просто использовать t1disasm. Если вы работаете в дистрибутиве Linux, вы можете найти пакет для t1utils, который должен содержать это, или вы можете получить исходный код в нескольких местах (Google — ваш друг), вот один:

http://freepcb.googlecode.com/svn/clibpdf/trunk/util/t1utils-1.9/t1disasm.c

Если вы работаете в Windows, вы можете поискать здесь пакет t1utils для WIndows:

http://gnuwin32.sourceforge.net/packages/t1utils.htm

person KenS    schedule 23.03.2013
comment
+1 Я совершенно забыл о том, что для OP нависла проблема с чартерной строкой. Мой ответ не предлагает никакой помощи. - person luser droog; 27.03.2013

Я нашел этот документ очень полезным в расшифровке шифрования eexec. Простой пример в python с использованием упомянутого там кода.

#Getting the eexec binary, make sure you exclude the ascii part in the end, after the binary portion 
text = open('fontfile.pfa').read()
raw_hex = text.split('eexec')[1]
decarr = list()
count = 0
hex_code = str()

#Converting pairs of the hexadecimal digits to decimal, e.g. ff -> 255, and storing it in an array decarr
for i in range(len(raw_hex)):
    if raw_hex[i] == '\n':
        decarr.append(raw_hex[i])
        continue
    else:
        hex_code = hex_code + raw_hex[i]
        count += 1
        if count == 2:
            decarr.append(int(hex_code, 16))
            count = 0
            hex_code = str()

Получив массив десятичных эквивалентов пар шестнадцатеричных цифр, мы выполняем расшифровку, как указано в главе 7 Спецификация формата шрифта Adobe Type 1. Константы указаны в спецификации.

c1 = 52845
c2 =  22719
R = 55665
p = list()
for i in range(0,len(decarr)):
    if decarr[i] is not '\n':
        p.append(decarr[i]^(R >> 8))
        R = ((decarr[i] + R)*c1 + c2) & ((1 << 16) - 1)
    else:
        p.append(decarr[i])
decrypted = list()
for i in range(len(p)):
    if p[i] is not '\n':
        decrypted.append(chr(p[i]))
    else:
        decrypted.append(p[i])

Надеюсь, поможет!

person Samyak Jain    schedule 14.11.2017

Я думаю, что ответ KenS лучше, но, как любопытство, вот функция emacs, которая выполняет расшифровку exec бинарного ввода (т. Е. Без расшифровки шестнадцатеричного ввода и без расшифровки строки символов). Алгоритм взят из документа в ответе Генри.

(defun eexec-decrypt ()
  "decrypt eexec binary block (see Type1 font);
   NB: no charstring decryption"
  (interactive)
  (search-forward "currentfile eexec")(forward-char 1)
  (with-output-to-temp-buffer (concat (buffer-name) "-eexec-decripted")
    (setq r 55665)
    (setq c1 52845)
    (setq c2 22719)
    (setq here (point))
    (setq count 4)
    (while (< here (point-max)) ; I'm not really sure where to stop...
      (setq cipher (get-byte here))
      (setq plain (logxor cipher (lsh r -8)))
      (cond ((> count 0) ; skip first 4 bytes
         (setq count (- count 1)))
        (t (princ (byte-to-string plain))))

      (setq r (mod (+ c2 (* c1 (+ cipher r))) 65536))
      (setq here (+ 1 here)))))
person Matteo Gamboz    schedule 17.07.2014

Что было действительно приятно, так это то, что любой терпеливый семиклассник мог с листа прочитать файл eexec!

Просто вставьте случайный символ и просмотрите свой стек и отчет об ошибках. Повторяйте каждые несколько десятков символов.

Вроде голосовой ответ сейфа "попробуй три клика влево".

person Don Lancaster    schedule 06.02.2019
comment
это комментарий а не ответ - person Vega; 06.02.2019