Форум программистов, компьютерный форум, киберфорум
Python
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.80/5: Рейтинг темы: голосов - 5, средняя оценка - 4.80
3 / 3 / 1
Регистрация: 14.12.2012
Сообщений: 395

Поправка файла из 2 в 3 Python

12.09.2016, 14:05. Показов 1039. Ответов 16
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Здравствуйте! Есть код, который, я подозреваю, написан на Python2.

Python
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
import crypto
import sys
sys.modules['Crypto'] = crypto
from Crypto.Hash import SHA256
from Crypto.Cipher import AES
import os, random, sys, pkg_resources
 
 
def encrypt(key, filename):
    chunksize = 64 * 1024
    outFile = os.path.join(os.path.dirname(filename), "(encrypted)" + os.path.basename(filename))
    filesize = str(os.path.getsize(filename)).zfill(16)
    IV = ''
 
    for i in range(16):
        IV += chr(random.randint(0, 0xFF))
 
    encryptor = AES.new(key, AES.MODE_CBC, IV)
 
    with open(filename, "rb") as infile:
        with open(outFile, "wb") as outfile:
            outfile.write(filesize)
            outfile.write(IV)
            while True:
                chunk = infile.read(chunksize)
 
                if len(chunk) == 0:
                    break
 
                elif len(chunk) % 16 != 0:
                    chunk += ' ' * (16 - (len(chunk) % 16))
 
                outfile.write(encryptor.encrypt(chunk))
 
 
def decrypt(key, filename):
    outFile = os.path.join(os.path.dirname(filename), os.path.basename(filename[11:]))
    chunksize = 64 * 1024
    with open(filename, "rb") as infile:
        filesize = infile.read(16)
        IV = infile.read(16)
 
        decryptor = AES.new(key, AES.MODE_CBC, IV)
 
        with open(outFile, "wb") as outfile:
            while True:
                chunk = infile.read(chunksize)
                if len(chunk) == 0:
                    break
 
                outfile.write(decryptor.decrypt(chunk))
 
            outfile.truncate(int(filesize))
 
 
def allfiles():
    allFiles = []
    for root, subfiles, files in os.walk(os.getcwd()):
        for names in files:
            allFiles.append(os.path.join(root, names))
 
    return allFiles
 
 
choice = input("Do you want to (E)ncrypt or (D)ecrypt? ")
password = input("Enter the password: ")
password = password.encode('utf-8')
 
encFiles = allfiles()
 
if choice == "E":
    for Tfiles in encFiles:
        if os.path.basename(Tfiles).startswith("(encrypted)"):
            print("%s is already encrypted" % str(Tfiles))
            pass
 
        elif Tfiles == os.path.join(os.getcwd(), sys.argv[0]):
            pass
        else:
            encrypt(SHA256.new(password).digest(), str(Tfiles))
            print("Done encrypting %s" % str(Tfiles))
            os.remove(Tfiles)
 
 
elif choice == "D":
    filename = input("Enter the filename to decrypt: ")
    if not os.path.exists(filename):
        print("The file does not exist")
        sys.exit(0)
    elif not filename.startswith("(encrypted)"):
        print("%s is already not encrypted" % filename)
        sys.exit()
    else:
        decrypt(SHA256.new(password).digest(), filename)
        print("Done decrypting %s" % filename)
        os.remove(filename)
 
else:
    print("Please choose a valid command.")
    sys.exit()
Подскажите пожалуйста, что я делаю не так? У меня 3-й Python.
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
12.09.2016, 14:05
Ответы с готовыми решениями:

Чтение базы из файла и поправка программы
Задание следующее: напишите на Visual Prolog 5.2 программу (используя внутреннюю базу данных), позволяющую спрашивать у пользователя,...

Создание exe файла из файла python для работы на компьютере, где нет Python
В ходе работы использую python 3.8, библиотеку pyodbc, драйвер ODBC Driver 17 for SQL Server. На отдельном компьютере нет возможности...

Поправка макроса
Добрый день. Люди добрые. Я хотел поправить файл с макросом, но не получилось. Может кто-нибудь помочь? Я хотель добавить тип...

16
35 / 32 / 16
Регистрация: 21.01.2014
Сообщений: 102
12.09.2016, 14:13
Это таки третий Питон...
0
3 / 3 / 1
Регистрация: 14.12.2012
Сообщений: 395
12.09.2016, 14:37  [ТС]
Пожалуйста, подскажите где у меня ошибка. Можете попробовать запустить. Увидите.
0
2742 / 2341 / 620
Регистрация: 19.03.2012
Сообщений: 8,830
12.09.2016, 14:45
Цитата Сообщение от Oklahoma28place Посмотреть сообщение
Подскажите пожалуйста, что я делаю не так? У меня 3-й Python.
Может ты расскажешь для начала в чем у тебя проблема?

