Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/365.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 存储/检索椭圆曲线加密(ECC)公钥和私钥_Java_Android - Fatal编程技术网

Java 存储/检索椭圆曲线加密(ECC)公钥和私钥

Java 存储/检索椭圆曲线加密(ECC)公钥和私钥,java,android,Java,Android,我必须编写代码来生成ECC密钥对 然后我用公钥加密字符串,用私钥解密 现在我通过将密钥对写入pem文件并存储在外部内存中来存储密钥对 这似乎不安全 那么如何存储和检索这些密钥呢 以下是生成密钥对并写入pem文件的代码: btnGenKey.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { ECNamedCurvePa

我必须编写代码来生成ECC密钥对

然后我用公钥加密字符串,用私钥解密

现在我通过将密钥对写入pem文件并存储在外部内存中来存储密钥对

这似乎不安全

那么如何存储和检索这些密钥呢

以下是生成密钥对并写入pem文件的代码:

btnGenKey.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            ECNamedCurveParameterSpec spec = ECNamedCurveTable.getParameterSpec("prime256v1");
            try {
                KeyPairGenerator g = KeyPairGenerator.getInstance("ECDSA","SC");
                g.initialize(spec, new SecureRandom());
                KeyPair keyPair = g.generateKeyPair();
                privateKey = keyPair.getPrivate();
                publicKey = keyPair.getPublic();
                Toast.makeText(MainActivity.this, "GEN KEY SUCCESS!!", Toast.LENGTH_SHORT).show();
                String state;
                state = Environment.getExternalStorageState();
                if(Environment.MEDIA_MOUNTED.equals(state))
                {
                    File root = Environment.getExternalStorageDirectory();
                    File dir = new File(root.getAbsolutePath()+"/EDCSA1");
                    if(!dir.exists())
                    {
                        dir.mkdir();
                    }
                    File pub = new File(dir,"pub.pem");
                    File prv = new File(dir,"pri.pem");
                    try
                    {
                        FileOutputStream fileOutputStream = new FileOutputStream(pub);
                        StringWriter writer = new StringWriter();
                        PemWriter pemWriter = new PemWriter(writer);
                        pemWriter.writeObject(new PemObject("PUBLIC KEY",publicKey.getEncoded()));
                        pemWriter.flush();
                        pemWriter.close();
                        String publickeyPem = writer.toString();
                        fileOutputStream.write(publickeyPem.getBytes());
                        fileOutputStream.close();
                        Toast.makeText(MainActivity.this, "SAVE PUBLICKEY", Toast.LENGTH_SHORT).show();
                        ///
                        FileOutputStream fileOutputStream2 = new FileOutputStream(prv);
                        StringWriter writer2 = new StringWriter();
                        PemWriter pemWriter2 = new PemWriter(writer2);
                        pemWriter2.writeObject(new PemObject("PRIVATE KEY",privateKey.getEncoded()));
                        pemWriter2.flush();
                        pemWriter2.close();
                        String privatekeyPem = writer2.toString();
                        fileOutputStream2.write(privatekeyPem.getBytes());
                        fileOutputStream2.close();
                        Toast.makeText(MainActivity.this, "SAVE PRIVATE", Toast.LENGTH_SHORT).show();
                    }
                    catch (Exception ex)
                    {
                        ex.printStackTrace();
                    }
                }

            } catch (Exception e) {
                e.printStackTrace();
            }
        }
    });
我不建议使用pem文件。在安卓系统中存储机密信息的最佳方法是在密钥库中,因为它非常安全。了解更多有关密钥库的信息

如果您正在寻找要应用的密码转换,请参考,因为这里有一个可以使用的算法和密码转换列表

下面是关于如何使用所有这些的一般想法

1) 初始化密钥库,生成密钥对(公钥和私钥)
2) 加密字符串并将其存储在存储器中(共享首选项、数据库等)
3) 从存储器中获取加密字符串并解密以供使用

更新:示例

如果您想要完整的工作流程,请参考这些示例 1)
2)

当然,我认为pem文件的安全性不好。我必须阅读你链接中的密钥库,但是你不能给我例子代码吗?谢谢你的帮助。