Skip to content

Instantly share code, notes, and snippets.

@iambenkay
Last active May 12, 2021 11:44
Show Gist options
  • Save iambenkay/19c04aaa2db0d86215054090e740ab5b to your computer and use it in GitHub Desktop.
Save iambenkay/19c04aaa2db0d86215054090e740ab5b to your computer and use it in GitHub Desktop.
Perform AES encryption and decryption using Java
import java.util.*
import javax.crypto.Cipher
import javax.crypto.SecretKeyFactory
import javax.crypto.spec.IvParameterSpec
import javax.crypto.spec.PBEKeySpec
import javax.crypto.spec.SecretKeySpec
object AES {
private val encoder = Base64.getEncoder()
private val decoder = Base64.getDecoder()
private const val SALT = "randomsalt"
private fun cipher(mode: Int, secretKey: String, ): Cipher {
// We generate hash of key so we can get a fixed length of 32 to use for actual AES encryption
// Feel free to skip if your input key will be at least 32 bytes.
val key = generateHashOfKey(secretKey)
val c = Cipher.getInstance("AES/CBC/PKCS5Padding")
val sk = SecretKeySpec(key.sliceArray(0..31), "AES")
val iv = IvParameterSpec(key.sliceArray(0..15))
c.init(mode, sk, iv)
return c
}
fun encrypt(str: String, secretKey: String): String {
val encrypted = cipher(Cipher.ENCRYPT_MODE, secretKey).doFinal(str.toByteArray(Charsets.UTF_8))
return encoder.encodeToString(encrypted)
}
fun decrypt(str: String, secretKey: String): String {
val byteStr = decoder.decode(str.toByteArray(Charsets.UTF_8))
return String(cipher(Cipher.DECRYPT_MODE, secretKey).doFinal(byteStr))
}
private fun generateHashOfKey(key: String): ByteArray {
val skf = SecretKeyFactory.getInstance("PBKDF2WithHmacSHA1")
val spec = PBEKeySpec(key.toCharArray(), SALT.toByteArray(), 1000, 256)
val secret = skf.generateSecret(spec)
return secret.encoded
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment