Форумчане, привет!
Необходимо закодировать в Kotlin файл методом AES/CBC/PKCS5Padding. А потом расшифровать на Python.
На Python файл расшифровывается нормально. Но при шифровке в Kotlin теряется несколько первых символов и уменьшает значение одного байта на 1 (см. ниже).
Провозились сегодня весь день - найти ошибку при шифровании пока не получилось.
Буду признателен, если кто-либо сможет показать где ошибка и что поправить.
В итоге хотим получить, чтобы работала связка - шифрование в Kotlin, дешифрование в Python.
Перерыли кучу примеров на stackoverflow - пока нашли ошибку.
Вот код:
До шифрования файл:
20, 7
2012, 20
34, 22
-254, -171
...
После шифрования / дешифрования получаем:
34, 21
-254, -171
...
Где ошибка?
Благодарю.
Необходимо закодировать в Kotlin файл методом AES/CBC/PKCS5Padding. А потом расшифровать на Python.
На Python файл расшифровывается нормально. Но при шифровке в Kotlin теряется несколько первых символов и уменьшает значение одного байта на 1 (см. ниже).
Провозились сегодня весь день - найти ошибку при шифровании пока не получилось.
Буду признателен, если кто-либо сможет показать где ошибка и что поправить.
В итоге хотим получить, чтобы работала связка - шифрование в Kotlin, дешифрование в Python.
Перерыли кучу примеров на stackoverflow - пока нашли ошибку.
Вот код:
:
package com.test.ecgrecording.encription
import java.security.SecureRandom
import javax.crypto.Cipher
import javax.crypto.KeyGenerator
import javax.crypto.spec.IvParameterSpec
import javax.crypto.spec.SecretKeySpec
class AESEncryptor : Encryptor, Decryptor {
private val key = CIPHER_KEY.toByteArray()
override fun encrypt(source: String): ByteArray {
val preparedSourceBytes = source
.toByteArray()
.completeToSizeDividableBy16()
return doCrypto(Cipher.ENCRYPT_MODE, preparedSourceBytes)
}
override fun getEncryptionCipher(): Cipher = getCipher(Cipher.ENCRYPT_MODE)
override fun getDecryptionCipher(): Cipher = getCipher(Cipher.DECRYPT_MODE)
override fun decrypt(source: ByteArray): String {
val preparedSourceBytes = source.completeToSizeDividableBy16()
val decrypted = doCrypto(Cipher.DECRYPT_MODE, preparedSourceBytes)
return decrypted.decodeToString().replace(Char(0), ' ').trim()
}
private fun getCipher(cipherMode: Int): Cipher {
val keySpec = SecretKeySpec(key, AES_ALGORITHM)
val cipher = Cipher.getInstance(CIPHER_AES_TRANSFORMATION)
cipher.init(cipherMode, keySpec, IvParameterSpec(ByteArray(16)))
return cipher
}
private fun doCrypto(cipherMode: Int, source: ByteArray): ByteArray {
val keySpec = SecretKeySpec(key, AES_ALGORITHM)
val cipher = Cipher.getInstance(CIPHER_AES_TRANSFORMATION)
cipher.init(cipherMode, keySpec, IvParameterSpec(ByteArray(16)))
return cipher.doFinal(source)
}
private fun ByteArray.completeToSizeDividableBy16(): ByteArray {
if (this.size % 16 == 0) return this
return copyOf(((size / 16) + 1) * 16)
}
private fun generateKey(password: String): ByteArray {
val passwordBytes = password.toByteArray()
val generator = KeyGenerator.getInstance(AES_ALGORITHM)
val secureRandom = SecureRandom()
secureRandom.setSeed(passwordBytes)
generator.init(KEY_SIZE, secureRandom)
return generator.generateKey().encoded
}
companion object {
private const val AES_ALGORITHM = "AES"
private const val CIPHER_AES_TRANSFORMATION = "AES/CBC/PKCS5Padding"
private const val CIPHER_KEY = "1234567891234567"
private const val KEY_SIZE = 128
}
}
20, 7
2012, 20
34, 22
-254, -171
...
После шифрования / дешифрования получаем:
34, 21
-254, -171
...
Где ошибка?
Благодарю.