проблемы реализации с шифром xor - PullRequest
2 голосов
/ 09 ноября 2019

Я пытался переопределить простой шифр 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 ) 

Они оба работают хорошо. НО , с тем же открытым текстом (входной файл) и одинаковой клавишей для обоих приведенных выше кодов они не возвращают одинаковый зашифрованный текст .

Однако они оба хорошо расшифровывают свои соответствующие шифротексты. (имеется в виду тот же открытый текст)

Мой вопрос: почему они не генерируют один и тот же зашифрованный текст, учитывая один и тот же ключ и открытый текст ??

Ответы [ 2 ]

2 голосов
/ 09 ноября 2019

X версия C индивидуальна байт с ключом. В версии Python используются encode() и decode(), которые работают с символами , а не байтами . Попробуйте с акцентированными символами или смайликами вместо символов ASCII, чтобы увидеть разницу.

Более того, условие переноса index до 0 неверно;вы не сравниваете его с длиной ключа.

При этом вопрос скорее о том, как использовать Python, чем о криптографии.

0 голосов
/ 10 ноября 2019

Я сделал очень небольшие изменения и запустил его для версии C, и, похоже, это работает так, как вам хотелось бы:

Я добавил назначение ключа в argv [1] и изменил #ord (x.decode()) в int (x.hex (), 16).

Я расшифровал зашифрованный текст из кода c, и зашифрованный текст выглядит так же, как и сгенерированный python, и вывод был правильным. Я использовал:

cat cypher.txt
Cypher

./a.out key cypher.txt cypher.out
./crypt.py key cypher.out cypher.txt.test

Текст шифра такой же:

$ ./a.out key cypher.txt cypher.out
$cat cypher.out 
(   
        a

$ ./crypt.py key cypher.txt cypher2.out
$ cat cypher2.out 
(   
        a

И обновленный код Python:

#!/usr/local/opt/python3
import sys
def main(argc, argv):
    key=argv[1]
    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()) #int(x.hex(),16) 
        fo.write( chr(x^ord( key[index] )).encode() ) 
        index += 1 
        if index == len(key): index = 0
    fi.close()
    fo.close()  


if __name__ == '__main__':
    # usage: python3.7 simple_xor.py <key> <inputfile> <outputfile>
    main( len(sys.argv), sys.argv ) 
...