【发布时间】:2014-11-25 17:47:00
【问题描述】:
我正在尝试使用我的 Android 4.4.2 手机来处理 pub 密钥并使用它验证签名。我使用谷歌应用引擎。请参阅下面我的系统错误和代码。 Tx 为您提供帮助。
11-25 18:30:00.271: W/System.err(11042): java.security.NoSuchAlgorithmException: KeyFactory SHA1withRSA implementation not found
11-25 18:30:00.271: W/System.err(11042): at org.apache.harmony.security.fortress.Engine.notFound(Engine.java:177)
11-25 18:30:00.271: W/System.err(11042): at org.apache.harmony.security.fortress.Engine.getInstance(Engine.java:151)
11-25 18:30:00.271: W/System.err(11042): at java.security.KeyFactory.getInstance(KeyFactory.java:81)
11-25 18:30:00.271: W/System.err(11042): at com.sample.activities.MainActivity$Task.onPostExecute(MainActivity.java:1304)
11-25 18:30:00.276: W/System.err(11042): at com.sample.activities.MainActivity$Task.onPostExecute(MainActivity.java:1)
11-25 18:30:00.276: W/System.err(11042): at android.os.AsyncTask.finish(AsyncTask.java:632)
11-25 18:30:00.276: W/System.err(11042): at android.os.AsyncTask.access$600(AsyncTask.java:177)
11-25 18:30:00.276: W/System.err(11042): at android.os.AsyncTask$InternalHandler.handleMessage(AsyncTask.java:645)
11-25 18:30:00.276: W/System.err(11042): at android.os.Handler.dispatchMessage(Handler.java:102)
11-25 18:30:00.276: W/System.err(11042): at android.os.Looper.loop(Looper.java:146)
11-25 18:30:00.276: W/System.err(11042): at android.app.ActivityThread.main(ActivityThread.java:5602)
11-25 18:30:00.276: W/System.err(11042): at java.lang.reflect.Method.invokeNative(Native Method)
11-25 18:30:00.276: W/System.err(11042): at java.lang.reflect.Method.invoke(Method.java:515)
11-25 18:30:00.276: W/System.err(11042): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1283)
11-25 18:30:00.276: W/System.err(11042): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1099)
11-25 18:30:00.276: W/System.err(11042): at dalvik.system.NativeStart.main(Native Method)
代码:
try {
X509EncodedKeySpec pubKeySpec = new X509EncodedKeySpec(
serverPubKey);
// Now you need a KeyFactory object to do the conversion. That
// object must be one that works with RSA keys.
KeyFactory keyFactory = KeyFactory.getInstance("SHA1withRSA");
// Finally, you can use the KeyFactory object to generate a
// PublicKey from the key specification.
PublicKey pubKey = keyFactory.generatePublic(pubKeySpec);
Signature sig = Signature.getInstance("RSA");
sig.initVerify(pubKey);
boolean verifies = sig.verify(dataSignature);
System.out.println("signature verifies: " + verifies);
} catch (InvalidKeyException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (NoSuchAlgorithmException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (InvalidKeySpecException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (SignatureException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
【问题讨论】:
-
请注意,您需要先信任公钥,然后才能将其用于签名验证。
标签: java google-app-engine cryptography rsa public-key-encryption