用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再去做解密