Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/security/4.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 Can';t还原私钥RSA_Java_Security_Encryption_Rsa_Private Key - Fatal编程技术网

Java Can';t还原私钥RSA

Java Can';t还原私钥RSA,java,security,encryption,rsa,private-key,Java,Security,Encryption,Rsa,Private Key,我有一个关于java加密的问题。 我从用户那里获取密码,然后生成私钥和公钥。从公钥我创建密码,然后存储私钥和密码 然后,从第二个应用程序中,我再次从用户、密码文件和私钥读取密码,然后尝试将密码与密码和私钥的解密匹配 我的第一份申请: private static byte[] encrypt(byte[] inpBytes, PublicKey key, String xform) throws Exception { Cipher cipher = Cipher.getInstance(x

我有一个关于java加密的问题。 我从用户那里获取密码,然后生成私钥和公钥。从公钥我创建密码,然后存储私钥和密码

然后,从第二个应用程序中,我再次从用户、密码文件和私钥读取密码,然后尝试将密码与密码和私钥的解密匹配


我的第一份申请:

private static byte[] encrypt(byte[] inpBytes, PublicKey key,
String xform) throws Exception {
 Cipher cipher = Cipher.getInstance(xform);
 cipher.init(Cipher.ENCRYPT_MODE, key);
return cipher.doFinal(inpBytes);
}


 String xform = "RSA";
 // Generate a key-pair
 KeyPairGenerator kpg = null;
        try {
            kpg = KeyPairGenerator.getInstance("RSA");
        } catch (NoSuchAlgorithmException ex) {
            Logger.getLogger(Efarmogi_1.class.getName()).log(Level.SEVERE, null, ex);
        }
 kpg.initialize(512); // 512 is the keysize.
 KeyPair kp = kpg.generateKeyPair();
 /create public and private key
 PublicKey pubk = kp.getPublic();
 PrivateKey prvk = kp.getPrivate();

 //password from user 
 String password = T_Password.getText();

byte[] dataBytes = password.getBytes();
//create cipher
byte[] encBytes = null;
        try {
            encBytes = encrypt(dataBytes, pubk, xform);
        } catch (Exception ex) {
            Logger.getLogger(Efarmogi_1.class.getName()).log(Level.SEVERE, null, ex);
        }

//storing
//cipher
  FileOutputStream cipher = null;
        try {
            cipher = new FileOutputStream( "Xrhstes\\"+T_Username.getText()+"\\hash_"+T_Username.getText());

            cipher.write(encBytes);//write with bytes

            cipher.close();
        } catch (IOException ex) {
            Logger.getLogger(Efarmogi_1.class.getName()).log(Level.SEVERE, null, ex);
        }

