用Kotlin實作RSA加密

  • 248
  • 0
  • 2021-05-30

用Kotlin實作RSA加密途中有再轉乘HEX

最近剛好遇到需要再Android上面實作RSA加密所以筆記了一下


fun main(args: Array<String>) {
    val input = "突然想坐火車了"
    val generator = KeyPairGenerator.getInstance("RSA")
    //產生Public Key and Private Key
    val keyPair = generator.genKeyPair()
    val publicKey = keyPair.public
    val private = keyPair.private
    println("RSA私鑰加密 公鑰解密:" + RSA.encryptByPublicKey(input, private, publicKey))
}

object RSA {

    fun encryptByPublicKey(input: String, privateKey: PrivateKey, publicKey: PublicKey): String {
        val cipher = Cipher.getInstance("RSA")
        cipher.init(Cipher.ENCRYPT_MODE, privateKey)
        val doFinal = cipher.doFinal(input.toByteArray())
        val message = doFinal.toHexString()
        println(message)

        cipher.init(Cipher.DECRYPT_MODE, publicKey);
        val b = cipher.doFinal(hexStringToByteArray(message));
        println(String(b));
        return ""
    }

    private fun hexStringToByteArray(s: String): ByteArray? {
        val len = s.length
        val data = ByteArray(len / 2)
        var i = 0
        while (i < len) {
            data[i / 2] = ((Character.digit(s[i], 16) shl 4) +
                    Character.digit(s[i + 1], 16)).toByte()
            i += 2
        }
        return data
    }

    private fun ByteArray.toHexString() = asUByteArray()
        .joinToString("")
        {
            it.toString(16).padStart(2, '0')
        }

稍微的解釋一下 不過實際上還是要動手實作會比較清楚一點

KeyPairGenerator 產生private key or public key

使用private key加密的話就得用 public key解密

產生ByteArray的值是可以直接丟去解密的,但是一般的情況下是不太可以直接去解密,因為在跟Server端溝通的時候一定會再把他轉成其他的值傳輸,Ex 16進制的值

val doFinal = cipher.doFinal(input.toByteArray()) 

其中有兩個重點一個是直接將ByteArray轉乘HEX(16進制值)

另外一個重點是將HEX轉乘ByteArray再去做解密