Я пытался переопределить простой шифр Xor в книге Applied Cryptography
Protocols, Algorithms, and Source Code in C A book by Bruce Schneier
, используя python. Код можно найти в разделе 1.4 книги.
c код из книги
/* Usage: crypto key input_file output_file */
void main (int argc, char *argv[])
{
FILE *fi, *fo;
char *cp;
int c;
if ((cp = argv[1]) && *cp!='\0') {
if ((fi = fopen(argv[2], "rb")) != NULL) {
if ((fo = fopen(argv[3], "wb")) != NULL) {
while ((c = getc(fi)) != EOF) {
if (!*cp) cp = argv[1];
c ^= *(cp++);
putc(c,fo);
}
fclose(fo);
}
fclose(fi);
}
}
}
моя версия на питоне
import sys
def main(argc, argv):
fi = open(argv[2], 'rb')
fo = open(argv[3], 'wb')
index = 0
while True:
x = fi.read(1)
if not x: break
x = ord(x.decode())
fo.write( chr(x^ord( argv[1][index] )).encode() )
index += 1
if index == len(argv): index = 0
fi.close()
fo.close()
if __name__ == '__main__':
# usage: python3.7 simple_xor.py <key> <inputfile> <outputfile>
main( len(sys.argv), sys.argv )
Они оба работают хорошо. НО , с тем же открытым текстом (входной файл) и одинаковой клавишей для обоих приведенных выше кодов они не возвращают одинаковый зашифрованный текст .
Однако они оба хорошо расшифровывают свои соответствующие шифротексты. (имеется в виду тот же открытый текст)
Мой вопрос: почему они не генерируют один и тот же зашифрованный текст, учитывая один и тот же ключ и открытый текст ??