2015-04-06 3 views
-4

Привет, я пытаюсь реализовать код, предоставленный anindonesian в Flexiprovider - How to encrypt/de with formatted keypair на Android.Ошибка генерации ключа ECC

Я получаю исключение NullPointerException для kpg.initialize (brainpoolP160R1);

Я новичок в Android и криптографии, поэтому любая помощь будет оценена по достоинству. Здесь я только что создал страницу, которая генерирует ключ ECC и шифрует/дешифрует некоторые данные и отображает их в текстовом поле.

import android.os.Bundle; 
import android.support.v7.app.ActionBarActivity; 
import android.util.Base64; 
import android.view.Menu; 
import android.view.MenuItem; 
import android.widget.TextView; 
import org.bouncycastle.jce.provider.BouncyCastleProvider; 
import java.security.InvalidAlgorithmParameterException; 
import java.security.InvalidKeyException; 
import java.security.KeyPair; 
import java.security.KeyPairGenerator; 
import java.security.NoSuchAlgorithmException; 
import java.security.NoSuchProviderException; 
import java.security.PrivateKey; 
import java.security.PublicKey; 
import java.security.Security; 
import java.security.spec.ECGenParameterSpec; 

import javax.crypto.BadPaddingException; 
import javax.crypto.Cipher; 
import javax.crypto.IllegalBlockSizeException; 
import javax.crypto.NoSuchPaddingException; 

public class ECC_page extends ActionBarActivity { 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_ecc_page); 

     Security.addProvider(new BouncyCastleProvider()); 

     KeyPairGenerator kpg = null; 
     try { 
      kpg = KeyPairGenerator.getInstance("ECIES", "BC"); 
     } catch (NoSuchAlgorithmException | NoSuchProviderException e) { 
      e.printStackTrace(); 
     } 
     ECGenParameterSpec brainpoolP160R1 = new ECGenParameterSpec("brainpoolP160R1"); 

     try { 
      assert kpg != null; 
      kpg.initialize(brainpoolP160R1); //I am getting the error here 
     } catch (InvalidAlgorithmParameterException ignored) { 


     } 

     KeyPair kp = kpg.generateKeyPair(); 

     PublicKey publicKey = kp.getPublic(); 
     PrivateKey privateKey = kp.getPrivate(); 

     byte[] PublicKey = publicKey.getEncoded(); 
     byte[] PrivateKey = privateKey.getEncoded(); 

     Cipher c = null; 
     try { 
      c = Cipher.getInstance("ECIESWithAES/DHAES/NoPadding", "BC"); 
     } catch (NoSuchAlgorithmException | NoSuchPaddingException | NoSuchProviderException e) { 
      e.printStackTrace(); 
     } 

     try { 
      c.init(Cipher.ENCRYPT_MODE, publicKey); 
     } catch (InvalidKeyException e) { 
      e.printStackTrace(); 
     } 

     byte[] cipher = new byte[0]; 
     try { 
      cipher = c.doFinal("This is the message".getBytes()); 
     } catch (IllegalBlockSizeException | BadPaddingException e) { 
      e.printStackTrace(); 
     } 
     TextView eccencoded = (TextView) findViewById(R.id.eccencoded); 
     eccencoded.setText("[ENCODED]:\n" + 
       Base64.encodeToString(cipher, Base64.DEFAULT) + "\n"); 


     try { 
      c.init(Cipher.DECRYPT_MODE, privateKey); 
     } catch (InvalidKeyException e) { 
      e.printStackTrace(); 
     } 

     byte[] plaintext = new byte[0]; 
     try { 
      plaintext = c.doFinal(cipher); 
     } catch (IllegalBlockSizeException | BadPaddingException e) { 
      e.printStackTrace(); 
     } 
     TextView eccdecoded = (TextView) findViewById(R.id.eccdecoded); 
     eccdecoded.setText("[DECODED]:\n" + 
       Base64.encodeToString(plaintext, Base64.DEFAULT) + "\n"); 


    } 

} 

Я вставил ApacheDS-все-1.5.5.jar в моей папке ЛИЭС ..

Ошибка java.security.NoSuchAlgorithmException: осуществление KeyPairGenerator ECIES не найдено Вызванные: java.lang.NullPointerException в com.example.vinay.myapplication.ECC_page.onCreate (ECC_page.java:47)

Также, пожалуйста, указать на ошибки в коде, если это возможно ... сосуд файл InSe rt был предложен андроид-студией.

ответ

0

FlexiProvider не Bouncy Castle ("BC").

Try:

kpg = KeyPairGenerator.getInstance("ECIES"); 

или:

kpg = KeyPairGenerator.getInstance("ECIES", "FlexiEC"); 

для конкретного выбора поставщика.

Обратите внимание, что генерация пары ключей эллиптической кривой идентична для ECDH (ключевое соглашение), ECDSA (генерация цифровой подписи) и ECIES (гибридное шифрование). Таким образом, вы можете попробовать:

kpg = KeyPairGenerator.getInstance("EC"); 

или:

kpg = KeyPairGenerator.getInstance("EC", "FlexiEC"); 

Добавление поставщиков флекси вместо провайдера Надувной замок может также помочь:

Security.addProvider(new BouncyCastleProvider()); 

, очевидно, также неверно ,

+0

Я использую надувной замок сам, а не FlexiProvider. В ссылке, которую я упомянул, есть ответ с реализацией Bouncy Castle. Не могли бы вы также сказать мне ответ с точки зрения самонадеянного замка? Также есть ли файл jar, который я вставил правильно? –

+0

Это было не так ясно из контекста. Нет, этот .jar неверен, это, скорее всего, Apache Directory Service .jar (по крайней мере, если я правильно помню). Вам нужен Загородный замок или Спанговый замок. Кроме того, вам необходимо зарегистрировать поставщика. Код Bouncy Castle не содержит слишком много информации, но я уверен, что установка объясняется. –

Смежные вопросы