Caesarencrypt and caesarHacker

关于凯撒加密算法和他的暴力破解


 

 

凯撒加密算法是一种不安全的算法:

对字母字符加密

加密过程及结果的字符都是大写,加密前需要将明文转化为大写的字符串

工具为索引轮盘或是St.Cyr滑条,在计算机中即‘ABCDEFGHIJKLMONOPQRSTUVWXYZ’,

密钥匙0到25的一个数字

要用到模运算的思想

简单的、有规律的替换,非常不安全!

 

加密算法:

# Caesar Cipher
# http://inventwithpython.com/hacking (BSD Licensed)

import pyperclip

# the string to be encrypted/decrypted
#message = 'This is my secret message.'
#message = "You can show black is white by argument,' said Filby, 'but you will never convince me."
#message = '1234567890'
#message = "This is still a silly example."
message = '''
{
    // IntelliSense  
    //
    //  https://go.microsoft.com/fwlink/?linkid=830387
    "version": "0.2.0",
    "configurations": [
        {"name":"Python: ","type":"python","request":"launch","program":"${file}","console":"integratedTerminal"},
        {
            "name": "Python: ",
            "type": "python",
            "request": "launch",
            "program": "${file}",
            "console": "integratedTerminal"
        }
    ]
}'''

#message = 'GUVF VF ZL FRPERG ZRFFNTR.'
#message = "'Kv uqwpfu rncwukdng gpqwij.'"
#message = 'Xqp whh ahoa kb pda sknhz swo ejreoexha.'
# the encryption/decryption key
key = 13

# tells the program to encrypt or decrypt
mode = 'encrypt' # set to 'encrypt' or 'decrypt'
#mode = 'decrypt'
# every possible symbol that can be encrypted
LETTERS = 'ABCDEFGHIJKLMNOPQRSTUVWXYZ'

# stores the encrypted/decrypted form of the message
translated = ''

# capitalize the string in message
message = message.upper()

# run the encryption/decryption code on each symbol in the message string
for symbol in message:
    if symbol in LETTERS:
        # get the encrypted (or decrypted) number for this symbol
        num = LETTERS.find(symbol) # get the number of the symbol
        if mode == 'encrypt':
            num = num + key
        elif mode == 'decrypt':
            num = num - key

        # handle the wrap-around if num is larger than the length of
        # LETTERS or less than 0
        if num >= len(LETTERS):
            num = num - len(LETTERS)
        elif num < 0:
            num = num + len(LETTERS)

        # add encrypted/decrypted number's symbol at the end of translated
        translated = translated + LETTERS[num]

    else:
        # just add the symbol without encrypting/decrypting
        translated = translated + symbol

# print the encrypted/decrypted string to the screen
print(translated)

# copy the encrypted/decrypted string to the clipboard   666666    真尼玛离谱
pyperclip.copy(translated)

这边参考了http://inventwithpython.com/hacking/chapters/书籍,密码学之python编程。可以从网上下载其源码

其中pyperclip是希望程序结束后我们能得到这个程序的输出,原理是提供函数可以让程序把文本复制到剪贴板(若未下载注释到这行和import就好)

 

 

破解时遍历25个数值,从结果中分析加密的明文是比较明显、简单的。

# Caesar Cipher Hacker
# http://inventwithpython.com/hacking (BSD Licensed)

#message = 'GUVF VF ZL FRPERG ZRFFNTR.'
'''
message = 'R UXEN VH TRCCH.'                                9
message = 'FR DBMMR EHOXL FX.'                              19
message = "CXPNCQNA FN'AN BX QJYYH."                        9
message = 'OBR OZKOMG QOFSTFSS.'                            14
message = 'PDKQCD IU DAWZ DWO OQOLEYEKJO.'                  22
message = 'FTMF U WQQB GZPQD YK TMF.'                       12
message = 'AR ITMF YUSTF TMBBQZ.'                           12
message = 'DA D NCMVIF OJ OCZ NDUZ JA V MVO.'               21
message = "ZFBI. J'N QSFUUZ TVSF NZ DBU XPVME FBU NF."      1
'''
#this line is for you copy.
message = "ZFBI. J'N QSFUUZ TVSF NZ DBU XPVME FBU NF."

LETTERS = 'ABCDEFGHIJKLMNOPQRSTUVWXYZ'

# loop through every possible key
for key in range(len(LETTERS)):

    # It is important to set translated to the blank string so that the
    # previous iteration's value for translated is cleared.
    translated = ''

    # The rest of the program is the same as the original Caesar program:

    # run the encryption/decryption code on each symbol in the message
    for symbol in message:
        if symbol in LETTERS:
            num = LETTERS.find(symbol) # get the number of the symbol
            num = num - key

            # handle the wrap-around if num is 26 or larger or less than 0
            if num < 0:
                num = num + len(LETTERS)

            # add number's symbol at the end of translated
            translated = translated + LETTERS[num]

        else:
            # just add the symbol without encrypting/decrypting
            translated = translated + symbol

    # display the current key being tested, along with its decryption
    print('Key #%s: %s' % (key, translated))

 

posted @ 2020-08-09 16:24  PiaYie  阅读(192)  评论(0编辑  收藏  举报