2016-07-12 4 views
0

Я пробовал несколько способов сделать это в течение трех дней и много часов. Я НЕ ЗДЕСЬ. Я использую Java для шифрования определенных данных с использованием AES/CBC/PKCS7Padding и пытается дешифровать, используя то же самое в Python, но это просто не сработает. Я использую эту Python aes.py библиотеку http://anh.cs.luc.edu/331/code/aes.py
я получаю эту ошибку:Java AES Шифрование, дешифрование Python не работает

File "/root/ascend/aes.py", line 384, in decrypt 
    block[(i+(j*4))] = iput[(i*4)+j] 
    exceptions.IndexError: list index out of range 

Вот код Java Айз:

public String aesEncrypt(String key, String data) throws InvalidKeyException, BadPaddingException, IllegalBlockSizeException, NoSuchPaddingException, NoSuchAlgorithmException, UnsupportedEncodingException, InvalidAlgorithmParameterException { 
      SecretKey secKey = new SecretKeySpec(key.getBytes(), "AES"); 
      KeyGenerator KeyGen = KeyGenerator.getInstance("AES"); 
      KeyGen.init(256); 
      Cipher AesCipher = Cipher.getInstance("AES/CBC/PKCS7Padding"); 
      AesCipher.init(Cipher.ENCRYPT_MODE, secKey, new IvParameterSpec(IV.getBytes("UTF-8"))); 
      byte[] byteCipherText = AesCipher.doFinal(data.getBytes()); 
      return Base64.encodeToString(byteCipherText, 0).trim(); 
    } 

Вот является Java ключ поколения, который дает ключ для питона использования, а также:

 public String genAESKey() { 
      String uuid = UUID.randomUUID().toString(); 
      return uuid.replace("-",""); 
     } 

а вот код питона для расшифровки:

self.data = aes.decryptData(user.aes_key, base64.b64decode(self.data)) 
#Where user.aes_key is the 256bit Aes key generated by java. 

Может кто-нибудь, пожалуйста, взгляните и объясните, что в этом плохого? Они оба используют один и тот же ключ aes 256, дополнение pkcs7 и CBC. Если кто-нибудь знает о лучшей библиотеке, которая работает с таким кодом Java, пожалуйста, покажите.

Редактирование: Просто, чтобы прояснить ситуацию, расшифровка Aes работает на Java, а не на шифроне Python и Python, используя этот ключ aes, а также расшифровывает python. Просто не java -> python. И self.data - это зашифрованные java-данные.

Редактировать # 2: Просто попытался сделать это с помощью PyCrypto. Точная точная ошибка происходит.

return self._cipher.decrypt(ciphertext) 
    exceptions.ValueError: Input strings must be a multiple of 16 in length 
+0

Использование PyCrypto: https://www.dlitz.net/software/pycrypto/ – Will

+0

Вы сравнивали вывод обеих программ с одним и тем же ключом и данными? Можно ожидать, что конечное пространство или новая строка будут отсутствовать. –

ответ

-1

Проблема заключалась в том, что по какой-то причине Java дополняла первый байт полученной строки. Зачем? У меня нет ни малейшего намека, но после того, как он отключил его на Python, все было хорошо. И код PyCrypto, и код Aes.py работают нормально.

Смежные вопросы