2016-12-29 43 views
1

我一直在一個項目工作了一段時間,這裏發生了什麼事我的代碼如何獲得python XOR來解密多行字符串?

例如,如果我的代碼是:

code = """ 
def mymath(number): 
    return number + 2 

print mymath(5) 
""" 
print code 
exec(code) 

工作正常,但是當我加密信息python只打印出/執行一行代碼?

code = """NikTUSIgBxwMFB5aSSkaLDApB1h1THk= 
cmxVUSE0HhYKB1ISQXViSw== 
X0Y= 
Ij4cHzthHhUbHRFYDSRHcntBfw== 
""" 
print decrypt(code) 
exec(decrypt(code)) 

這只是打印:

==== RESTART: 
def mathcalc(number): 


>>> 

最後,這是我破碎完整的代碼,如果你需要看它:

from Crypto.Cipher import XOR 
import base64 

def encrypt(plaintext): 
    cipher = XOR.new('RLuqOAstour9aGoA') 
    return base64.b64encode(cipher.encrypt(plaintext)) 

def decrypt(ciphertext): 
    cipher = XOR.new('RLuqOAstour9aGoA') 
    return cipher.decrypt(base64.b64decode(ciphertext)) 


#Code stores the encrypted information 
code = """NikTUSIgBxwMFB5aSSkaLDApB1h1THk= 
cmxVUSE0HhYKB1ISQXViSw== 
X0Y= 
Ij4cHzthHhUbHRFYDSRHcntBfw== 
""" 
print decrypt(code) 
exec(code) 

我怎麼可能會蟒蛇做到這一點與所有的代碼行?我希望它能夠使用exec()函數來執行。

+0

'XOR'是什麼意思?請提供完整的工作示例,重現您的問題。包含正確的導入。 –

+0

我加了相關的進口,對此抱歉。它來自crypto軟件包 –

回答

1

看起來,創建code時,base64將您的Python代碼逐行編碼。不要這樣做。 base64 encoding並不意味着要一塊一塊地工作,而是將一個完整的數據塊編碼爲一個單一的單元,所以當解碼器看到在每行末尾出現的=符號時,它認爲它已到達末尾,並且存在精光。

解決這個正確的方法是回到原來的代碼,並在同一時間將整個字符串傳遞到Base64編碼,而不是一條線。將其用於code。最後只能得到等號。

但是,如果你發現自己在這種情況下,你沒有足夠的原始數據,你可以申請以base64解碼,並通過線路解密線,像這樣:

[XOR.new(key).decrypt(base64.b64decode(e)) for e in code.splitlines()] 

其中key是加密密鑰。

+0

當您說「將整個字符串傳遞給base64編碼器時,不只一行一行」。你什麼意思? –

+0

沒關係,我編碼整個東西,並打印出來正確。但是exec()現在不起作用,它返回「None」? –

+0

啊,等等,沒關係,看起來這只是因爲我使用exec和eval錯誤,愚蠢的錯誤! –