如何使用java中的私钥(.private)解密数据

时间:2012-09-12 13:00:50

标签: java openssl jce

数据在PHP中使用OpenSSL加密,我想解密java但在java中收到错误

PHP加密代码 -

public function getEncryptedString($cardNumber,$key_id){
              $encryptedCardNumber = '';
              $key_name = "key_{$key_id}"; 
              $pub_key_path =$key_name.".public";  
              $fp=fopen ($pub_key_path,"r"); //Open the public key (key_8.public)
              $pub_key = fread($fp,8192);  //Read public key  key (key_8.public) into 
              fclose($fp); 
               openssl_public_encrypt($cardNumber,$encryptedCardNumber,$pub_key);   
              if($key_id > 4) return rawurlencode(base64_encode($encryptedCardNumber));  
              else return addslashes($encryptedCardNumber);          

    }

JAVA中的解密代码 -

public static String getDecryptedValue(int keyId,String encryptedCCNumber ,String passPhrase){
              String result="";

              String privateKeyFileName="key_8.private";
              String privateKeyLocation= PropertiesUtil.getProperty("PUBLIC_PRIVATE_KEY_LOCATION");
             String privateKeyFileNameLocation=privateKeyLocation+privateKeyFileName;
              String decryptedValue= getDecryptedMessage(privateKeyFileNameLocation,encryptedCCNumber,passPhrase);
              return result;

       }


       public static String getDecryptedMessage(String privateKeyFileNameLocation, String encryptedCCNumber,String passPhrase) 
                { 
              byte[] decodedBytesCCNumber= Base64.decodeBase64(encryptedCCNumber.getBytes());
           byte[] decryptedMessage=null; 
           try { 
               Cipher cipher = Cipher.getInstance("RSA"); 

                PrivateKey privateKey = getPrivateKey(privateKeyFileNameLocation,passPhrase);
               cipher.init(Cipher.DECRYPT_MODE, privateKey); 
               decryptedMessage = cipher.doFinal(decodedBytesCCNumber); 

           } catch (Throwable t) { 
              t.printStackTrace();
           }

           System.out.println("new String(decryptedMessage)"+new String(decryptedMessage));
           return new String(decryptedMessage); 

       } 

       private static PrivateKey getPrivateKey(String privateKeyFileNameLocation,String passPhrase) throws KeyStoreException, IOException, NoSuchAlgorithmException, CertificateException, UnrecoverableEntryException {
               KeyStore ks = KeyStore.getInstance("PKCS12");
               ks.load(new FileInputStream(privateKeyFileNameLocation), passPhrase.toCharArray());
               String alias = (String) ks.aliases().nextElement();
               KeyStore.PrivateKeyEntry keyEntry = (KeyStore.PrivateKeyEntry) ks.getEntry(alias, new KeyStore.PasswordProtection(passPhrase.toCharArray()));
               return keyEntry.getPrivateKey();
           }

Java代码给出了以下错误。

java.io.IOException: toDerInputStream rejects tag type 45
    at sun.security.util.DerValue.toDerInputStream(DerValue.java:847)
    at sun.security.pkcs12.PKCS12KeyStore.engineLoad(PKCS12KeyStore.java:1221)
    at java.security.KeyStore.load(KeyStore.java:1214)

1 个答案:

答案 0 :(得分:2)

您正在对密文的Base64编码进行URL编码,但您只是解密它的base64解码。要么丢失URL编码,要么在接收器处对其进行解码。