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

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

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

Author24 — интернет-сервис помощи студентам
Здравствуйте! Есть код, который, я подозреваю, написан на 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
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
12.09.2016, 14:05
Ответы с готовыми решениями:

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

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

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

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

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

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

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

ValueError: IV must be 16 bytes long

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

Код
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
2740 / 2339 / 620
Регистрация: 19.03.2012
Сообщений: 8,830
12.09.2016, 22:27 8
Ну вот, оказывается, ошибка то совсем в другом месте, а не там где ты до этого говорил.
0
3 / 3 / 1
Регистрация: 14.12.2012
Сообщений: 363
12.09.2016, 23:09  [ТС] 9
Так что тут не так? Подскажите пожалуйста.
0
2740 / 2339 / 620
Регистрация: 19.03.2012
Сообщений: 8,830
12.09.2016, 23:39 10
На сколько я помню длина шифруемой строки не может быть ниже определенной длины, то есть длина должна быть кратнка определенной длинны. Твое решение это найти в доке минимальную длину блока и дополнять строку до этого размера.

А вообще пароли правильней в виде хэша хранить.
0
3 / 3 / 1
Регистрация: 14.12.2012
Сообщений: 363
13.09.2016, 15:18  [ТС] 11
То есть, я так понимаю, 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
2740 / 2339 / 620
Регистрация: 19.03.2012
Сообщений: 8,830
13.09.2016, 16:19 12
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
Сообщений: 363
13.09.2016, 16:24  [ТС] 13
Спасибо большое. Буду сидеть и разбираться. Хочу попробовать чтобы он дополнительных файлов не создавал.

Добавлено через 58 секунд
Про то, что я смог написать и не смог. Я этот код взял на сайте одном. Хотел повозиться с ним, понять. Я только начинаю изучение Python. И тяжело пошло, потому что тема не для новичков.
0
2740 / 2339 / 620
Регистрация: 19.03.2012
Сообщений: 8,830
13.09.2016, 16:25 14
Oklahoma28place, то что ты не осилил тебя для самых начинающих.
0
3 / 3 / 1
Регистрация: 14.12.2012
Сообщений: 363
13.09.2016, 16:45  [ТС] 15
То есть этот ко для самых начинающих?
0
2740 / 2339 / 620
Регистрация: 19.03.2012
Сообщений: 8,830
13.09.2016, 16:46 16
Ввод данных и проверка файла на существование, да. Ты сейчас на этом споткнулся и не смог сам встать.
0
3 / 3 / 1
Регистрация: 14.12.2012
Сообщений: 363
14.09.2016, 08:22  [ТС] 17
Ну я только начал изучать Python. До этого не программировал ни на одном языке.
0
14.09.2016, 08:22
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
14.09.2016, 08:22
Помогаю со студенческими работами здесь

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

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

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

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

Поправка кода
Есть проблемы, которые я не знаю как устранить Код ...

Поправка в программе
Делал курсач по нейронным сетям в матлабе, тема&quot; решение задачи кластеризации весоростовых...


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

Или воспользуйтесь поиском по форуму:
17
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru