2017-02-28 19 views
0

ハードウェアでサポートされているキーストアで生成されたKeyPairでAndroidアプリで暗号化/復号化を試みています。ここに私の鍵生成コードは次のとおりです。RSA秘密鍵で暗号化しようとしたときに、AndroidアプリでInvalidKeyExceptionが発生しました

public void createKeys() { 
    Context ctx = getApplicationContext(); 
    Calendar start = new GregorianCalendar(); 
    Calendar end = new GregorianCalendar(); 
    end.add(Calendar.YEAR, 1); 
    try { 
     KeyPairGenerator kpGenerator = KeyPairGenerator.getInstance("RSA", "AndroidKeyStore"); 
     AlgorithmParameterSpec spec = null; 

     if (Build.VERSION.SDK_INT > Build.VERSION_CODES.JELLY_BEAN_MR1 && Build.VERSION.SDK_INT < Build.VERSION_CODES.M) { 
      spec = new KeyPairGeneratorSpec.Builder(ctx) 
        .setAlias(mAlias) 
        .setSubject(new X500Principal("CN=" + mAlias)) 
        .setSerialNumber(BigInteger.valueOf(1337)) 
        .setStartDate(start.getTime()) 
        .setEndDate(end.getTime()) 
        .build(); 
     } else if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) { 
      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(); 
    } catch (NoSuchAlgorithmException e) { 
     Log.w(TAG, "RSA not supported", e); 
    } catch (NoSuchProviderException e) { 
     Log.w(TAG, "No such provider: AndroidKeyStore"); 
    } catch (InvalidAlgorithmParameterException e) { 
     Log.w(TAG, "No such provider: AndroidKeyStore"); 
    } 
} 

は、ここでの暗号化コードは私です:

public String encrypt(String challenge) { 
    try { 
     KeyStore mKeyStore = KeyStore.getInstance("AndroidKeyStore"); 
     mKeyStore.load(null); 
     KeyStore.PrivateKeyEntry entry = (KeyStore.PrivateKeyEntry) mKeyStore.getEntry(mAlias, null); 
     Cipher cip = null; 
     cip = Cipher.getInstance("RSA/ECB/PKCS1Padding"); 
     cip.init(Cipher.ENCRYPT_MODE, entry.getPrivateKey()); 
     byte[] encryptBytes = cip.doFinal(challenge.getBytes()); 
     String encryptedStr64 = Base64.encodeToString(encryptBytes, Base64.NO_WRAP); 
     return encryptedStr64; 
    } catch (NoSuchAlgorithmException e) { 
     Log.w(TAG, "No Such Algorithm Exception"); 
     e.printStackTrace(); 
    } catch (UnrecoverableEntryException e) { 
     Log.w(TAG, "Unrecoverable Entry Exception"); 
     e.printStackTrace(); 
    } catch (KeyStoreException e) { 
     Log.w(TAG, "KeyStore Exception"); 
     e.printStackTrace(); 
    } catch (InvalidKeyException e) { 
     Log.w(TAG, "Invalid Key Exception"); 
     e.printStackTrace(); 
    } catch (NoSuchPaddingException e) { 
     Log.w(TAG, "No Such Padding Exception"); 
     e.printStackTrace(); 
    } catch (BadPaddingException e) { 
     Log.w(TAG, "Bad Padding Exception"); 
     e.printStackTrace(); 
    } catch (IllegalBlockSizeException e) { 
     Log.w(TAG, "Illegal Block Size Exception"); 
     e.printStackTrace(); 
    } catch (CertificateException e) { 
     Log.w(TAG, "Certificate Exception"); 
    } catch (IOException e) { 
     Log.w(TAG, "IO Exception", e); 
    } 
    return null; 
} 

鍵生成が正常に完了します。また、KeyInfo.isInsideSecureHardware()を使用してハードウェアでバックアップされていることを確認します。しかし、私は暗号化()のcip.init(Cipher.ENCRYPT_MODE、entry.getPrivateKey())行でInvalidKeyExceptionを取得し続けます。正確な例外は

java.security.InvalidKeyException: Keystore operation failed 

です。だれが知っていますか?

答えて

1

暗号化は、公開鍵を使用する場合にのみ意味を持ちます。秘密鍵で暗号化すると、実際に署名が作成されます。 Java/Androidには別のクラスがあります。

+0

私はプライベートキーで署名しようとしましたが、無効キー例外が発生しています。キーストア操作が失敗しました。 AndroidにRSA署名/検証のコード例はありますか? – user1118764

+0

だから、あなたはそれを解決しましたか?いくつかのコードであなた自身の答えを追加することができます。 –

+0

ああ、私はしました。あなたの答えは正しいです。私はプライベートキーで暗号化できるという印象を受けました。これを行ったgithubのサンプルコードがあったからです。明らかにそれは動作しません。 – user1118764

関連する問題