我正在尝试为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)
一旦我解决了这个问题,下一步就是将字母表(大写和小写)合并到键中
答案 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