2011-02-27 24 views
1

嘿,我一直在努力這一段時間,我可以記住我的兄弟通過這個同樣的算法走過我。自定義Python加密算法

基本上,它只是添加來自鍵和字符的兩個字符的ascii值。

我可以用這個對它進行加密:

def encrypt(key, string): 
    encoded = '' 
    for i in range(len(string)): 
     key_c = ord(key[i % len(key)]) 
     string_c = ord(string[i % len(string)]) 
     encoded += chr((key_c + string_c) % 127) 
    return encoded 

但我似乎無法記住我們所做的事情儘可能解密。它很難扭轉一個模組:P 任何想法?

回答

8

這很簡單,讓我們來看看它是如何工作的。首先,減去密鑰獲得的加密消息。

enc = msg + key (mod 127) 

,我們怎樣才能獲得原始消息這很簡單,在兩側減鍵

enc - key = msg + key - key (mod 127) 

在這裏,我們得到:

enc - key = msg (mod 127) 

欲瞭解更多詳情,請參考Modular arithmetic,我認爲它應屬於group/field/ring之一。我不是數學專家,對於更深入的理論知識,你可以在Number theory找到它們。這裏是精緻代碼:

def encrypt(key, msg): 
    encryped = [] 
    for i, c in enumerate(msg): 
     key_c = ord(key[i % len(key)]) 
     msg_c = ord(c) 
     encryped.append(chr((msg_c + key_c) % 127)) 
    return ''.join(encryped) 

def decrypt(key, encryped): 
    msg = [] 
    for i, c in enumerate(encryped): 
     key_c = ord(key[i % len(key)]) 
     enc_c = ord(c) 
     msg.append(chr((enc_c - key_c) % 127)) 
    return ''.join(msg) 

if __name__ == '__main__': 
    key = 'This_is_my_awsome_secret_key' 
    msg = 'Hello world' 
    encrypted = encrypt(key, msg) 
    decrypted = decrypt(key, encrypted) 

    print 'Message:', repr(msg) 
    print 'Key:', repr(key) 
    print 'Encrypted:', repr(encrypted) 
    print 'Decrypted:', repr(decrypted) 

輸出

Message: 'Hello world' 
Key: 'This_is_my_awsome_secret_key' 
Encrypted: '\x1dNV`O\nkO`fD' 
Decrypted: 'Hello world' 
+0

我將能夠使加密文件只能使用ASCII可打印字符,如果我做的事: CHR((key_c + string_c)%95 + 32) – 2011-03-16 14:50:58

2

解密是相同的,除了減號而不是加號。

0

但是你不需要反轉mod,只需要+ key_c,對不對?因此,只需加128,減去key_c,然後再次模127以保持範圍。 (而不是最後一行時,所有其他行都是一樣的,與加密。