如何在python中顺序更改字符串?

时间:2014-03-26 16:25:36

标签: python string generator sequence des

我正在尝试为DES上的暴力攻击编写一个程序,键是一个由8位字符组成的字符串,例如(12345678)。

所以我需要一些帮助来编写一个程序,我可以将测试键设置为(00000000)并开始逐步循环(00000001),(00000002)直到(99999999)并且每次尝试按键。

我已经完成了DES程序,现在我的大脑仍然坚持这部分。

更新:非常感谢Hyperboreus,对于密钥生成器函数,但是当我在我的程序中使用它时,我收到错误消息

  

UnicodeDecodeError:'utf-8'编解码器无法解码位置1的字节0xbf:无效的起始字节

任何大于(00000002)的键

这是我的代码

from Crypto.Cipher import DES 
import os 
import base64

print ("key size is fixed at 16 Bytes including parities (56 bits effective)")
size = 16

key = '00000002'
cipher = DES.new(key)            
BS = 8


def getMode():
    while True:
        mode = input('Do you wish to Encrypt "e", Decrypt "d" or Brute force "b" a message?\n')
        if mode in 'e d b'.split():
            return mode
        else:
            print('Enter either "e" for encrypt,"d" for decrypt, or "b" for brute force.\n')


def encrypt(text):
    length = len(plaintext)
    pad = lambda s: s + (BS - len(s) % BS) * ('~')
    paddedtext = pad(plaintext)
    encrypted = DES.new(key, DES.MODE_ECB)
    ciphertext = base64.b64encode(encrypted.encrypt(paddedtext)).decode("utf-8")
    return ciphertext


def decrypt(text):
    decrypted = DES.new(key, DES.MODE_ECB)
    paddedtext = decrypted.decrypt(base64.b64decode(cipher)).decode("utf-8")
    l = paddedtext.count ('~')
    return paddedtext[:len(paddedtext)-l]


def brute(text):
     text2 = input("enter a part of the plain text: ")

    def testkeys ():
        for i in range (100000000):
            yield '{:08d}'.format (i)

    for testkey in testkeys ():
        testkey = format (testkey)
        decrypted = DES.new(testkey, DES.MODE_ECB)
        paddedtext = decrypted.decrypt(base64.b64decode(cipher)).decode("utf-8")
        if paddedtext.find(text2) != -1:
            print ("the key is ",testkey)
            l = paddedtext.count ('~')
            return paddedtext[:len(paddedtext)-l]
            break

mode = getMode()

print ("key is:", key)

if mode[0] == 'e':
    plaintext = input("Enter the plaintext: ")
    encrypted = encrypt(plaintext)
    print ("encrypted:\n", encrypted)

elif mode [0] == 'd':
    cipher = input("Enter the ciphertext: ")
    decrypted = decrypt(cipher)
    print ("decrypted:\n", decrypted)

else:
    cipher = input("Enter the ciphertext: ")
    brute = brute(cipher)
    print ("decrypted:\n", brute)

一旦我解决了这个问题,下一步就是将字母表(大写和小写)合并到键中

1 个答案:

答案 0 :(得分:5)

字符串是不可变的,因此您无法更改它们。但是你可以生成所有想要的字符串。

def keys ():
    for i in range (100000000):
        yield '{:08d}'.format (i)

for key in keys ():
    print ('Testing key {}.'.format (key) )
    #test the key