代码图片中 vigdes.py 的第 63 行对应于上面的错误
下面附上的代码:在这里,我正在尝试为使用 LSTM 的 DES 加密数据扩展 vigenere 密码分析模型。我修改了 des.py 脚本以扩展 DES 密码分析模型,但是当我尝试加载 des 加密数据以训练模型时,我不断收到此 UnicodeError。我已经尝试了针对给定错误在线提到的所有现有解决方案。请帮我修复这个错误。几周以来,我一直在解决这个模型的各种错误。
维德斯.py -
import copy
import numpy as np
from bitstring import Bits
import pyDes
import sys
import gzip
class vigdes():
def __init__(self, alphabet, tsteps, key_len):
self.A = alphabet
self.key_len = key_len
self.wordlen = tsteps - key_len
def change_tsteps(self, tsteps):
self.wordlen = tsteps - self.key_len
def encode(self, key, plain):
cipher = ''
key='DESCRYPT'
key.encode('utf-8')
print("length of key: ", len(key));
k = pyDes.des(key, pyDes.CBC, "\0\0\0\0\0\0\0\0", pad=None, padmode=pyDes.PAD_PKCS5)
data = plain
d = k.encrypt(data)
cipher = d
print("des cipher: ", cipher)
return cipher
def decode(self, key, cipher):
plain = ''
k = pyDes.des(key, pyDes.CBC, "\0\0\0\0\0\0\0\0", pad=None, padmode=pyDes.PAD_PKCS5)
plain = k.decrypt(cipher).decode()
print("des plain: ", plain)
return plain
def rands(self, size):
ix = np.random.randint(len(self.A) ,size=size)
return ''.join([self.A[i] for i in ix])
def one_hot(self, s):
_A = copy.deepcopy(self.A) + '-'
ix = [_A.find(l) for l in s]
z = np.zeros((len(s) ,len(_A)))
z[range(len(s)) ,ix] = 1
return z
def next_batch(self, batch_size, verbose=False):
batch_X = [] ; batch_y = [] ; batch_Xs = [] ; batch_ks = [] ; batch_ys = []
for _ in range(batch_size):
ys = self.rands(self.wordlen)
ks = self.rands(np.random.randint(self.key_len) + 1)
# lets us check for overfitting later
while ks == 'KEY':
ks_ = ks
ks = self.rands(np.random.randint(self.key_len) + 1)
print('warning! key was "{}" but now is "{}"'.format(ks_, ks))
Xs = self.encode(ks, ys)
ks += '- ' *(self.key_len - len(ks))
if verbose: print( Xs, ks, ys )
#remove
xstr=str(Xs,'utf-8');
X = self.one_hot(ks + xstr)
#X = self.one_hot(ks + Xs)
y = self.one_hot(ks + ys)
batch_X.append(X)
batch_y.append(y)
batch_Xs.append(Xs) ; batch_ks.append(ks) ; batch_ys.append(ys)
if not verbose:
return (batch_X ,batch_y)
else:
return (batch_X, batch_y, batch_Xs, batch_ks, batch_ys)
主文件
import numpy as np
import os
os.environ['TF_CPP_MIN_LOG_LEVEL']='2'
import tensorflow as tf
import os
from stacked_rnn import StackedRNN
MEM_SIZES = [32, 64, 128, 256, 512] # use for vigenere ciphers
tf.app.flags.DEFINE_bool("train", True, "Run the train loop (else eval model)")
tf.app.flags.DEFINE_bool("vary_mem", False, "Trainpip --downg0c this model repeatedly for different memory sizes")
tf.app.flags.DEFINE_integer("key_len", 8, "Maximum length of key for encoding/decoding message")
tf.app.flags.DEFINE_integer("tsteps", 20, "Number of timesteps for backpropagation")
tf.app.flags.DEFINE_integer("rnn_size", 256, "Number of hidden units in the rnn")
tf.app.flags.DEFINE_integer("ncells", 1, "Number of recurrent cells to stack")
tf.app.flags.DEFINE_integer("batch_size", 50, "Size of batch in minibatch gradient descent")
tf.app.flags.DEFINE_integer("save_every", 1000, "Save model after this number of train steps")
tf.app.flags.DEFINE_integer("total_steps", 250000, "Total number of training steps")
tf.app.flags.DEFINE_integer("print_every", 100, "Print training info after this number of train steps")
tf.app.flags.DEFINE_integer("acc_every", 500, "Print/save accuracy info after this number of train steps")
tf.app.flags.DEFINE_float("dropout", 1.0, "Dropout for the last (full-connected) layer")
tf.app.flags.DEFINE_float("lr", 5e-4, "Learning rate (alpha) for the model")
tf.app.flags.DEFINE_string("cipher", "vigdes", 'Type of cipher to solve. ')
tf.app.flags.DEFINE_string("meta_dir", "", 'META_DIR')
tf.app.flags.DEFINE_string("save_dir", "", 'META_DIR')
tf.app.flags.DEFINE_string("A", "ABCDEFGHIJKLMNOPQRSTUVWXYZ", "Alphabet to use for polyalphabetic cipher")
FLAGS = tf.app.flags.FLAGS
##### interpret user input #####
ciphers = ["vigenere", "DES","vigdes"]
if FLAGS.cipher not in ciphers:
raise NotImplementedError('only {} ciphers are implemented'.format(ciphers))
CRACK_MODE = FLAGS.cipher not in ciphers[:3]
print("Crack mode: {}".format(CRACK_MODE))
if CRACK_MODE:
from crack_train_utils import *
else:
from train_utils import *
##### make cipher dataloader #####
data = None
if FLAGS.cipher == ciphers[0]:
from vigenere import Vigenere
data = Vigenere(FLAGS.A, tsteps=FLAGS.tsteps, key_len=FLAGS.key_len)
elif FLAGS.cipher == ciphers[1]:
from DES import DES
data = DES(FLAGS.A, tsteps=FLAGS.tsteps, key_len=FLAGS.key_len)
elif FLAGS.cipher == ciphers[2]:
from vigdes import vigdes
data = vigdes(FLAGS.A, tsteps=FLAGS.tsteps, key_len=FLAGS.key_len)
elif FLAGS.cipher == ciphers[3]:
from crack_vigenere import CrackVigenere
data = CrackVigenere(FLAGS.A, tsteps=FLAGS.tsteps, key_len=FLAGS.key_len)
elif FLAGS.cipher == ciphers[4]:
from crack_autokey import CrackAutokey
data = CrackAutokey(FLAGS.A, tsteps=FLAGS.tsteps, key_len=FLAGS.key_len)
def get_model(FLAGS):
global CRACK_MODE
model = StackedRNN(FLAGS=FLAGS, crack_mode=CRACK_MODE)
model.count_params()
return model
def eval_model(FLAGS, model, data, log):
# evaluate model (quantitatively first, then qualitatively)
print('plotting (check ./{} directory)...'.format(FLAGS.meta_dir))
plot_stats(log, FLAGS)
global_step = model.try_load_model()
print( "accuracy is: {:3f}%".format(accuracy(model,data)) )
sample(model, data, FLAGS)
# train model
if not FLAGS.vary_mem and FLAGS.train:
# make bookkeping devices
FLAGS.meta_dir = 'meta/' + FLAGS.cipher +'/' # directory to save loss history, figures, etc.
FLAGS.save_dir = 'save/' + FLAGS.cipher +'/' # directory to save model
os.makedirs(FLAGS.save_dir) if not os.path.exists(FLAGS.save_dir) else None
os.makedirs(FLAGS.meta_dir) if not os.path.exists(FLAGS.meta_dir) else None
log = Logger(FLAGS)
# train model
model = get_model(FLAGS)
train(model, data, log, FLAGS)
elif FLAGS.train:
for m in MEM_SIZES:
FLAGS.rnn_size = m # change rnn memory size
# make bookkeping devices
FLAGS.meta_dir = 'meta/' + FLAGS.cipher +'-{}/'.format(m) # directory to save loss history, figures, etc.
FLAGS.save_dir = 'save/' + FLAGS.cipher +'-{}/'.format(m) # directory to save model
os.makedirs(FLAGS.save_dir) if not os.path.exists(FLAGS.save_dir) else None
os.makedirs(FLAGS.meta_dir) if not os.path.exists(FLAGS.meta_dir) else None
log = Logger(FLAGS)
# train as usual
model = get_model(FLAGS)
train(model, data, log, FLAGS)
eval_model(FLAGS, model, data, log)
elif not FLAGS.vary_mem and not FLAGS.train:
# make bookkeping devices
FLAGS.meta_dir = 'meta/' + FLAGS.cipher + '/' # directory to save loss history, figures, etc.
FLAGS.save_dir = 'save/' + FLAGS.cipher + '/' # directory to save model
os.makedirs(FLAGS.save_dir) if not os.path.exists(FLAGS.save_dir) else None
os.makedirs(FLAGS.meta_dir) if not os.path.exists(FLAGS.meta_dir) else None
print(FLAGS.meta_dir) ; print(FLAGS.save_dir)
log = Logger(FLAGS)
model = get_model(FLAGS)
eval_model(FLAGS, model, data, log)