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

标签 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)

最佳答案

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

关于java - 如何在java中使用私钥(.private)解密数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12388779/

相关文章:

java - 打包 JCE Unlimited Strength Policy 文件; JCE 的替代品?

java - RSA 解密错误 - IllegalBlockSizeException : Data must not be longer than 128 bytes

java - 是否可以在 Java 程序中确定系统限制(就像 Linux 上的 ulimit 一样)?

java - 在 CodeEval 网站上提交代码

java - 文本完全展开后的 SWT 水平线

java - 4K 屏幕上的 Netbeans 缩放

c++ - 堆栈变量已损坏

c++ - 使用 C/C++ 和 openssl 处理单个 AES-128-ECB block

ssl - 为什么不信任有效的中间 x509 证书?

java.security.NoSuchAlgorithmException : Cannot find any provider supporting RSA/NONE/PKCS1Padding in jar-file