我试图对AndroidKeyStore中的密钥执行RSA加密和解密。加密成功完成,但是当我尝试解密时,它会抛出一个InvalidKeyException:密钥库操作在Cipher.init()上失败。InvalidKeyException:在Android设备上进行RSA解密时密钥库操作失败

这里是我的keygeneration代码:

KeyPairGenerator kpGenerator = KeyPairGenerator.getInstance("RSA", "AndroidKeyStore");

AlgorithmParameterSpec spec = null;

spec = new KeyGenParameterSpec.Builder(mAlias,

KeyProperties.PURPOSE_ENCRYPT | KeyProperties.PURPOSE_DECRYPT)

.setDigests(KeyProperties.DIGEST_SHA256, KeyProperties.DIGEST_SHA512)

.setEncryptionPaddings(KeyProperties.ENCRYPTION_PADDING_RSA_PKCS1)

.build();

kpGenerator.initialize(spec);

KeyPair kp = kpGenerator.generateKeyPair();

这里是我的加密代码:

KeyStore keyStore = KeyStore.getInstance("AndroidKeyStore");

keyStore.load(null);

KeyStore.PrivateKeyEntry entry = (KeyStore.PrivateKeyEntry) keyStore.getEntry(mAlias, null);

Cipher cip = null;

RSAPublicKey pubKey = (RSAPublicKey) entry.getCertificate().getPublicKey();

cip = Cipher.getInstance("RSA/ECB/NoPadding");

cip.init(Cipher.ENCRYPT_MODE, pubKey);

byte[] encryptBytes = cip.doFinal(challenge.getBytes());

String encryptedStr64 = Base64.encodeToString(encryptBytes, Base64.DEFAULT);

这里是我的解密代码:

KeyStore keyStore = KeyStore.getInstance("AndroidKeyStore");

keyStore.load(null);

KeyStore.PrivateKeyEntry entry = (KeyStore.PrivateKeyEntry) keyStore.getEntry(mAlias, null);

Cipher cip = null;

cip = Cipher.getInstance("RSA/ECB/NoPadding");

cip.init(Cipher.DECRYPT_MODE, entry.getPrivateKey());

byte[] decryptedBytes = cip.doFinal(Base64.decode(encrypted64, Base64.DEFAULT));

String plainText = new String(decryptedBytes);

我知道,关键中的填充代码与我的加密/解密代码不同。但是,当我将密钥生成代码的填充更改为KeyProperties.ENCRYPTION_PADDING_NONE时,我在kpGenerator.initialize(spec)上得到了一个InvalidAlgorithmParameterException。 使用“RSA/ECB/PKCS1Padding”进行解密,它可以工作。无论在加密填充,它始终工作。

是的,我也意识到使用无填充的安全含义,但对于我的应用程序,我需要一个确定性的密文。

下面是与InvalidKeyException异常堆栈跟踪:

03-06 09:10:32.710 5058 5058 W System.err: java.security.InvalidKeyException: Keystore operation failed

03-06 09:10:32.713 5058 5058 W System.err: at android.security.KeyStore.getInvalidKeyException(KeyStore.java:692)

03-06 09:10:32.713 5058 5058 W System.err: at android.security.KeyStore.getInvalidKeyException(KeyStore.java:712)

03-06 09:10:32.713 5058 5058 W System.err: at android.security.keystore.KeyStoreCryptoOperationUtils.getInvalidKeyExceptionForInit(KeyStoreCryptoOperationUtils.java:54)

03-06 09:10:32.713 5058 5058 W System.err: at android.security.keystore.KeyStoreCryptoOperationUtils.getExceptionForCipherInit(KeyStoreCryptoOperationUtils.java:89)

03-06 09:10:32.713 5058 5058 W System.err: at android.security.keystore.AndroidKeyStoreCipherSpiBase.ensureKeystoreOperationInitialized(AndroidKeyStoreCipherSpiBase.java:263)

03-06 09:10:32.713 5058 5058 W System.err: at android.security.keystore.AndroidKeyStoreCipherSpiBase.engineInit(AndroidKeyStoreCipherSpiBase.java:108)