В общем полный traceback ошибки в студию
0
3 / 3 / 1
Регистрация: 14.12.2012
Сообщений: 395
12.09.2016, 15:42  [ТС]
Всё работает. Но на этапе ввода пароля ошибка. У меня писало что-то про encode. Потом после строчки ввода пароля я добавил:

Python
1
password = password.encode('utf-8')
И появилась ошибка:

ValueError: IV must be 16 bytes long

Подскажите что не так? Пожалуйста.
0
2742 / 2341 / 620
Регистрация: 19.03.2012
Сообщений: 8,830
12.09.2016, 17:55
Oklahoma28place, у меня нет ошибки такой, если хочешь нормальный ответ, то выкладывай ПОЛНЫЙ traceback и пример входных данных, на которых ошибка возникает.
0
3 / 3 / 1
Регистрация: 14.12.2012
Сообщений: 395
12.09.2016, 22:08  [ТС]
Вот выходные данные:

Code
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
C:\Users\i.sokolov\PycharmProjects\Encrypt>python encrypt.py
Do you want to (E)ncrypt or (D)ecrypt? E
Enter the password: test
Traceback (most recent call last):
  File "encrypt.py", line 80, in <module>
    encrypt(SHA256.new(password).digest(), str(Tfiles))
  File "encrypt.py", line 18, in encrypt
    encryptor = AES.new(key, AES.MODE_CBC, IV)
  File "C:\Users\i.sokolov\AppData\Local\Programs\Python\Python35-32\lib\site-packages\crypto\Cipher\AES.py", line 95, in new
    return AESCipher(key, *args, **kwargs)
  File "C:\Users\i.sokolov\AppData\Local\Programs\Python\Python35-32\lib\site-packages\crypto\Cipher\AES.py", line 59, in __init__
    blockalgo.BlockAlgo.__init__(self, _AES, key, *args, **kwargs)
  File "C:\Users\i.sokolov\AppData\Local\Programs\Python\Python35-32\lib\site-packages\crypto\Cipher\blockalgo.py", line 141, in __init__
    self._cipher = factory.new(key, *args, **kwargs)
ValueError: IV must be 16 bytes long
0
2742 / 2341 / 620
Регистрация: 19.03.2012
Сообщений: 8,830
12.09.2016, 22:27
Ну вот, оказывается, ошибка то совсем в другом месте, а не там где ты до этого говорил.
0
3 / 3 / 1
Регистрация: 14.12.2012
Сообщений: 395
12.09.2016, 23:09  [ТС]
Так что тут не так? Подскажите пожалуйста.
0
2742 / 2341 / 620
Регистрация: 19.03.2012
Сообщений: 8,830
12.09.2016, 23:39
На сколько я помню длина шифруемой строки не может быть ниже определенной длины, то есть длина должна быть кратнка определенной длинны. Твое решение это найти в доке минимальную длину блока и дополнять строку до этого размера.

А вообще пароли правильней в виде хэша хранить.
0
3 / 3 / 1
Регистрация: 14.12.2012
Сообщений: 395
13.09.2016, 15:18  [ТС]
То есть, я так понимаю, 16? Пароль я должен вводить из 16 символов? Я ввожу, но не получается.

Добавлено через 38 секунд
И тут не строку он шифрует, а файл. У меня пароль не получается ввести.

Добавлено через 15 часов 36 минут
Вот теперь мой код:

Python
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
from Crypto.Hash import SHA256
from Crypto.Cipher import AES
import os, random, sys, pkg_resources
 
 
def encrypt(key, filename):
    chunksize = 64 * 1024
    outFile = os.path.join(os.path.dirname(filename), "(encrypted)" + os.path.basename(filename))
    filesize = str(os.path.getsize(filename)).zfill(16)
    IV = ''
 
    for i in range(16):
        IV += chr(random.randint(0, 0xFF))
    IV = b'1234567890123456'
 
    encryptor = AES.new(key, AES.MODE_CBC, IV)
 
    with open(filename, "rb") as infile:
        with open(outFile, "wb") as outfile:
            outfile.write(filesize.encode())
            outfile.write(IV)
            while True:
                chunk = infile.read(chunksize)
 
                if len(chunk) == 0:
                    break
 
                elif len(chunk) % 16 != 0:
                    chunk += b' ' * (16 - (len(chunk) % 16))
 
                outfile.write(encryptor.encrypt(chunk))
 
 
