操作字节数组,同时仍然保留一些字节

manipluate bytearray, while still preserving some bytes

我需要对 kotlin 字节数组进行一些加密,同时仍保留前 138 个字节。

您好,我已经使用 bouncycastle 创建了一个加密函数,该函数能够加密字节数组和 return 密文。 我现在有一个非常长的密码,我需要保留前 138 个字节,然后加密其余部分。 我的加密和密钥生成函数如下所示:

fun genKey() : SecretKey{
    val keyBytes : ByteArray = ByteArray(keylength)
    random.nextBytes(keyBytes)
    val keyspec : SecretKeySpec = SecretKeySpec(keyBytes, "AES")
    return keyspec
}
fun enc(plaintext : String, key : SecretKey) : ByteArray{
    val cipher : Cipher = Cipher.getInstance("AES/ECB/PKCS7Padding", "BCFIPS")
    val IVstr : String = "0123456789abcdef";
    val IV = IVstr.toByteArray()
    cipher.init(Cipher.ENCRYPT_MODE, key)
    return cipher.doFinal(plaintext.toByteArray())
}

我有这个驱动代码

Security.addProvider(BouncyCastleFipsProvider())
val file = File("C:\files\IMagefile.bmp").readBytes()
val cryptFile = encb(file, key)

这只是给了我字节数组“cryptfile”。现在,如前所述,我希望不加密前 138 个。 easiest/best 的方法是什么?我是否必须将“文件”明文拆分成多个部分并将它们粘合在一起?或者我可以用更聪明的方式来做吗?

直截了当split/glue比较方便,何乐而不为呢?

//element at index goes to second array
fun ByteArray.splitAtIndex(index : Int) = copyOf(index) to copyOfRange(index, size)

val (prefix, text) = plaintext.toByteArray().splitAtIndex(138)
val cipher = Cipher.getInstance("AES/ECB/PKCS7Padding", "BCFIPS").also { it.init(Cipher.ENCRYPT_MODE, key) }
val result: ByteArray = prefix + cipher.doFinal(text)