2012-06-29 83 views
3

我採用的是Android 4.1鑰匙扣和下面的代碼工作得很好下4.0,但現在給了我一個空指針異常(密碼無法讀取內部的一些屬性)使用的Android 4.1鑰匙扣

privateKey = KeyChain.getPrivateKey(context,mAlias); 
byte[] data = // some biary data 
Cipher rsasinger = javax.crypto.Cipher.getInstance("RSA/ECB/PKCS1PADDING"); 
rsasinger.init(Cipher.ENCRYPT_MODE, privkey); 

byte[] signed_bytes = rsasinger.doFinal(data); 

我處理來自KeyChain的私鑰作爲不透明的,並簡單地將它與java安全Api一起使用。需要我需要以不同的方式使用KeyChain API嗎?

+0

NullpointerException發生在哪裏(源代碼行)?順便說一句:爲什麼你使用密碼進行簽名?在RSA中,如果您加密數據塊的消息摘要,則可以使用Signature。 – Robert

回答

3

經過進一步調試並通過與Google engenier聯繫(謝謝!),結果發現Android註冊了不同的JAVA Crypto提供程序,只有OpenSSL提供程序能夠使用Keystore中的PrivateKey。

但有一些黑客和使用/system/lib/ssl/engines/libkeystore.so應該可以解決這個問題。

請參閱http://code.google.com/p/ics-openvpn/source/browse/jni/jbcrypto.cpp和proccessSignJellyBean在http://code.google.com/p/ics-openvpn/source/browse/src/de/blinkt/openvpn/OpenVpnManagementThread.java#446爲我的解決方案。

+0

這是一個跟蹤的問題,Google計劃修復它嗎? – zer0stimulus

+0

Jellybean 4.2允許更多的加密算法與OpenSSL Provider一起使用。 – plaisthos