def decrypt(key, filename):
    outFile = os.path.join(os.path.dirname(filename), os.path.basename(filename[11:]))
    chunksize = 64 * 1024
    with open(filename, "rb") as infile:
        filesize = infile.read(16).decode()
        IV = infile.read(16)
 
        decryptor = AES.new(key, AES.MODE_CBC, IV)
 
        with open(outFile, "wb") as outfile:
            while True:
                chunk = infile.read(chunksize)
                if len(chunk) == 0:
                    break
 
                outfile.write(decryptor.decrypt(chunk))
 
            outfile.truncate(int(filesize))
 
 
def allfiles():
    allFiles = []
    for root, subfiles, files in os.walk(os.getcwd()):
        for names in files:
            allFiles.append(os.path.join(root, names))
 
    return allFiles
 
 
choice = input("Do you want to (E)ncrypt or (D)ecrypt? ")
password = input("Enter the password: ")
password = password.encode('utf-8')
 
encFiles = allfiles()
 
if choice == "E":
    for Tfiles in encFiles:
        if os.path.basename(Tfiles).startswith("(encrypted)"):
            print("%s is already encrypted" % str(Tfiles))
            pass
 
        elif Tfiles == os.path.join(os.getcwd(), sys.argv[0]):
            pass
        else:
            encrypt(SHA256.new(password).digest(), str(Tfiles))
            print("Done encrypting %s" % str(Tfiles))
            os.remove(Tfiles)
 
 
elif choice == "D":
    filename = input("Enter the filename to decrypt: ")
    if not os.path.exists(filename):
        print("The file does not exist")
        sys.exit(0)
    elif not filename.startswith("(encrypted)"):
        print("%s is already not encrypted" % filename)
        sys.exit()
    else:
        decrypt(SHA256.new(password).digest(), filename)
        print("Done decrypting %s" % filename)
        os.remove(filename)
 
else:
    print("Please choose a valid command.")
    sys.exit()
Я сделал через env.

Но он шифрует все файлы в папке. А мне нужно, чтобы я выбирал файл, который хочу зашифровать и расшифровать.
0
2742 / 2341 / 620
Регистрация: 19.03.2012
Сообщений: 8,830
13.09.2016, 16:19
Python
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
import os
import sys
import random
 
from Crypto.Hash import SHA256
from Crypto.Cipher import AES
 
 
def encrypt(key, filename):
    chunksize = 64 * 1024
    outFile = '{}.encrypted'.format(filename)
    print(outFile)
    filesize = str(os.path.getsize(filename)).zfill(16)
    IV = ''
 
    for i in range(16):
        IV += chr(random.randint(0, 0xFF))
    IV = b'1234567890123456'
 
    encryptor = AES.new(key, AES.MODE_CBC, IV)
 
    with open(filename, "rb") as infile:
        with open(outFile, "wb") as outfile:
            outfile.write(filesize.encode())
            outfile.write(IV)
            while True:
                chunk = infile.read(chunksize)
 
                if len(chunk) == 0:
                    break
 
                elif len(chunk) % 16 != 0:
                    chunk += b' ' * (16 - (len(chunk) % 16))
 
                outfile.write(encryptor.encrypt(chunk))
 
 
def decrypt(key, filename):
    outFile = os.path.join(os.path.dirname(filename), os.path.basename(filename[11:]))
    chunksize = 64 * 1024
    with open(filename, "rb") as infile:
        filesize = infile.read(16).decode()
        IV = infile.read(16)
 
        decryptor = AES.new(key, AES.MODE_CBC, IV)
 
        with open(outFile, "wb") as outfile:
            while True:
                chunk = infile.read(chunksize)
                if len(chunk) == 0:
                    break
 
                outfile.write(decryptor.decrypt(chunk))
 
            outfile.truncate(int(filesize))
 
 
while True:
    target_file = input('Input path to file: ')
    if not os.path.exists(target_file):
        print('File not exists')
    else:
        break
 
while True:
    action = input("Do you want to (E)ncrypt or (D)ecrypt? ").upper()
    if action not in ('E', 'D'):
        print("Please choose a valid command. E or D")
    else:
        break
 
password = input("Enter the password: ").encode('utf-8')
 
if action == "E":
    if os.path.basename(target_file).startswith("(encrypted)"):
        print("file {} is not encrypted".format(target_file))
        exit()
    else:
        encrypt(SHA256.new(password).digest(), target_file)
        print("Done encrypting {}".format(target_file))
 
elif action == "D":
    if not target_file.endswith(".encrypted"):
        print("{} is already not encrypted".format(target_file))
        sys.exit()
    else:
        decrypt(SHA256.new(password).digest(), target_file)
        print("Done decrypting {}".format(target_file))
