【发布时间】:2022-12-12 14:48:22
【问题描述】:
我有一个看起来像这样的私钥文件
-----开始私钥----- [内容] -----私钥结束-----
我想用这个密钥加密字符串数据
我正在尝试这样:
fun encryptData(txt: String, pk: String): String {
var encoded = ""
var encrypted: ByteArray? = null
try {
val publicBytes: ByteArray = Base64.decode(pk, Base64.DEFAULT)
val keySpec = X509EncodedKeySpec(publicBytes)
val keyFactory: KeyFactory = KeyFactory.getInstance("RSA")
val pubKey: PrivateKey = keyFactory.generatePrivate(keySpec)
val cipher: Cipher = Cipher.getInstance("RSA/ECB/PKCS1PADDING")
cipher.init(Cipher.ENCRYPT_MODE, pubKey)
encrypted = cipher.doFinal(txt.toByteArray())
encoded = Base64.encodeToString(encrypted, Base64.DEFAULT)
} catch (e: Exception) {
e.printStackTrace()
}
return encoded
}
每次我尝试编码时都会收到 InvalidKeySpecException
can someone help ?
【问题讨论】:
-
私钥不用于加密,而是用于签名(或解密)。此外,
X509EncodedKeySpec用于 SPKI 格式的公钥。对于 PKCS#8 格式的私钥,必须使用PKCS8EncodedKeySpec。 -
IE。如果
X509EncodedKeySpec被替换为PKCS8EncodedKeySpec,则发布的代码会生成带有 PKCS#1 v1.5 填充的签名(其中数据未经过哈希处理,因此不考虑 DigestID)。 -
我用 PKCS8EncodedKeySpec 替换了 X509EncodedKeySpec,现在数据返回一个编码字符串,但改造标头中不接受该字符串。
-
好吧,那么你必须弄清楚什么改造需要。
标签: android kotlin encryption cryptography retrofit