03-06 09:10:32.713 5058 5058 W System.err: at javax.crypto.Cipher.tryTransformWithProvider(Cipher.java:612)

03-06 09:10:32.713 5058 5058 W System.err: at javax.crypto.Cipher.tryCombinations(Cipher.java:532)

03-06 09:10:32.714 5058 5058 W System.err: at javax.crypto.Cipher.getSpi(Cipher.java:437)

03-06 09:10:32.714 5058 5058 W System.err: at javax.crypto.Cipher.init(Cipher.java:815)

03-06 09:10:32.714 5058 5058 W System.err: at javax.crypto.Cipher.init(Cipher.java:774)

03-06 09:10:32.714 5058 5058 W System.err: at dfpidentifiers.my.test.app.MainActivity.decrypt(MainActivity.java:950)

03-06 09:10:32.714 5058 5058 W System.err: at dfpidentifiers.my.test.app.MainActivity.onCreate(MainActivity.java:117)

03-06 09:10:32.714 5058 5058 W System.err: at android.app.Activity.performCreate(Activity.java:6251)

03-06 09:10:32.714 5058 5058 W System.err: at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1107)

03-06 09:10:32.714 5058 5058 W System.err: at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2369)

03-06 09:10:32.714 5058 5058 W System.err: at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2476)

03-06 09:10:32.714 5058 5058 W System.err: at android.app.ActivityThread.-wrap11(ActivityThread.java)

03-06 09:10:32.714 5058 5058 W System.err: at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1344)

03-06 09:10:32.714 5058 5058 W System.err: at android.os.Handler.dispatchMessage(Handler.java:102)

03-06 09:10:32.714 5058 5058 W System.err: at android.os.Looper.loop(Looper.java:148)

03-06 09:10:32.714 5058 5058 W System.err: at android.app.ActivityThread.main(ActivityThread.java:5417)

03-06 09:10:32.714 5058 5058 W System.err: at java.lang.reflect.Method.invoke(Native Method)

03-06 09:10:32.714 5058 5058 W System.err: at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:726)

03-06 09:10:32.714 5058 5058 W System.err: at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:616)

03-06 09:10:32.714 5058 5058 W System.err: Caused by: android.security.KeyStoreException: Incompatible padding mode

03-06 09:10:32.714 5058 5058 W System.err: at android.security.KeyStore.getKeyStoreException(KeyStore.java:632)

03-06 09:10:32.714 5058 5058 W System.err: ... 24 more

从堆栈跟踪,这似乎是一个不兼容的填充模式,但如何生成支持不填充一个密钥?

+0

请问您可以发布完整的stacktrace吗? –

+1

请注意,确定性非对称密码通常被认为是不可行区域;攻击者可以简单地尝试加密几条消息以找到与你的密文相匹配的消息。如果在消息中已经有足够的随机字节,那么我会考虑使用例如扩展它到全模数大小(-1最高有效位)。 HKDF或XOF和RSA加密此值。然后,你可以再次使用HKDF从该值(在加密之前/解密之后)导出一个对称密钥,并最终用它来用例如密文对密文进行加密。 AES-GCM。 –

+0

也许你需要传递密码的回调处理程序。如果这是你的问题,请允许我回答这个问题;没有堆栈跟踪或密钥存储,我们无法验证任何解决方案。 –

