【问题标题】:how to encrypt using a private key如何使用私钥加密
【发布时间】: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


【解决方案1】:

要在 Kotlin 中使用私钥加密字符串,您可以使用'密码'班级从'javax.crypto'包裹。

首先,您需要将私钥字符串转换为'私钥'对象使用'钥匙工厂'班级。然后,您可以初始化'密码'对象与 PrivateKey 对象并将其设置为加密模式。之后,您可以使用 doFinal 方法对字符串进行加密并获取加密后的字节。最后,您可以使用'Base64'类并返回编码后的字符串。

这是一个例子:

import java.security.PrivateKey
import java.security.KeyFactory
import javax.crypto.Cipher
import android.util.Base64

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
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-04-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-11-02
    相关资源
    最近更新 更多