[英]Python 3.4 Encrypter and Decrypter not working
我正在編寫一個python程序來加密和解密自定義字符串。 這不會用於任何嚴重的事情,只是為了好玩。 加密器似乎可以正常工作,但是這里是加密器。 該程序將所有內容寫入文件。 如下面的代碼所示,如果密鑰(由用戶定義)將其置於127以上,則程序將循環ASCII字符。
我的問題是解密時會出現一些奇怪的字符。 使用229以上的密鑰時失敗。
加密:
temp_key = 9999
message = "Hello"
result = ""
for char in message:
ecry_char_int = ord(char) - temp_key
while ecry_char_int < 0:
temp_key -= 128
ecry_char_int = 128 - temp_key
result += chr(ecry_char_int)
print(result)
解密:
result2 = ""
encoded = result
ekey = 9999
for char in encoded:
decr_char_int = ord(char) + ekey
while decr_char_int > 127:
ekey -= 128
decr_char_int = ekey
result2 += chr(decr_char_int)
print(result2)
例如,使用密鑰9999
加密"Hello"
; 我得到了"qV]]`"
的加密字符串。 用密鑰9999
解密字符串"qV]]`"
,我得到了:
'\x0fello'
我想弄清楚的是我應該如何阻止這種情況的發生,因為這只是發生這種情況的第一個角色。
注意:我不希望/不知道如何安裝任何其他模塊(即密碼學),因為它/主要是在我的學校計算機上開發的。
那是因為您並沒有真正加密任何內容-在第一個字符之后,您的算法會變成簡單的Caesar密碼,在此情況下, temp_key > ord(first_char)
所有條件,第一個字符將始終被“加密”為128 - temp_key % 128
的值temp_key > ord(first_char)
。
問題在於,在初始ecry_char_int = ord(char) - temp_key
,如果碰巧小於鍵,您就不會考慮當前字符(這就是ord('H')
為72
時的情況)您的密鑰是9999
)-您進入循環,您依次從temp_key
減去128,並將128 - temp_key
設置為ecry_char_int
。 最終,當從128
中減去temp_key
時, temp_key
會足夠小以產生一個正數,此時您將把該數設置為“加密”字符。 因此,實際上,您采用了長循環的方式將第一個字符設置為128 - temp_key % 128
(即113
,順便說一句。這就是為什么對於幾乎所有鍵來說,函數中的第一個字符始終為q
的原因>256
)。
但這還不是全部-由於您現在已將temp_key
的值修改為原始的temp_key % 128
(因此9999
鍵為15
),現在所有后續字符都將向左移ascii那個量,導致e
變為V
( chr(ord("e") - 15)
)等。因此-您已經擁有一個凱撒密碼 。
您的解密功能在相反方向上的作用幾乎相同,第一個字符將始終以相同的方式構造,其余字符將按相同位置右移ascii到其原始位置。
幫自己一個忙,如果需要加密,請使用適當的加密。 這是一個簡單的例子 。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.