Что такое згд — Значение слов «згд»
Что такое згд — Значение слов «згд»Ищут сейчас
Сейчас на сайте
наш ЧАТ на Телеграм
наш канал на Телеграм
Популярное за сегодня
рарный
котакбас
роцк
оффник
троллинг
черкаш
пердос
чиназес
Ой-бой
легит
Заны
фарту
баребух
ролить
водник
лилла
Слпвм
кирять
стафф
краш
Последние запросы
эдлиб • шибздик • шарага • чугунда • фитоняшка • троллинг • тиреч • сьюха • стелит • слайм • сиповать • самка • рашить • порядочный • пасет • памп • отчим • открополить • ой-бой • малолетний дебил • казик • кавабанга • запустить карася • зайбал • дрочишь • дрочит • догонять • дабл кап • вебмастер •
Обьясните людям?
пимпить • биггить • бигить • чугунда • паппать • зафидил • чупеп • гамзик • капибара • топитоп • ратибор • нижмид • мать ебал • бурмулда • эротишно • шматра • флэты • тууй • путин лох • пизда тебе • паппить • джокать • беблух • чебоданки • цумадинка • хекан • факаюсь • стребл • спотать • слпвнм • рокать • растабойшан • рандоно • путлер капут • пуляночка • птичьей • папать • охамутала • олджэ • напрокид • мптришка • лобочесы • кифл • защиканка • заряженная девушка • заклубиться • жмыхнуть • дядя миша • добнуть • джига •
Слова по темам
Что такое
згд — Значение слов «згд»развернуть всёсвернуть всё
Найти полет в отпуск до $100 из:
Leverkusen Mitte Схипхол Франкфурт-на-Майне Кельн-Бонн Брюссель Мюнстер Падерборн Кальден Шарлеруа Люксембург Нидеррхейн Дерне Бирсет Роттердам Маастрихт Дюссельдорф Дортмунд Эйндховен Ханн
ЗГД, аббрев. (геймеры, РПГ, «Perfect World»)
значение: локация Запад Города Драконов в игре «Perfect World».
Славится большим количеством котов и лагов в пис-зоне, является фри-PvP зоной на многих серверах.
пример текста: А я тут на ЗГД фанюсь.
#PerfectWorld
см. также: ГД, Гуй, ХХ
рядом по алфавиту:
- ЗГД
- ЗГБ
- ЗГД
- згот
XAKEP13 |
Поправочка! Все не так!
Слова на тему:
- Прист
раса (тип персонажей) в он-лайн игре «Perfect World». Официальное название расы — Сиды.
- ХХ
Одно из подземелий «Perfect World». В нем добываются (
- Иксы
см. ХХ
- Гуй
Ущелье Гуй-Му в
- Грин
Один из типов снаряжения в
- ГД
лок. ..
- ЗГД
лок…
- Син
Класс «убийцы» расы амфибий в игре «Perfect World». Сины носят кинжалы и могут уходить в
- Бао
«Легендарный питомец», считающийся лучшим
- Прист
класс персонажей в некоторых РПГ. В частности, в «World of WarСraft» и «Lineage 2».
- ПВХ
аббревиатура названия оружия «Поиск Вечных Хлопот» — пращи на 95
- Оранж
наилучший (и самый дорогой) тип снаряжения в ММоРПГ «Perfect World». Оранжем могут быть
- Пит
моб
- Скилл
в ММоРПГ «Perfect World» — магическое заклинание, используемое игроком для увеличения урона пр…
- Хилл
особый скил…
- Пуха
оружие, дающее дополнительный урон к основной атаке персонажа по
- Фен
легендарный питомец «Пылающий крошка феникс» в ММоРПГ «Perfect World» Уточнение: Амфетамин (не…
- Заточка
данное слово употребляется в ММоРПГ «Perfect World». Материал, наносимый на
- Сид
представитель сидов, одной из четырех рас в ММоРПГ «Perfect World». Раса сидов делится на 2 кл…
- Инвиз
умение сина с…
- РРРФ
Группа
- ХАГ
Группа
- Миста
в игре «Perfect world» это сокращенное название расы древних, а именно подрасы мистиков, чаще …
Ищут сейчас
Сейчас на сайте
На удачу
Добавить слово
обсудить в чате в Телеге
Последние Изменения
кринж
<3
Мдэ
нагнуть
Олдсоукоку
ËБА
Дурковать
вздрохнуть
чепушила
джокать
Хв
Попаянный
цинус
тян без пруфов
Хоттабыч
Зиг хайль
СЛП
Загномить
мкад
овнуть
Популярное за сегодня
рарный
котакбас
роцк
оффник
троллинг
черкаш
пердос
чиназес
Ой-бой
легит
Заны
фарту
баребух
ролить
водник
лилла
Слпвм
кирять
стафф
краш
Обьясните людям?
пимпить • биггить • бигить • чугунда • паппать • зафидил • чупеп • гамзик • капибара • топитоп • ратибор • нижмид • мать ебал • бурмулда • эротишно • шматра • флэты • тууй • путин лох • пизда тебе • паппить • джокать • беблух • чебоданки • цумадинка • хекан • факаюсь • стребл • спотать • слпвнм • рокать • растабойшан • рандоно • путлер капут • пуляночка • птичьей • папать • охамутала • олджэ • напрокид • мптришка • лобочесы • кифл • защиканка • заряженная девушка • заклубиться • жмыхнуть • дядя миша • добнуть • джига •
Последние Изменения
кринж<3
Мдэ
нагнуть
Олдсоукоку
ËБА
Дурковать
чепушила
джокать
Хв
Попаянный
цинус
тян без пруфов
Хоттабыч
Зиг хайль
СЛП
Загномить
мкад
овнуть
Интересные определения:
Фикрайтеры — это создатели фанфиков, а фикридеры — их читатели.
Батл у хиппи означает бутылка (от англ. bottle), а в субкультуре хип-хоп батл — соревнование, состязание (от англ. battle — битва).
Трюкеры — обобщённое название трейсеров (паркура), байкеров, файерщиков, роллеров, скейтеров, (список нуждается в дополнении) и других молодёжных неформальных движений уличного экстремального спорта.
дополнительные сведения», используемые при заполнении форм «Сведения о страховом стаже застрахованных лиц (СЗВ-СТАЖ), «Данные о корректировке сведений, учтенных на индивидуальном лицевом счете застрахованного лица… \ КонсультантПлюс
Коды «Исчисление страхового стажа: дополнительные
сведения», используемые при заполнении форм «Сведения
о страховом стаже застрахованных лиц (СЗВ-СТАЖ), «Данные
о корректировке сведений, учтенных на индивидуальном
лицевом счете застрахованного лица (СЗВ-КОРР), формы
«Сведения о заработке (вознаграждении), доходе, сумме
выплат и иных вознаграждений, начисленных и уплаченных
страховых взносах, о периодах трудовой и иной
деятельности, засчитываемых в страховой
стаж застрахованного лица (СЗВ-ИСХ)»
Код | Полное наименование | Акт законодательства | Срок действия кода |
ДЕТИ | Отпуск по уходу за ребенком | Абзац пятый статьи 256 Трудового кодекса Российской Федерации . Статья 10 Закона Российской Федерации от 20 ноября 1990 г. N 340-1 «О государственных пенсиях в Российской Федерации» . | с 01.01.1996 по 31.12.2001 |
Абзац пятый статьи 256 Трудового кодекса Российской Федерации. Подпункт 3 пункта 1 статьи 11 Федерального закона от 17.12.2001 N 173-ФЗ «О трудовых пенсиях в Российской Федерации» . Подпункт 2 пункта 2 статьи 1 Федерального закона от 21.03.2005 N 18-ФЗ «О средствах федерального бюджета, выделяемых Пенсионному фонду Российской Федерации на возмещение расходов по выплате страховой части трудовой пенсии по старости, трудовой пенсии по инвалидности и трудовой пенсии по случаю потери кормильца отдельным категориям граждан» | с 01.01.2002 по 31.12.2014 | ||
Абзац 5 статьи 256 Трудового кодекса Российской Федерации. | с 01.01.2015 | ||
Пункт 3 части 1 статьи 12 Федерального закона от 28.12.2013 N 400-ФЗ «О страховых пенсиях» . Подпункт 2 пункта 2 статьи 1 Федерального закона от 21. 03.2005 N 18-ФЗ «О средствах федерального бюджета, выделяемых Пенсионному фонду Российской Федерации на возмещение расходов по выплате страховой части трудовой пенсии по старости, трудовой пенсии по инвалидности и трудовой пенсии по случаю потери кормильца отдельным категориям граждан» | |||
ДЕКРЕТ | Отпуск по беременности и родам | Пункт «в» статьи 92 Закона Российской Федерации от 20 ноября 1990 г. N 340-1 «О государственных пенсиях в Российской Федерации» | с 01.01.1996 по 31.12.2001 |
Абзац первый статьи 255 Трудового кодекса Российской Федерации . Подпункт 2 пункта 1 статьи 11 Федерального закона от 17.12.2001 N 173-ФЗ «О трудовых пенсиях в Российской Федерации» | с 01.01.2002 по 31.12.2014 | ||
Пункт 2 части 1 статьи 12 Федерального закона от 28.12.2013 N 400-ФЗ «О страховых пенсиях» | с 01.01.2015 | ||
ДОГОВОР | Работа по договорам гражданско-правового характера, в том числе выходящая за рамки отчетного (расчетного) периода | Пункт 2 статьи 425 части 1 Гражданского кодекса Российской Федерации «Действие договора» | с 01. 01.2002 |
УВПЕРИОД | Работа в рамках увеличенного расчетного периода | Абзац второй пункта 2 статьи 23 Федерального закона от 15.12.2001 N 167-ФЗ «Об обязательном пенсионном страховании в Российской Федерации» . | с 01.01.2002 по 31.12.2009 |
ДЛОТПУСК | Пребывание в оплачиваемом отпуске | Статьи 114 — 116 Трудового кодекса Российской Федерации | с 01.02.2002 |
АДМИНИСТР | Отпуск без сохранения содержания | Статья 128 Трудового кодекса Российской Федерации | с 01.01.1996 по 31.12.2001 с 01.01.2010 по 31.12.2016 |
ВРНЕТРУД | Период временной нетрудоспособности | Подпункт 2 пункта 1 статьи 11 Федерального закона от 17.12.2001 N 173-ФЗ «О трудовых пенсиях в Российской Федерации» | с 01. 01.2010 по 31.12.2014 |
Пункт 2 части 1 статьи 12 Федерального закона от 28.12.2013 N 400-ФЗ «О страховых пенсиях» | с 01.01.2015 | ||
ВАХТА | Время вахтового отдыха | Абзац первый пункта 8 постановления Правительства Российской Федерации от 11.07.2002 N 516 «Об утверждении Правил исчисления периодов работы, дающей право на досрочное назначение трудовой пенсии по старости в соответствии со статьями 27 и 28 Федерального закона «О трудовых пенсиях в Российской Федерации». Статья 300 Трудового кодекса Российской Федерации | с 01.01.2014 |
МЕСЯЦ | Перевод работника с работы, дающей право на досрочное назначение трудовой пенсии по старости, на другую работу, не дающую право на указанную пенсию, в той же организации по производственной необходимости на срок не более одного месяца в течение календарного года | Абзац первый пункта 9 постановления Правительства Российской Федерации от 11. 07.2002 N 516 «Об утверждении Правил исчисления периодов работы, дающей право на досрочное назначение трудовой пенсии по старости в соответствии со статьями 27 и 28 Федерального закона «О трудовых пенсиях в Российской Федерации». Абзацы второй и третий статьи 72.2 Трудового кодекса Российской Федерации | с 01.01.2014 |
КВАЛИФ | Повышение квалификации с отрывом от производства | Статья 187 Трудового кодекса Российской Федерации | с 01.01.2014 |
ОБЩЕСТ | Исполнение государственных или общественных обязанностей | Статья 170 Трудового кодекса Российской Федерации | с 01.01.2014 |
СДКРОВ | Дни сдачи крови и ее компонентов и предоставленные в связи с этим дни отдыха | Статья 186 Трудового кодекса Российской Федерации | с 01.01.2014 |
ОТСТРАН | Отстранение от работы (недопущение к работе) не по вине работника | Абзац десятый статьи 76 Трудового кодекса Российской Федерации. | с 01.01.2014 |
ПРОСТОЙ | Время простоя по вине работодателя | Абзац девятый пункта 9 Правил исчисления периодов работы, дающей право на досрочное назначение трудовой пенсии по старости в соответствии со статьями 27 и 28 Федерального закона «О трудовых пенсиях в Российской Федерации», утвержденных постановлением Правительства Российской Федерации от 11.07.2002 N 516. Абзацы первый и второй статьи 157 Трудового кодекса Российской Федерации | с 01.01.2014 |
УЧОТПУСК | Дополнительные отпуска работникам, совмещающим работу с обучением | Статьи 173 — 177 Трудового кодекса Российской Федерации | с 01.01.2014 |
МЕДНЕТРУД | Период работы, соответствующий переводу в соответствии с медицинским заключением беременной женщины по ее заявлению с работы, дающей право на досрочное назначение трудовой пенсии по старости, на работу, исключающую воздействие неблагоприятных производственных факторов, а также период, когда беременная женщина не работала до решения вопроса о ее трудоустройстве в соответствии с медицинским заключением | Пункт 12 Правил исчисления периодов работы, дающей право на досрочное назначение трудовой пенсии по старости в соответствии со статьями 27 и 28 Федерального закона «О трудовых пенсиях в Российской Федерации», утвержденных постановлением Правительства Российской Федерации от 11. 07.2002 N 516. Абзацы первый и второй статьи 254 Трудового кодекса Российской Федерации | с 01.01.2014 |
НЕОПЛДОГ | Период работы застрахованного лица по гражданско-правовому договору | Период работы застрахованного лица по гражданско-правовому договору, выплаты и иные вознаграждения за который начислены в следующие отчетные периоды | с 01.01.2014 |
НЕОПЛАВТ | Период работы застрахованного лица по авторскому договору | Период работы застрахованного лица по авторскому договору, а также по договору с авторами произведений, получившими выплаты и иные вознаграждения по договорам об отчуждении исключительного права на произведения науки, литературы, искусства, издательским лицензионным договорам, лицензионным договорам о предоставлении права использования произведений науки, литературы, искусства, выплаты и иные вознаграждения за который начислены в следующие отчетные периоды | с 01. 01.2014 |
ДОПВЫХ | Дополнительные выходные дни лицам, осуществляющим уход за детьми-инвалидами. | Статья 262 Трудового кодекса Российской Федерации | с 01.01.2014 |
ЗГДС | Сведения о замещении лицом государственной должности субъекта Российской Федерации на постоянной основе | Часть 1.1 статьи 8 Федерального закона от 28 декабря 2013 года N 400-ФЗ «О страховых пенсиях» | с 01.01.2017 |
ЗГД | Сведения о замещении лицом государственной должности Российской Федерации | Часть 1.1 статьи 8 Федерального закона от 28 декабря 2013 года N 400-ФЗ «О страховых пенсиях» | с 01.01.2017 |
ЗГГС | Сведения о замещении лицом должности государственной гражданской службы Российской Федерации | Часть 1.1 статьи 8 Федерального закона от 28 декабря 2013 года N 400-ФЗ «О страховых пенсиях» | с 01. 01.2017 |
ЗМС | Сведения о замещении лицом должности муниципальной службы | Часть 1.1 статьи 8 Федерального закона от 28 декабря 2013 года N 400-ФЗ «О страховых пенсиях» | с 01.01.2017 |
ЗМД | Сведения о замещении лицом муниципальной должности на постоянной основе | Часть 1.1 статьи 8 Федерального закона от 28 декабря 2013 года N 400-ФЗ «О страховых пенсиях» | с 01.01.2017 |
———————————
<45> Собрание законодательства Российской Федерации, 2002, N 1, ст. 3; 2006, N 27, ст. 2878; 2010, N 52, ст. 7002; 2013, N 14, ст. 1668; N 27, ст. 3477; 2014, N 30, ст. 4217.
<46> Ведомости Съезда народных депутатов РСФСР и Верховного Совета РСФСР, 1990, N 27, ст. 351.
<47> Собрание законодательства Российской Федерации, 2001, N 52, ст. 4920; 2002, N 30, ст. 3033; 2008, N 30, ст. 3602; 2009, N 30, ст. 3739; 2011, N 49, ст. 7039; 2013, N 52, ст. 6992.
<48> Собрание законодательства Российской Федерации, 2005, N 13, ст. 1076; 2008, N 30, ст. 3602; 2009, N 30, ст. 3739; 2013, N 52, ст. 6992.
<49> Собрание законодательства Российской Федерации, 2013, N 52, ст. 6965; 2015, N 27, ст. 3964; 2016, N 1, ст. 5.
<50> Ведомости Съезда народных депутатов РСФСР и Верховного Совета РСФСР, 1990, N 27, ст. 351.
<51> Собрание законодательства Российской Федерации, 2002, N 1, ст. 3; 2006, N 27, ст. 2878.
<52> Собрание законодательства Российской Федерации, 1994, N 32, ст. 3301; 2002, N 48, ст. 4737; 2003, N 2, ст. 167; 2005, N 1, ст. 39; 2007, N 27, ст. 3213; N 31, ст. 3993; N 41, ст. 4845; 2008, N 30, ст. 3616; 2009, N 1, ст. 14; 2011, N 49, ст. 7041; N 50, ст. 7347; 2013, N 51, ст. 6687; 2014, N 11, ст. 1100; N 19, ст. 2304; 2015, N 10, ст. 1412.
<53> Собрание законодательства Российской Федерации, 2001, N 51, ст. 4832; 2002, N 22, ст. 2026; 2003, N 1, ст. 2, 13; N 52, ст. 5037; 2004, N 27, ст. 2711; N 30, ст. 3088; N 49, ст. 4854, 4856; 2005, N 1, ст. 9; N 45, ст. 4585; 2006, N 31, ст. 3436; 2007, N 30, ст. 3754; 2008, N 18, ст. 1942; N 30, ст. 3602, 3616; 2009, N 1, ст. 12; 2009, N 30, ст. 3739.
<54> Собрание законодательства Российской Федерации, 2002, N 1, ст. 3; N 30, ст. 3014, 3033; 2003, N 27, ст. 2700; 2004, N 18, ст. 1690; N 35, ст. 3607; 2005, N 1, ст. 27; N 19, ст. 1752; 2006, N 27, ст. 2878.
<5> Собрание законодательства Российской Федерации, 2002, N 1, ст. 3; N 30, ст. 3033; 2003, N 27, ст. 2700; 2006, N 27, ст. 2878; 2013, N 27, ст. 3449; 2016, N 27, ст. 4238.
<56> Собрание законодательства Российской Федерации, 2002, N 28, ст. 2872; 2009, N 22, ст. 2725; 2013, N 13, ст. 1559.
<57> Собрание законодательства Российской Федерации, 2002, N 1, ст. 3; N 30, ст. 3014, 3033; 2003, N 27, ст. 2700; 2004, N 18, ст. 1690; N 35, ст. 3607; 2005, N 1, ст. 27; N 19, ст. 1752; 2006, N 27, ст. 2878.
<58> Собрание законодательства Российской Федерации, 2013, N 52, ст. 6965; 2015, N 27, ст. 3964; 2016, N 1, ст. 5, N 22, ст. 3091.
Как декодировать base64 в GIF в python?
Задавать вопрос
спросил
Изменено 1 год, 7 месяцев назад
Просмотрено 712 раз
У меня есть API-интерфейс python flask-restful, я пытаюсь добавить функцию, позволяющую пользователям загружать GIF-файлы, для этого клиент будет загружать GIF-файл в кодировке base64 в API, поэтому в API мне нужно иметь возможность декодировать base64 в GIF, а также иметь возможность выполнять над ним операции, такие как изменение размера и сжатие, а затем преобразовывать его в байты
Я пытался сделать с PIL так:
img_bytes = BytesIO() # Я указал продолжительность 67, потому что хочу, чтобы GIF воспроизводился со скоростью 15 кадров в секунду, 1000/15 = 66,66. self.image.save(img_bytes, append_images=self.frames[1:], format=self.format, save_all=True, оптимизировать = ложь, продолжительность = 67, цикл = 0) img_bytes.seek(0)
Проблема с этой реализацией заключается в том, что я нахожу много искажений и черных пикселей в GIF-файлах и непостоянную частоту кадров / скорость анимации, в целом это довольно плохо, и это делает GIF размером 75 КБ равным 1,8 МБ, есть другие решения?
- python
- библиотека изображений python
- gif
- анимированный gif
Попробуйте код ниже. Меня устраивает.
из изображения импорта PIL импортировать base64 импорт ОС myimagestring = "R0lGODlhkAGQAfcAAAAAAAAAMwAAZgAAmQAAzAAA/wArAAArMwArZgArmQArzAAr/wBVAABVMwBVZgBVmQBVzABV/wCAAACAMwCAZgCAmQCAzACA/wCqAACqMwCqZgCqmQCqzACq/wDVAADVMwDVZgDVmQDVzADV/wD/AAD/MwD/ZgD/mQD/zAD//zMAADMAMzMAZjMAmTMAzDMA/zMrADMrMzMrZjMrmTMrzDMr/zNVADNVMzNVZjNVmTNVzDNV/zOAADOAMzOAZjOAmTOAzDOA/zOqADOqMzOqZjOqmTOqzDOq/zPVADPVMzPVZjPVmTPVzDPV/zP/ADP/MzP/ZjP/mTP/ zDP//2YAAGYAM2YAZmYAmWYAzGYA/2YrAGYrM2YrZmYrmWYrzGYr/2ZVAGZVM2ZVZmZVmWZVzGZV/2aAAGaAM2aAZmaAmWaAzGaA/2aqAGaqM2aqZmaqmWaqzGaq/2bVAGbVM2bVZmbVmWbVzGbV/2b/AGb/M2b/Zmb/mWb/zGb//5kAAJkAM5kAZpkAmZkAzJkA/5krAJkrM5krZpkrmZkrzJkr/5lVAJlVM5lVZplVmZlVzJlV/5mAAJmAM5mAZpmAmZmAzJmA/5mqAJmqM5mqZpmqmZmqzJmq/5nVAJnVM5nVZpnVmZnVzJnV/5n/AJn/M5n/Zpn/mZn/ zJn//8wAAMwAM8wAZswAmcwAzMwA/8wrAMwrM8wrZswrmcwrzMwr/8xVAMxVM8xVZsxVmcxVzMxV/8yAAMyAM8yAZsyAmcyAzMyA/8yqAMyqM8yqZsyqmcyqzMyq/8zVAMzVM8zVZszVmczVzMzV/8z/AMz/M8z/Zsz/mcz/zMz///8AAP8AM/8AZv8Amf8AzP8A//8rAP8rM/8rZv8rmf8rzP8r//9ВАП9ВМ/9ВЗв9Вмф9ВзП9В//+ААП+АМ/+АЗв+Амф+АзП+А//+qAP+qM/+qZv+qmf+qzP+q///ВАП/ВМ//ВЗв/Вмф/ВзП/В// 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" myimagedata = base64. b64decode(myimagestring) myimagefile = открыть («myimage.gif», «wb») myimagefile.write(myimagedata) myimagefile.close() myimageobject = фотоизображение (файл = "myimage.gif")
И вот функция изменения размера изображения при необходимости:
из PIL import Image def get_resized_img (img_path, picture_size): img = Image.open(img_path) width, height = picture_size # это МАКСИМАЛЬНЫЕ размеры picture_ratio = ширина / высота img_ratio = img.size[0] / img.size[1] if picture_ratio >= 1: # картинка широкая if img_ratio <= picture_ratio: # изображение недостаточно широкое width_new = int (высота * img_ratio) size_new = ширина_новая, высота else: # изображение шире, чем изображение height_new = int (ширина / img_ratio) size_new = ширина, высота_новая else: # картинка высокая if img_ratio >= picture_ratio: # изображение недостаточно высокое height_new = int (ширина / img_ratio) size_new = ширина, высота_новая else: # изображение выше картинки width_new = int (высота * img_ratio) size_new = ширина_новая, высота вернуть img. resize(size_new, resample=Image.LANCZOS)
3
Зарегистрируйтесь или войдите в систему
Зарегистрируйтесь с помощью Google
Зарегистрироваться через Facebook
Зарегистрируйтесь, используя адрес электронной почты и пароль
Опубликовать как гость
Электронная почта
Требуется, но не отображается
Опубликовать как гость
Электронная почта
Требуется, но не отображается
python — Почему я получаю ValueError при попытке распаковать данные?
Короче говоря, я разрабатываю зашифрованный чат с использованием ECDH + AES (исходный код на GitHub)
Все алгоритмы шифрования и дешифрования работают просто отлично, когда я тестирую их по отдельности. Они также работают, когда установлено только одно соединение с сервером. Однако, когда подключено более одного сокета, я получаю эту ошибку.
Трассировка (последний последний вызов): Файл "C:\Users\user\AppData\Local\Programs\Python\Python39\lib\threading.py", строка 973, в _bootstrap_inner самозапуск() Файл "C:\Users\user\AppData\Local\Programs\Python\Python39\lib\threading.py", строка 910, выполняется self._target(*self._args, **self._kwargs) Файл "C:\!GitLab\chat\client.py", строка 111, в прослушивателе открытый текст = self.client_cred.decrypt( Файл "C:\!GitLab\chat\ecdh.py", строка 105, в расшифровке вернуть unpadder.update(decrypted_data) + unpadder.finalize() Файл "C:\Users\user\AppData\Local\Programs\Python\Python39\lib\site-packages\cryptography\hazmat\primitives\padding.py", строка 159, в доработке результат = _byte_unpadding_check( Файл "C:\Users\user\AppData\Local\Programs\Python\Python39\lib\site-packages\cryptography\hazmat\primitives\padding. py", строка 101, в _byte_unpadding_check поднять ValueError("Недопустимые байты заполнения") ValueError: Недопустимые байты заполнения.
А вот и зашифруйте мой код шифрования/расшифровки:
из cryptography.hazmat.backends import default_backend из cryptography.hazmat.primitives импортировать хэши, заполнение из cryptography.hazmat.primitives.ciphers импорт Шифр, алгоритмы, режимы из секретов импортировать token_bytes из cryptography.hazmat.primitives.kdf.hkdf импортировать HKDF сериализация импорта из cryptography.hazmat.primitives из cryptography.hazmat.primitives.aсимметричный импорт ec ФОРМАТ = 'utf-8' БЛОК_РАЗМЕР = 16 класс ДХ: защита __init__(сам): self.ECDH = ec.generate_private_key(ec.SECP384R1(), default_backend()) self.public_key = self.ECDH.public_key() def encrypt(self, public_key, открытый текст): """ IV = 16 байт СОЛЬ = 16 байт Общий ключ = 48 байт Производный ключ = 32 байта AES = 256 бит AES = 32 байта Паддер = 128 или 256 бит Паддер = 16 или 32 байта Зашифрованный текст = IV + SALT + MSG :param public_key: еще один открытый ключ клиента :param plaintext: текст для шифрования :return: зашифрованный зашифрованный текст """ IV = token_bytes(16) SALT = token_bytes(16) общий_ключ = self. ECDH.exchange(ec.ECDH(), открытый_ключ) производный_ключ = HKDF( алгоритм=хэши.SHA256(), длина=32, соль=СОЛЬ, информация = нет ).вывести(общий_ключ) шифратор = шифр( алгоритмы.AES(derived_key), режимы.CBC(IV) ).шифратор() # unpadder = padding.PKCS7(256).unpadder() padder = padding.PKCS7(128).padder() padded_data = padder.update(plaintext.encode(FORMAT)) + padder.finalize() вернуть IV + SALT + encryptor.update (дополненные_данные) + encryptor.finalize () def расшифровать (я, открытый_ключ, зашифрованный текст): IV = зашифрованный текст[:16] СОЛЬ = зашифрованный текст[16:32] зашифрованный текст = зашифрованный текст[32:] общий_ключ = self.ECDH.exchange(ec.ECDH(), открытый_ключ) производный_ключ = HKDF( алгоритм=хэши.SHA256(), длина=32, соль=СОЛЬ, информация = нет ). вывести(общий_ключ) расшифровщик = шифр( алгоритмы.AES(derived_key), режимы.CBC(IV) ).расшифровщик() decrypted_data = decryptor.update(зашифрованный текст) + decryptor.finalize() # unpadder = padding.PKCS7(256).unpadder() unpadder = padding.PKCS7(128).unpadder() вернуть unpadder.update(decrypted_data) + unpadder.finalize()
Сервер получает сообщение:
msg = current_client.recv(2048)
Расшифровывает:
открытый текст = self.serv_cred.decrypt( self.connection_dic.get(current_client), сообщение ).декодировать(ФОРМАТ)
Шифрует его с помощью публичных ключей клиентов (которые хранятся в словаре) и отправляет участникам чата:
для клиента, pub_k в self.connection_dic.items(): зашифрованный текст = self.serv_cred.encrypt (pub_k, открытый текст) client.send(зашифрованный текст)
Клиентская сторона получает сообщение:
msg = self. client_socket.recv(2048)
Расшифровывает это:
открытый текст = self.client_cred.decrypt( self.server_public, сообщение ).декодировать(ФОРМАТ)
Шифрование на стороне клиента выглядит как
зашифрованный текст = self.client_cred.encrypt( self.server_public, сообщение )9)\x84\x82\xc1\xe1:7\xe9\x852e\xbf\x88k\xe5\xa0\x18V\x17?v;\xd1\xb9\xf76+[\xfd\xc1gp\xaa\nF\x9dY\xea\ х82′ dec Производное b»\x18\xaa>\xe5Tt\x89TD\n\xc3V(t\xa2V\xc9\x08\xb5\x8a’\xe9\xaep\x19{\x94Ck1_b» dec Unpadded b’Это тестовое сообщение, когда второй сокет пытается отправить сообщение!’
Сервер шифрует сообщение и отправляет его Client1:
msg = 'bob > Это тестовое сообщение, когда второй сокет пытается отправить сообщение!' enc IV b'\x82`Pv\xc3\xac\xac\x95\xd75\xd8\xd0XL\x10#' enc СОЛЬ b'\xe5?y\xae\x1c\xbeMIs\x92\xe3\x0e1\x07B\xf1' enc Shared b'\xc70}6Y\xac\xdc\xa4\x87\xba\x85\xc2\x0c\xd8\x88\x85_e#\x83f\xa1\xb0(\xac\x94s$t\xfd\x0benn\xa6 \xbfz\x1a\x9byT\t\xa8\xffk\xd9\xcb\xb5' enc Производный b'p\xef\xb2\xeb\xb9N\x0eQ\xa8q(\x04V\x91I\x841\xec\xdd\x04m\xd2\xef?\x02\x98f@B\x80\xd0\x16' enc Padded b'bob > Это тестовое сообщение, когда второй сокет пытается отправить сообщение!\x02\x02'
Client1 получает те же IV и SALT от сервера.