Quantcast
Channel: Форум программистов и сисадминов Киберфорум
Viewing all articles
Browse latest Browse all 520490

Шифрование AES/CBC/PKCS5Padding - Kotlin

$
0
0
Форумчане, привет!
Необходимо закодировать в 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
...

Где ошибка?
Благодарю.

Viewing all articles
Browse latest Browse all 520490

Trending Articles



<script src="https://jsc.adskeeper.com/r/s/rssing.com.1596347.js" async> </script>