Android 密钥生成错误

Android 密钥生成错误,android,cryptography,bouncycastle,public-key-encryption,Android,Cryptography,Bouncycastle,Public Key Encryption,您好,我正在尝试在android上实现由一位印度尼西亚人提供的代码 我得到一个kpg.initialize(brainpoolP160R1)的NullPointerException 我对安卓和加密技术还不熟悉,所以任何帮助都将不胜感激。 在这里,我刚刚创建了一个页面,该页面生成ECC密钥,对一些数据进行加密/解密,并将其显示在文本框中 import android.os.Bundle; import android.support.v7.app.ActionBarActivity; impor

您好,我正在尝试在android上实现由一位印度尼西亚人提供的代码

我得到一个kpg.initialize(brainpoolP160R1)的NullPointerException

我对安卓和加密技术还不熟悉,所以任何帮助都将不胜感激。 在这里,我刚刚创建了一个页面,该页面生成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");


    }

}
我已经在我的libs文件夹中插入了apacheds-all-1.5.5.jar

错误是 java.security.NoSuchAlgorithmException:找不到KeyPairGenerator ECIES实现 原因:java.lang.NullPointerException 在com.example.vinay.myapplication.ECC_page.onCreate(ECC_page.java:47)上

如果可能,请指出代码中的任何错误。。。
android studio建议插入jar文件。

FlexiProvider不是Bouncy Castle(
“BC”

尝试:

或:

用于特定的提供者选择

请注意,椭圆曲线密钥对生成与ECDH(密钥协议)、ECDSA(数字签名生成)和ECIES(混合加密)相同。所以你也可以试试:

kpg = KeyPairGenerator.getInstance("EC");
或:


添加flexi提供程序而不是Bouncy Castle提供程序也有助于:

Security.addProvider(new BouncyCastleProvider());

显然也不正确。

我使用的是bouncy castle本身,而不是FlexiProvider。在我提到的链接中,有一个关于Bouncy Castle实现的答案。你能告诉我答案吗,就弹跳城堡本身而言?我插入的jar文件也是正确的吗?从上下文来看,这不是很清楚。不,这个.jar是不正确的,毫无疑问,它是Apache目录服务.jar(至少如果我没记错的话)。你需要弹性城堡或海绵城堡。此外,您需要注册提供者。BouncyCastle代码没有太多的信息,但我很确定安装过程已经解释过了。
kpg = KeyPairGenerator.getInstance("EC");
kpg = KeyPairGenerator.getInstance("EC", "FlexiEC");
Security.addProvider(new BouncyCastleProvider());