微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

Android:如何使用 RSA 签名?

如何解决Android:如何使用 RSA 签名?

我正在尝试对消息进行签名,但在加密和解密工作时,我总是收到此不兼容目的错误来进行签名。

我如何生成密钥:

fun generate(): KeyPair? {
    val kpg: KeyPairGenerator = KeyPairGenerator.getInstance(
        KeyProperties.KEY_ALGORITHM_RSA,"AndroidKeyStore"
    )
    val parameterSpec: KeyGenParameterSpec = KeyGenParameterSpec.Builder(
        "rsa",KeyProperties.PURPOSE_ENCRYPT or KeyProperties.PURPOSE_DECRYPT or KeyProperties.PURPOSE_SIGN or KeyProperties.PURPOSE_VERIFY or KeyProperties.PURPOSE_WRAP_KEY
    ).run {
        setEncryptionPaddings(KeyProperties.ENCRYPTION_PADDING_RSA_PKCS1)
        setSignaturePaddings(KeyProperties.SIGNATURE_PADDING_RSA_PKCS1)
        setDigests(KeyProperties.DIGEST_SHA256,KeyProperties.DIGEST_SHA512)
        build()
    }

    kpg.initialize(parameterSpec)

    return kpg.generateKeyPair()
}

我实际上是这样称呼它的:

val kp = Encryption.generateKeys()!!

我尝试签名的方式:

    val signature: ByteArray = Signature.getInstance("SHA256withRSA").run {
        initSign(pvKey)
        update(text.toByteArray())
        sign()
    }

堆栈跟踪:

     Caused by: java.security.InvalidKeyException: Keystore operation Failed
    at android.security.KeyStore.getInvalidKeyException(KeyStore.java:1378)
    at android.security.KeyStore.getInvalidKeyException(KeyStore.java:1388)
    at android.security.keystore.KeyStoreCryptoOperationUtils.getInvalidKeyExceptionForInit(KeyStoreCryptoOperationUtils.java:54)
    at android.security.keystore.AndroidKeyStoreSignatureSpiBase.ensureKeystoreOperationInitialized(AndroidKeyStoreSignatureSpiBase.java:219)
    at android.security.keystore.AndroidKeyStoreSignatureSpiBase.engineInitSign(AndroidKeyStoreSignatureSpiBase.java:99)
    at android.security.keystore.AndroidKeyStoreSignatureSpiBase.engineInitSign(AndroidKeyStoreSignatureSpiBase.java:77)
    at java.security.Signature$Delegate.init(Signature.java:1357)
    at java.security.Signature$Delegate.chooseProvider(Signature.java:1310)
    at java.security.Signature$Delegate.engineInitSign(Signature.java:1385)
    at java.security.Signature.initSign(Signature.java:679)
    at com.cannondev.messaging.utils.Encryption.sign(Encryption.kt:64)
    at com.cannondev.messaging.MessagingService.send(MessagingService.kt:78)
    at com.cannondev.messaging.ui.ConversationFragment.sendText(ConversationFragment.kt:114)
    at com.cannondev.messaging.ui.ConversationFragment.access$sendText(ConversationFragment.kt:33)
    at com.cannondev.messaging.ui.ConversationFragment$onCreateView$1.onClick(ConversationFragment.kt:106)
    at android.view.View.performClick(View.java:7448)
    at android.view.View.performClickInternal(View.java:7425)
    at android.view.View.access$3600(View.java:810)
    at android.view.View$PerformClick.run(View.java:28305)
    at android.os.Handler.handleCallback(Handler.java:938)
    at android.os.Handler.dispatchMessage(Handler.java:99)
    at android.os.Looper.loop(Looper.java:223)
    at android.app.ActivityThread.main(ActivityThread.java:7656)
    at java.lang.reflect.Method.invoke(Native Method) 
    at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:592) 
    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:947) 
 Caused by: android.security.KeyStoreException: Incompatible purpose
    at android.security.KeyStore.getKeyStoreException(KeyStore.java:1301)

异常是在 initSign 这一行引起的

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。