2016-12-13 3 views
0

Я новичок в этой области, вы мне поможете? Каждый байт в моем шифрованном тексте (encrypt3) интерпретируется как целое число от 0 до 255. Для каждого байта Plaintext = Ciphertext -100 (mod 256). В следующем коде у меня есть ошибка: newbyte = c.to_bytes (1, byteorder = sys.byteorder, signed = False) OverflowError: невозможно преобразовать отрицательный int в unsigned Любая помощь будет оценена.Криптография с питоном

import sys 
f=open("encrypt3.dat","rb") 
s=f.read(100) 
d=bytearray(s) 
print (len(d)) 
strnew='' 
newbyte=b'' 
for c in d : 
    c=c-100 % 256 
    newbyte=c.to_bytes(1,byteorder=sys.byteorder,signed=True) 
    strnew=strnew + newbyte.decode('latin1') 

print(strnew) 
+0

Вы фактически используете байтовый Цезарский шифр. Чтобы перейти от Цезарного шифра, посмотрите на [Vigenère] (https://en.wikipedia.org/wiki/Vigenère_cipher) или, возможно, [RC4] (https://en.wikipedia.org/wiki/RC4) для вашего следующего исследования шифрования. Вы преуспели в реализации байт-реализации, а не на основе алфавита. – rossum

ответ

0

Оператор модуля (%) обрабатывается перед оператором вычитания (-), поэтому ваше заявление c=c-100 % 256 эквивалентно в c=c-(100 % 256), или просто c=c-100 (потому что 100 % 256 == 100). В результате ваш код будет разбиваться, когда он сталкивается с символом с кодом ASCII менее 100 (= 'd').

Вы можете исправить это, изменив c=c-100 % 256 на c=(c-100) % 256.

Читайте также: operator precedence in Python 3.

Смежные вопросы