Nano Hash - криптовалюты, майнинг, программирование

Зашифрованные данные Pycrypto AES имеют странные символы (python)

Здесь начинающий программист пытается зашифровать строку данных с помощью pycrypto AES. После тщательного анализа и опробования в оболочке Python я закодировал crypt.py и попытался запустить его. Функция AES, которая отлично работала в оболочке, начала выдавать странные символы в качестве вывода, когда я запускаю файл. Может кто-нибудь пролить свет на то, где я делаю неправильно.

Вот мой crypt.py:

#!/usr/bin/env python

from Crypto.Cipher import AES
from Crypto import Random
import os
import md5
import sys
import binascii
import base64

password = "fault_tolerant_system"
md5obj = md5.new()
md5obj.update(password)
key = md5obj.digest()

def pad(data, width):
  needed = width - ((len(data) + 1) % width)
  return data + ('\x00' * needed) + chr(needed + 1)

def unpad(data):
  padding = ord(data[-1])
  return data[:-padding]

def main() :
  val = "Hi I am ked"
  crcval = binascii.crc32(val) & 0xffffffff
  lencrc = len(str(crcval))
  finalval = str(lencrc) + "|" + val + str(crcval)
  print 'finalval after crc appending: ', finalval
  padded_finalval = pad(finalval, 16)
  print "padded final val : ", padded_finalval

  #encrypt using AES
  print Random.new().read(16)
  ivp = binascii.hexlify(Random.new().read(16))
  aes_encryptor = AES.new(key, AES.MODE_CBC, ivp[:16])
  cipher2 = aes_encryptor.encrypt(padded_finalval)
  print "ivp is:", ivp
  print "cipher2: ", cipher2
  cipher = ivp[:16] + aes_encryptor.encrypt(padded_finalval)
  print "cipher: ", (cipher)
  print "\n\n******"

  res_enc_iv_aes = cipher
  ivg = res_enc_iv_aes[:16]
  print ivg
  aes_decryptor = AES.new(key, AES.MODE_CBC, ivg)
  print binascii.hexlify(aes_decryptor.decrypt(res_enc_iv_aes[16:]))
  resvalue = unpad(aes_decryptor.decrypt(res_enc_iv_aes[16:]))

  print "\ndecrpted: ", resvalue      
  crclen = int(resvalue.split("|", 1)[0])
  print "crclen: ", crclen
  crc_cksum = resvalue[-crclen:]
  print crc_cksum
  recv_data = finalval[len(str(crclen))+1 : -crclen]
  print "recv_data: ", recv_data
#compute checksum of recv_data
  crc_recv_data = binascii.crc32(recv_data) & 0xffffffff
  print crc_recv_data      
  if str(crc_recv_data) == crc_cksum:
        #no error in data
    print "recv_data: ", recv_data
  else:
    print "error :("
    print "recdata:", recv_data

if __name__ == "__main__":
  main() 

И вывод: finalval после добавления crc: 10|Hi1293356558

дополненный окончательный val: 10|Hi1293356558

A0>�̔�ˈ�_Y/�u

ИВП: 95f9a5238701703b8a58933bb48e9015

mqMher2: ����]6� �75��՘�+�2=��P�H�� T��ڕu'5/�Q�9a5238701703b5�U�� �T���fQ�


95f9a5238701703b

edd08277e52fc138369bb557e24d88d00000000000000000000000000000000011

расшифровано: C���)�{��I3,p

Traceback (most recent call last):
  File "cry1.py.py", line 70, in <module>
    main()
  File "cry1.py.py", line 53, in main
  crclen = int(resvalue.split("|", 1)[0])

ValueError: invalid literal for int() with base 10: 'C\xe0\xe9\x1a'

  • Это работает, как задумано. Когда у вас есть зашифрованный текст, вам нужно защитить его ASCII или закодировать в формате, сохраняющем двоичные данные. 30.11.2013
  • Проверьте этот вопрос и ответ, чтобы быть более конкретным: хэши"> stackoverflow.com/questions/16220016/ 30.11.2013
  • Я пробовал кодировку base64, но расшифрованные данные не выходят должным образом. Если это не правильный способ справиться с этим, можете ли вы предложить использовать то, что сработает. Кроме того, есть идеи, почему я получаю недопустимую буквальную ошибку? Спасибо @rdodev 30.11.2013
  • но он (в ссылке) не получает странные символы в зашифрованных данных, как я.. как мне получить эту форму @rdodev 30.11.2013
  • @kedari-tehja, у меня были такие же странные символы (я задавал этот вопрос немного назад), и поэтому я не мог сохранить их в БД. Просто дело не в самом вопросе, но мои логи были очень похожи на ваши. 30.11.2013
  • хм... он отлично работал, когда я пробовал в оболочке Python... но не работал, когда я запускал его как файл... :( Вы решили эту проблему? @rdodev 30.11.2013
  • да, как только я закодировал/декодировал в правильный формат, все получилось. 30.11.2013
  • какой формат вы использовали? Пожалуйста, поделитесь @rdodev 30.11.2013
  • unicode_key = key.decode('iso-8859-1') bytes_key = unicode_key.encode('iso-8859-1') 30.11.2013
  • FWIW, эти странные символы — это символ замены Unicode, используемый для замены неизвестного или непредставимого символа. . 01.12.2013

Ответы:


1

Благодаря Кайлу. Это объясняет и отвечает на все, что вы хотите знать о AES pycrypto. http://kyleisom.net/downloads/crypto_intro.pdf

30.11.2013
  • Неработающей ссылке. Печальный :( 07.09.2017
  • Новые материалы

    Кластеризация: более глубокий взгляд
    Кластеризация — это метод обучения без учителя, в котором мы пытаемся найти группы в наборе данных на основе некоторых известных или неизвестных свойств, которые могут существовать. Независимо от..

    Как написать эффективное резюме
    Предложения по дизайну и макету, чтобы представить себя профессионально Вам не позвонили на собеседование после того, как вы несколько раз подали заявку на работу своей мечты? У вас может..

    Частный метод Python: улучшение инкапсуляции и безопасности
    Введение Python — универсальный и мощный язык программирования, известный своей простотой и удобством использования. Одной из ключевых особенностей, отличающих Python от других языков, является..

    Как я автоматизирую тестирование с помощью Jest
    Шутка для победы, когда дело касается автоматизации тестирования Одной очень важной частью разработки программного обеспечения является автоматизация тестирования, поскольку она создает..

    Работа с векторными символическими архитектурами, часть 4 (искусственный интеллект)
    Hyperseed: неконтролируемое обучение с векторными символическими архитектурами (arXiv) Автор: Евгений Осипов , Сачин Кахавала , Диланта Хапутантри , Тимал Кемпития , Дасвин Де Сильва ,..

    Понимание расстояния Вассерштейна: мощная метрика в машинном обучении
    В обширной области машинного обучения часто возникает необходимость сравнивать и измерять различия между распределениями вероятностей. Традиционные метрики расстояния, такие как евклидово..

    Обеспечение масштабируемости LLM: облачный анализ с помощью AWS Fargate и Copilot
    В динамичной области искусственного интеллекта все большее распространение получают модели больших языков (LLM). Они жизненно важны для различных приложений, таких как интеллектуальные..