如何用java中的RSA密钥加密解密

我需要用openssl生成的rsaprivatekey.pemrsapublickey.pem密钥替换从Unix到java代码的加密和解密步骤

我生成了密钥

 openssl genrsa -out /tmp/rsaprivatekey.pem -des3 1024 openssl rsa -in /tmp/rsaprivatekey.pem -pubout -out /tmp/rsapublickey.pem 

我在unix中使用键(我需要在java中执行)

 echo "Text to encript"| openssl rsautl -encrypt -inkey /tmp/rsapublickey.pem -pubin -out out.enc openssl rsautl -decrypt -inkey /tmp/rsaprivatekey.pem -in out.enc 

这是我尝试这样做的

 public static void main(String[] args) { Base64 base64 = new Base64(); String TextStream = "this is the input text"; byte[] Cipher; System.out.println("input:\n" + TextStream); Cipher = encrypt(TextStream); System.out.println("cipher:\n" + base64.encodeAsString(Cipher)); System.out.println("decrypt:\n" + decrypt(Cipher)); } private static byte[] encrypt(String Buffer) { try { Cipher rsa; rsa = Cipher.getInstance("RSA"); rsa.init(Cipher.ENCRYPT_MODE, getPrivateKey(PRIVATE_PATH)); return rsa.doFinal(Buffer.getBytes()); } catch (Exception e) { e.printStackTrace(); } return null; } private static String decrypt(byte[] buffer) { try { Cipher rsa; rsa = Cipher.getInstance("RSA"); rsa.init(Cipher.DECRYPT_MODE, getPrivateKey(PUBLIC_PATH)); byte[] utf8 = rsa.doFinal(buffer); return new String(utf8, "UTF8"); } catch (Exception e) { e.printStackTrace(); } return null; } public static PrivateKey getPrivateKey(String filename) throws Exception { File f = new File(filename); FileInputStream fis = new FileInputStream(f); DataInputStream dis = new DataInputStream(fis); byte[] keyBytes = new byte[(int) f.length()]; dis.readFully(keyBytes); dis.close(); PKCS8EncodedKeySpec spec = new PKCS8EncodedKeySpec(keyBytes); KeyFactory kf = KeyFactory.getInstance("RSA"); return kf.generatePrivate(spec); } public static PublicKey getPublicKey(String filename) throws Exception { File f = new File(filename); FileInputStream fis = new FileInputStream(f); DataInputStream dis = new DataInputStream(fis); byte[] keyBytes = new byte[(int) f.length()]; dis.readFully(keyBytes); dis.close(); X509EncodedKeySpec spec = new X509EncodedKeySpec(keyBytes); KeyFactory kf = KeyFactory.getInstance("RSA"); return kf.generatePublic(spec); } 

但它不起作用,PKCS8EncodedKeySpec / X509EncodedKeySpec不正确…但我不知道放什么

我认为你在阅读PEM文件时遇到了问题。 JPA不直接支持PEM格式。 您有两个选项,要么将它们转换为DER编码文件(您可以使用openSSL执行此操作),也可以使用bouncy castle API来读取(或写入)PEM文件。 您感兴趣的课程称为PEMReader(也可能是PEMWriter)。 这是 bouncycastle网站上的Javadoc 。

解:

感谢@Sanjeev,使用充气城堡API,我能够使用openssl生成的密钥来识别/解释

 public static void main(String[] args) throws IOException { Security.addProvider(new BouncyCastleProvider()); KeyPair keyPair = readKeyPair(new File(PRIVATE_PATH), "pass"); // if the private key is not encripted, pass can be anything. Key publickey = readPublicKey(new File(PUBLIC_PATH), "pass"); Base64 base64 = new Base64(); String text = "this is the input text"; byte[] encripted; System.out.println("input:\n" + text); encripted = encrypt(keyPair.getPublic(), text); System.out.println("cipher:\n" + base64.encodeAsString(encripted)); System.out.println("decrypt:\n" + decrypt(keyPair.getPrivate(), encripted)); } private static byte[] encrypt(Key pubkey, String text) { try { Cipher rsa; rsa = Cipher.getInstance("RSA"); rsa.init(Cipher.ENCRYPT_MODE, pubkey); return rsa.doFinal(text.getBytes()); } catch (Exception e) { e.printStackTrace(); } return null; } private static String decrypt(Key decryptionKey, byte[] buffer) { try { Cipher rsa; rsa = Cipher.getInstance("RSA"); rsa.init(Cipher.DECRYPT_MODE, decryptionKey); byte[] utf8 = rsa.doFinal(buffer); return new String(utf8, "UTF8"); } catch (Exception e) { e.printStackTrace(); } return null; } private static KeyPair readKeyPair(File privateKey, String keyPassword) throws IOException { FileReader fileReader = new FileReader(privateKey); PEMReader r = new PEMReader(fileReader, new DefaultPasswordFinder(keyPassword.toCharArray())); try { return (KeyPair) r.readObject(); } catch (IOException ex) { throw ex; } finally { r.close(); fileReader.close(); } } private static Key readPublicKey(File privateKey, String keyPassword) throws IOException { FileReader fileReader = new FileReader(privateKey); PEMReader r = new PEMReader(fileReader, new DefaultPasswordFinder(keyPassword.toCharArray())); try { return (RSAPublicKey) r.readObject(); } catch (IOException ex) { throw ex; } finally { r.close(); fileReader.close(); } }