2012-05-09 20 views
8

tôi cần phải thay thế các mã hóa và giải mã bước từ Unix mã java với rsaprivatekey.pemrsapublickey.pem phím được tạo ra với opensslLàm thế nào để mã hóa giải mã với các phím RSA trong java

tôi tạo ra các phím

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

tôi sử dụng các phím trong unix (tôi cần làm điều đó trong 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 

Đây là nỗ lực của tôi để làm điều đó

01.
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); 
} 

nhưng nó không hoạt động, các PKCS8EncodedKeySpec/X509EncodedKeySpec là không đúng ... nhưng tôi không biết phải đưa

+0

Và vấn đề là ...? –

+0

nỗ lực của tôi không hoạt động – caeycae

+2

[Stack Overflow không phải là đầu đọc Mind.] (Http://meta.stackexchange.com/a/128551/133242) –

Trả lời

5

Không chắc chính xác những gì bạn đang hỏi, nhưng tôi nghĩ rằng bạn đang gặp vấn đề về đọc Tệp PEM. JPA không hỗ trợ trực tiếp định dạng PEM. Bạn có hai tùy chọn, hoặc chuyển đổi chúng thành tệp được mã hóa DER (bạn có thể sử dụng openSSL để làm điều này) hoặc bạn có thể sử dụng API lâu đài bouncy để đọc (hoặc viết) tệp PEM. lớp bạn muốn được gọi là PEMReader (và cũng có thể là PEMWriter). Here is the Javadoc trên trang web bouncycastle.

12

Giải pháp:

Nhờ @Sanjeev, sử dụng lâu đài API bouncy, tôi đã có thể encript/decript với các phím được tạo ra bởi 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(); 
    } 
} 
+1

Không nên là "UTF-8"? – drew

+4

Xin chào @caeycae, tôi đang theo dõi bạn, tôi cũng gặp sự cố về vấn đề này. Trong đó JAR/Library chứa DefaultPasswordFinder? – danisupr4

+0

Bạn đã tìm thấy giải pháp cho tệp jar nào chúng tôi phải đưa vào DefaultPasswordFinder chưa? – sasi

Các vấn đề liên quan