fun main(args: Array) { 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再去做解密