亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

在 python 中加密然后解密相同的字符串

在 python 中加密然后解密相同的字符串

ibeautiful 2022-08-02 16:53:11
問題是:在密碼學中,簡單的替換密碼是一種加密方法,其中短語的每個字母都被不同的字母或字母序列替換。然后,可以通過執行替換的反函數來解密該短語。在這個問題中,我們將實現一個簡單的替換密碼,其中字符(字母,數字或特殊符號)被00和99(包括)之間的兩位數字替換。例如,可以將字母“a”加密為數字“06”,或者特殊符號“!”可以設置為數字“57”。我們將使用字典來存儲每個字符與其相應的加密形式之間的映射。也就是說,字典的密鑰將是常規字符(字母,數字和特殊符號),值將是字符的加密形式(和 之間的兩位數數字)。0099您的代碼應針對此問題實現以下五個函數。名稱:創建密碼字典參數:無參數。返回值:一種字典,其中每個鍵都是一個常規字符,每個值都是介于 00 和 99 之間的隨機兩位數(包括 00 和 99)。它應該做什么:在提供給您的代碼的頂部,定義了字符串。此字符串包含應成為字典中鍵的所有字母、數字和特殊符號。您必須遍歷此字符串,并在每個字符之間和為每個字符生成一個兩位數的隨機數。兩位數將是字典中的值;每個字符(鍵)將有一個兩位數(值)。LETTERS0099請注意,數字 0, 1, 2, ..., 9 不應該是值;相反,它們應該是數字00,01,02,...,09。此外,請注意,每個字符都應具有唯一的隨機數。也就是說,如果字符“a”映射到值“57”,則其他任何字符都不應映射到值“57”。(您需要使用某種循環來繼續生成新的隨機數,直到找到唯一的隨機數。名稱:加密參數:字符串 。s返回值:字符串 s 的加密版本。原始字符串 s 的每個字符都應替換為密碼字典中相應的兩位數字。名稱: 解密參數:字符串 。返回值:字符串 s 的解密版本。加密字符串 s 的每個兩位數應替換為密碼字典中的相應字符。請注意,在這里,我們有加密的形式(字典中的值),并且正在尋找常規字符(字典中的密鑰7)。為此,我們需要使用類中看到的反向查找函數。此功能已在隨附的 encryption.py 文件中提供給您。s我們將編寫另外兩個函數來增加加密的強度。一個函數將多次重復加密字符串。另一個函數將嘗試解密字符串,而不知道它被加密的次數(從而破壞了更強的加密點)。名稱:多次加密參數:一個字符串和整數值,表示加密字符串的次數。sn返回值:字符串加密時間。也就是說,字符串將首次加密,每個字符轉換為其兩位數表示形式。然后,加密的字符串將被重新加密,每個數字都變成其兩位數的表示形式。(因此,每次加密后,字符串的長度將加倍。(提示:您必須多次調用加密函數。sn名稱:多次解密參數:字符串 。s返回值:字符串 的解密版本 。由于我們不知道解密字符串的次數,因此我們將繼續對字符串調用decrypt,直到字符串包含英語中的常用單詞。encryption.py 文件中為您提供了常用詞(常用詞)的列表。如果在解密一次后,字符串包含此列表中的任何單詞,則應立即返回解密的字符串。否則,請繼續對字符串調用 decrypt,直到它包含其中一個常用詞。(我們假設完全解密的字符串將始終包含至少一個常用詞。s最后,在文件 encryption.py 結束時,您會注意到已經為您編寫的一些代碼。此代碼要求用戶輸入一個字符串,然后調用各種函數并打印它們返回的內容(以生成下面看到的示例)。您必須更改此代碼,以便如果用戶輸入的字符串不包含“常用詞”列表中的任何單詞,則程序應輸出“無效輸入”,而不是執行其余代碼。否則,程序應繼續執行其余代碼。(提示:回想一下作業 1 和 if/else 分支。
查看完整描述

2 回答

?
瀟瀟雨雨

TA貢獻1833條經驗 獲得超4個贊

你可以試試這個:


LETTERS = 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ1234567890!@#$%^&*()`~-=_+[]{}|;\':",./<>? '


def create_cypher_dictionary():

    numbers = [ '%02d' % i for i in range(100) ]

    random.shuffle( numbers )

    return { a : b for a,b in zip( LETTERS, numbers ) }


def encrypt( cypher, string ) :

    return ''.join( cypher[ch] for ch in string )


def decrypt( cypher, string ) :

    inverse_cypher = { b : a for a,b in cypher.items() }

    return ''.join( inverse_cypher[a+b] for a,b in zip(*[iter(string)]*2) )

檢查:


>>> cypher = create_cypher_dictionary()

>>> encoded = encrypt( cypher, 'The quick brown fox jumps over the lazy dog' )

>>> encoded

'93684236886025540636378012826636001276363960074903361250428036306842367064856536261211'

>>> decrypt( cypher, encoded )

'The quick brown fox jumps over the lazy dog'

>>> 

是的,你不能每次都創建密碼,你必須做一個,然后重用它,否則你的結果會有點隨機=)


查看完整回答
反對 回復 2022-08-02
?
達令說

TA貢獻1821條經驗 獲得超6個贊

您一次只采用一位數字來錯誤地轉換 ASCII,而此時您應采用兩位數字。只需在解密函數中更改 for 循環的步驟:


def decrypt(s):

    cypher=create_cypher_dictionary()


    new_s=''

    for i in range(0,len(s)-1,2): # Make the for loop step 2 instead of 1 (default)

        c=s[i]+s[i+1]

        for cc in cypher:

            if cypher[cc]==c:

                new_s=new_s+cc


    return new_s


查看完整回答
反對 回復 2022-08-02
  • 2 回答
  • 0 關注
  • 217 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號