Вот как ты мог написать код шифрования всех файлов, а для 1 выбранного не смог!?
1
3 / 3 / 1
Регистрация: 14.12.2012
Сообщений: 395
13.09.2016, 16:24  [ТС]
Спасибо большое. Буду сидеть и разбираться. Хочу попробовать чтобы он дополнительных файлов не создавал.

Добавлено через 58 секунд
Про то, что я смог написать и не смог. Я этот код взял на сайте одном. Хотел повозиться с ним, понять. Я только начинаю изучение Python. И тяжело пошло, потому что тема не для новичков.
0
2742 / 2341 / 620
Регистрация: 19.03.2012
Сообщений: 8,830
13.09.2016, 16:25
Oklahoma28place, то что ты не осилил тебя для самых начинающих.
0
3 / 3 / 1
Регистрация: 14.12.2012
Сообщений: 395
13.09.2016, 16:45  [ТС]
То есть этот ко для самых начинающих?
0
2742 / 2341 / 620
Регистрация: 19.03.2012
Сообщений: 8,830
13.09.2016, 16:46
Ввод данных и проверка файла на существование, да. Ты сейчас на этом споткнулся и не смог сам встать.
0
3 / 3 / 1
Регистрация: 14.12.2012
Сообщений: 395
14.09.2016, 08:22  [ТС]
Ну я только начал изучать Python. До этого не программировал ни на одном языке.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
14.09.2016, 08:22
Помогаю со студенческими работами здесь

Поправка в коде
Здравствуйте дорогие форумчане! Это опять я, горе дипломник. Я к вам уже обращалась зимой и весной при подготовке диплома. И вот, вчера...

Нужна поправка
здравствуйте.поправьте,пожалуйста, моё убожество.написал сначала функциями.а нужно в ооп. объектами не могу написать (не дружу я с ними:()...

Поправка программы
Есть вот такой вот код #include &lt;iostream&gt; #include &lt;conio.h&gt; #include &lt;stdio.h&gt; #include &lt;math.h&gt; using namespace std; int...

Требуется поправка
Подскажите, пожалуйста, что не так? Нужно умножить две квадратные матрицы друг на друга. Размерность матрицы должна вводиться с клавиатуры....

Поправка кода
Привет всем. Прошу мне помочь поправить код. Заранее спосибо тем кто откликнулса Private Sub Cbo1_AfterUpdate() Dim...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
17
Ответ Создать тему
Новые блоги и статьи
Модель здравосоХранения 6. ESG-повестка и устойчивое развитие; углублённый анализ кадрового бренда
anaschu 31.03.2026
В прикрепленном документе раздумья о том, как можно поменять модель в будущем
10 пpимет, которые всегда сбываются
Maks 31.03.2026
1. Чтобы, наконец, пришла маршрутка, надо закурить. Если сигарета последняя, маршрутка придет еще до второй затяжки даже вопреки расписанию. 2. Нaдоели зима и снег? Не надо переезжать. Достаточно. . .
Перемещение выделенных строк ТЧ из одного документа в другой
Maks 31.03.2026
Реализация из решения ниже выполнена на примере нетипового документа "ВыдачаОборудованияНаСпецтехнику" с единственной табличной частью "ОборудованиеИКомплектующие" разработанного в конфигурации КА2. . . .
Functional First Web Framework Suave
DevAlt 30.03.2026
Sauve. IO Апнулись до NET10. Из зависимостей один пакет, работает одинаково хорошо как в режиме проекта так и в интерактивном режиме. из сложностей - чисто функциональный подход. Решил. . .
Автоматическое создание документа при проведении другого документа
Maks 29.03.2026
Реализация из решения ниже выполнена на нетиповых документах, разработанных в конфигурации КА2. Есть нетиповой документ "ЗаявкаНаРемонтСпецтехники" и нетиповой документ "ПланированиеСпецтехники". В. . .
Настройка движения справочника по регистру сведений
Maks 29.03.2026
Решение ниже реализовано на примере нетипового справочника "ТарифыМобильнойСвязи" разработанного в конфигурации КА2, с целью учета корпоративной мобильной связи в коммерческом предприятии. . . .
Автозаполнение реквизита при выборе элемента справочника
Maks 27.03.2026
Программный код из решения ниже на примере нетипового документа "ЗаявкаНаРемонтСпецтехники" разработанного в конфигурации КА2. При выборе "Спецтехники" (Тип Справочник. Спецтехника), заполняется. . .
Сумматор с применением элементов трёх состояний.
Hrethgir 26.03.2026
Тут. https:/ / fips. ru/ EGD/ ab3c85c8-836d-4866-871b-c2f0c5d77fbc Первый документ красиво выглядит, но без схемы. Это конечно не даёт никаких плюсов автору, но тем не менее. . . всё может быть. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru