2014-02-18 77 views
0

重複(即我還沒有發現在回答): https://stackoverflow.com/questions/4066361/how-to-obfuscate-python-code How do I protect Python code?加密/解密方法Python腳本用C

所以我看着這兩個上面的鏈接的^^我沒有發現任何有用的實際加密蟒蛇腳本和/或模糊python代碼。所以,我是新來的C,但在python經歷,如果我想開發商業Python項目我最好的想法是這樣的:

創建c腳本和加密&編譯python腳本 C腳本需要簡單地提供一個字符串加密密鑰並對其進行解密。僅供參考,實際上從未嘗試加密,我知道這不會是完美的。但我不需要完美。我只是想讓反編譯我的python源代碼變得更加困難,意識到這仍然很容易,但不容易。

我目前正在查看Cython,並且我可以很容易地生成一個* .c文件,現在該如何將其編譯爲二進制文件? (與視覺工作室)

那麼我怎麼能加密我的Python代碼,並從C腳本解密它(我可以編譯爲二進制使它顯着更難編輯)?

+7

這種慾望只會導致痛苦。解放它吧。 – zwol

+1

如果您打算使用C腳本解密它,反正用戶最終不會通過C腳本獲得未加密的副本? –

+1

由於您只想給好奇的讀者帶來不便,我建議使用最簡單的加密方法:將所有零置換爲零,將零置零。按0xFF對每個字節進行異或應該做到這一點。作爲額外的好處,加密方案與解密方案相同,與其他方案相比節省了50%的工作量。 – Kevin

回答

0

一看Nuitka項目。這是一個python編譯器,它將Python腳本編譯爲使用libpython運行的本機可執行代碼。

http://nuitka.net/

+0

我還沒有嘗試這個,因爲我需要在我的Windows開發平臺上獲得視覺工作室,但這看起來像只是我需要的東西 – pianist1119

+0

好吧,我剛安裝Visual Studio Express 2013從[這裏](http://www.visualstudio.com/en-us/downloads/)和我的nuitka沒有檢測到它:scons:警告:沒有版本的Visual Studio編譯器發現... – pianist1119

1

這裏是我會做:

1)創建一個C腳本產生一密鑰,並將其存儲到一個文本文件

2)拿起鑰匙,並立即刪除運行Python時的文本文件

3)使用密鑰解密Python代碼中非常重要的部分(確保沒有這些位會破壞腳本)然後將其全部導入

4)立即重新加密重要的Python位,並刪除.pyc文件

這將是不可戰勝的,但你確定這一點。

加密和重新加密你的Python位,試試這個代碼:

from hashlib import md5 
from Crypto.Cipher import AES 
from Crypto import Random 

def encrypt(in_file, out_file, password, key_length=32): 
    bs = AES.block_size 
    salt = Random.new().read(bs - len('Salted__')) 
    key, iv = derive_key_and_iv(password, salt, key_length, bs) 
    cipher = AES.new(key, AES.MODE_CBC, iv) 
    out_file.write('Salted__' + salt) 
    finished = False 
    while not finished: 
     chunk = in_file.read(1024 * bs) 
     if len(chunk) == 0 or len(chunk) % bs != 0: 
      padding_length = (bs - len(chunk) % bs) or bs 
      chunk += padding_length * chr(padding_length) 
      finished = True 
     out_file.write(cipher.encrypt(chunk)) 

def decrypt(in_file, out_file, password, key_length=32): 
    bs = AES.block_size 
    salt = in_file.read(bs)[len('Salted__'):] 
    key, iv = derive_key_and_iv(password, salt, key_length, bs) 
    cipher = AES.new(key, AES.MODE_CBC, iv) 
    next_chunk = '' 
    finished = False 
    while not finished: 
     chunk, next_chunk = next_chunk, cipher.decrypt(in_file.read(1024 * bs)) 
     if len(next_chunk) == 0: 
      padding_length = ord(chunk[-1]) 
      chunk = chunk[:-padding_length] 
      finished = True 
     out_file.write(chunk) 

所以總結一下,這裏的一些僞代碼:

def main(): 
    os.system("C_Executable.exe") 

    with open("key.txt",'r') as f: 
     key = f.read() 

    os.remove("key.txt") 


    #Calls to decrpyt files which look like this: 
    with open("Encrypted file name"), 'rb') as in_file, open("unecrypted file name"), 'wb') as out_file: 
     decrypt(in_file, out_file, key) 

     os.remove("encrypted file name") 

    import fileA, fileB, fileC, etc 

    global fileA, fileB, fileC, etc 

    #Calls to re-encrypt files and remove unencrypted versions along with .pyc files using a similar scheme to decryption calls 

    #Whatever else you want 

但只是壓力和重要的一點,

Python不是爲此而製作的!它意味着開放和自由!

如果在這個節骨眼上,沒有其他替代發現自己,你應該只使用不同的語言

+0

「Python不是爲這!它意味着開放和自由!「我意識到這一點,但我真的不能改變語言。就像我說的那樣,它不一定是完美的 – pianist1119

+0

對,這就是爲什麼我給你一個正確的答案! – wnnmaw

+0

當然,這將適用於執行的Python代碼,但我仍然需要一個C腳本,並且像我說的那樣對我來說是新的c – pianist1119

0

爲什麼你覺得有必要加密/解密你沒有解釋。答案可能會大大改變提供的任何建議。

例如,假設您正在嘗試保護知識產權,但是就像在python中編寫代碼的方便程度一樣。如果這是你的動機,可以考慮cython - http://cython.org

但是讓我們假設你更關心安全性(即:防止某人在未經用戶許可的情況下更改您的代碼)。在這種情況下,您可以考慮某種嵌入式加載程序,在調用嵌入式Python解釋程序之前對您的python源進行校驗。

我敢肯定,你可能想要加密的還有其他一些原因。

+0

這是一個好點,但它的評論,而不是一個答案 – wnnmaw

+0

其實 - 建議cython是我的答案。有了警告,如果不是保護IP,它可能無法實現他的目標。 – user590028

+0

好吧,但我怎樣才能建立一個二進制與cython?它給了我一個c文件(一堆)庫 – pianist1119