InvalidKeyException: 无效的密钥格式

时间:2021-07-03 06:00:27

标签: kotlin rsa

我正在尝试使用公钥加密纯文本。
我的代码因 InvalidKeyException 而失败。
这是我的代码:

private const val pubkey = "30820122300d06092a864886f70d01010105000382010f003082010a0282010100f357429c22add0d547ee3e4e876f921a0114d1aaa2e6eeac6177a6a2e2565ce9593b78ea0ec1d8335a9f12356f08e99ea0c3455d849774d85f954ee68d63fc8d6526918210f28dc51aa333b0c4cdc6bf9b029d1c50b5aef5e626c9c8c9c16231c41eef530be91143627205bbbf99c2c261791d2df71e69fbc83cdc7e37c1b3df4ae71244a691c6d2a73eab7617c713e9c193484459f45adc6dd0cba1d54f1abef5b2c34dee43fc0c067ce1c140bc4f81b935c94b116cce404c5b438a0395906ff0133f5b1c6e3b2bb423c6c350376eb4939f44461164195acc51ef44a34d4100f6a837e3473e3ce2e16cedbe67ca48da301f64fc4240b878c9cc6b3d30c316b50203010001"
private val cipher: Cipher

init {
    val bytesKey = Base64.getDecoder().decode(pubkey)
    val keySpec = X509EncodedKeySpec(bytesKey)
    val keyFactory = KeyFactory.getInstance("RSA")
    val publicKey = keyFactory.generatePublic(keySpec)  // where exception has been thrown

    cipher = Cipher.getInstance("RSA")
    cipher.init(Cipher.ENCRYPT_MODE, publicKey)
}

fun encrypt(plainText: String): String {
    val bytePlain = cipher.doFinal(plainText.toByteArray())
    return Base64.getEncoder().encodeToString(bytePlain)
}

1 个答案:

答案 0 :(得分:1)

pubkey 包含十六进制编码的密钥,即对于 bytesKey 的初始化,十六进制解码是必要的,而不是 Base64 解码。

Here 您可以找到 Kotlin 十六进制解码的实现。

还要注意,在实例化密码时,最好指定除算法之外的填充,例如RSA/ECB/PKCS1Padding,否则应用依赖于提供者的默认填充,这可能与您预期的不同。