//private key
 byte[] key2 = prvk.getEncoded();
            FileOutputStream keyfos2 = null;
        try {
            keyfos2 = new FileOutputStream("Xrhstes\\"+T_Username.getText()+"\\private_"+ T_Username.getText()+".pem");

            keyfos2.write(key2);

            keyfos2.close();
   private static byte[] decrypt(byte[] inpBytes, PrivateKey key,String xform) throws Exception{
Cipher cipher = Cipher.getInstance(xform);
cipher.init(Cipher.DECRYPT_MODE, key);
return cipher.doFinal(inpBytes);
}

//fetch private key           
byte[] prvk1 = new byte[(int)new File("C:\\...\\"+T_Username.getText()+"\\private_"+ T_Username.getText()).length()]; 

//make it from bytes to private key
  KeyFactory kf= KeyFactory.getInstance("RSA");
  PrivateKey prvk=kf.generatePrivate(new PKCS8EncodedKeySpec(prvk1));

//fetch cipher
 byte[] encBytes = new byte[(int)new File("C:\\...\\"+T_Username.getText()+"\\hash_"+ T_Username.getText()).length()]; 

//decrypt with our password given from user
    String xform = "RSA";

         byte[] decBytes = decrypt(encBytes,prvk, xform);

        boolean expected = java.util.Arrays.equals(password, decBytes);
        System.out.println("Test " + (expected ? "SUCCEEDED!" : "FAILED!"));

这是第二个应用程序:

private static byte[] encrypt(byte[] inpBytes, PublicKey key,
String xform) throws Exception {
 Cipher cipher = Cipher.getInstance(xform);
 cipher.init(Cipher.ENCRYPT_MODE, key);
return cipher.doFinal(inpBytes);
}


 String xform = "RSA";
 // Generate a key-pair
 KeyPairGenerator kpg = null;
        try {
            kpg = KeyPairGenerator.getInstance("RSA");
        } catch (NoSuchAlgorithmException ex) {
            Logger.getLogger(Efarmogi_1.class.getName()).log(Level.SEVERE, null, ex);
        }
 kpg.initialize(512); // 512 is the keysize.
 KeyPair kp = kpg.generateKeyPair();
 /create public and private key
 PublicKey pubk = kp.getPublic();
 PrivateKey prvk = kp.getPrivate();

 //password from user 
 String password = T_Password.getText();

byte[] dataBytes = password.getBytes();
//create cipher
byte[] encBytes = null;
        try {
            encBytes = encrypt(dataBytes, pubk, xform);
        } catch (Exception ex) {
            Logger.getLogger(Efarmogi_1.class.getName()).log(Level.SEVERE, null, ex);
        }

//storing
//cipher
  FileOutputStream cipher = null;
        try {
            cipher = new FileOutputStream( "Xrhstes\\"+T_Username.getText()+"\\hash_"+T_Username.getText());

            cipher.write(encBytes);//write with bytes

            cipher.close();
        } catch (IOException ex) {
            Logger.getLogger(Efarmogi_1.class.getName()).log(Level.SEVERE, null, ex);
        }

//private key
 byte[] key2 = prvk.getEncoded();
            FileOutputStream keyfos2 = null;
        try {
            keyfos2 = new FileOutputStream("Xrhstes\\"+T_Username.getText()+"\\private_"+ T_Username.getText()+".pem");

            keyfos2.write(key2);

            keyfos2.close();
   private static byte[] decrypt(byte[] inpBytes, PrivateKey key,String xform) throws Exception{
Cipher cipher = Cipher.getInstance(xform);
cipher.init(Cipher.DECRYPT_MODE, key);
return cipher.doFinal(inpBytes);
}

//fetch private key           
byte[] prvk1 = new byte[(int)new File("C:\\...\\"+T_Username.getText()+"\\private_"+ T_Username.getText()).length()]; 

//make it from bytes to private key
  KeyFactory kf= KeyFactory.getInstance("RSA");
  PrivateKey prvk=kf.generatePrivate(new PKCS8EncodedKeySpec(prvk1));

//fetch cipher
 byte[] encBytes = new byte[(int)new File("C:\\...\\"+T_Username.getText()+"\\hash_"+ T_Username.getText()).length()]; 

//decrypt with our password given from user
    String xform = "RSA";

         byte[] decBytes = decrypt(encBytes,prvk, xform);

        boolean expected = java.util.Arrays.equals(password, decBytes);
        System.out.println("Test " + (expected ? "SUCCEEDED!" : "FAILED!"));


我的问题是,当我尝试重新转换保存的字节时,返回到privateKey时,我遇到多个错误,即密钥类型无效(问题始于解码PKCS8EncodedKeySpec,注意到密钥规范无效)。我尝试了许多方法,但仍然是一样的,有人能告诉我我的错误在哪里吗?提前感谢

使用以下行:

byte[] prvk1 = new byte[(int)new File("C:\\...\\"+T_Username.getText()+"\\private_"+ T_Username.getText()).length()];

实际上,您创建了两个空字节数组。您仅使用
File.length()
指示数组的大小,这显然是不正确的。在实际读取文件后重试,例如使用方法(需要Java 8或更高版本)