android 找不到密钥,InvalidKeyException:在Android设备上进行RSA解密时密钥库操作失败...相关推荐

  1. android 模拟器应用未安装,当我在Android Studio中运行它时,Android应用程序未安装在模拟器或设备上...

    我正在开发Android应用程序.在我的应用程序中,我正在测试在设备和模拟器上运行的应用程序.这是我的第三个Android应用程序开发.当我开发其他应用程序时,应用程序会自动安装在设备上或模拟器上的启 ...

  2. android ndk arm,Android NDK ARM构建设置可在大多数设备上运行?

    我有一些Android NDK应用程序出来了,人们抱怨我的应用程序无法在他们的手机上运行.我想知道的是哪些编译设置将支持市场上大多数(如果不是全部)ARM设备? 我的问题似乎是armeabi-v7a设 ...

  3. android隐藏系统ui_如何在非库存设备上获取Android的系统UI调谐器

    android隐藏系统ui One benefit users of stock Android devices have had for the past few iterations of the ...

  4. android.process.media已停止 三星,android – 在三星设备上播放mp4文件时出现...

    我正在使用经典的VideoView实现在Android上播放视频. 相同的mp4文件网址在HTC Desire上运行正常.但它不适用于三星设备. 三星Galaxy S1和三星Galaxy Tab说:& ...

  5. Android应用基础知识(4)---Android处理运行时变更

    Android处理运行时变更 有些设备配置可能会在运行时发生变化(例如屏幕方向.键盘可用性及语言). 发生这种变化时,Android 会重启正在运行的 Activity(先后调用 onDestroy( ...

  6. android canvas 工作流_行情艰难,Android初中级面试题助你逆风翻盘,每题都有详细答案...

    码个蛋(codeegg) 第 905 次推文 作者:夜猫少年 链接:https://juejin.im/post/5c8211fee51d453a136e36b0 Activity篇 1.说下Acti ...

  7. android手机api等级_什么是Android API 级别?

    什么是 API 级别? API 级别是一个对 Android 平台版本提供的框架 API 修订版进行唯一标识的整数值. Android 平台提供了一种框架 API,应用可利用它与底层 Android ...

  8. android初学者_初学者:如何在Android设备上的打开的应用程序之间切换

    android初学者 When you run an app on your Android device, you can minimize it and return to the home sc ...

  9. Android 设备上使得google play store 应用市场中不能搜索到Netflix应用

    Android 使得google play store 中不能搜索到Netflix 1.需求 有时候在开发中,为了版权问题,有的应用虽然在应用商城(google play store)中可以搜到,但是 ...

  10. android查询流量套餐,实现流量套餐  |  Android 开源项目  |  Android Open Source Project...

    Android 9 可让运营商直接在"设置"应用中向用户提供权威的套餐详情,以减少用户的困惑和支持来电次数.在运行 Android 4.0 或更高版本的设备上,用户可以在" ...

最新文章

  1. python小工具封装_python接口自动化(二)——封装需要用到的工具类
  2. 深度学习基础:张量运算
  3. 动态隐藏ALV的行和列
  4. 确保字符串的每个单词首字母都大写,其余部分小写
  5. java kmp算法_KMP算法java版实现
  6. Java - 常用工具类 - 集合框架
  7. DirectSound开发
  8. wangEditor-3.1.1 自己扩展的,增加代码块行号
  9. python使用scrapy_Python实现从脚本里运行scrapy的方法
  10. 有关asp.net技术的外文文献_医学科技论文写作中参考文献的标准格式及常见问题...
  11. 【old】Python学习笔记
  12. C语言排序方法------快速排序
  13. 几种常用的抽奖方案综述(草稿)
  14. 影楼——修图基本知识
  15. 导出(合并)手机QQ浏览器下载的视频
  16. python远程连接windows_python winrm 连接windows
  17. cmd怎么查看当前静态路由_计算机cmd命令之route,查看路由表,或配置一个更有效的路由...
  18. 计算机如何驱动无线网络,电脑如何安装全民WiFi驱动
  19. 2017春季实习生面试经历+找实习攻略
  20. 微课 展示 php 源码,PHP从零基础到项目实战(微课视频版)

热门文章

  1. 斯坦福大学Andrew Ng教授主讲的《机器学习》公开课观后感
  2. Linux 2.4.x 网络协议栈QoS模块(TC)的设计与实现
  3. Android Camera2+HAL3架构
  4. 编译最新版webrtc源码和编译好的整个项目10多个G【分享】
  5. 电话聊天狂人(25 分)(散列函数)
  6. D - Maze(深度搜索+思维转换)
  7. Java中的可变参数使用
  8. 【数据结构】KMP算法分析与理解(图文分析)
  9. KDevelop下如何选择不同的源文件进行执行
  10. 求数列的最大子段和java_十大经典排序算法(Java版本)