· 6 years ago · Aug 13, 2019, 02:52 PM
1
2import java.io.BufferedReader;
3import java.io.FileReader;
4import java.io.IOException;
5import java.math.BigInteger;
6import java.nio.file.Files;
7import java.nio.file.Paths;
8import java.security.GeneralSecurityException;
9import java.security.KeyFactory;
10import java.security.PrivateKey;
11import java.security.Security;
12import java.security.interfaces.RSAPublicKey;
13import java.security.spec.RSAPrivateCrtKeySpec;
14import java.security.spec.X509EncodedKeySpec;
15
16import javax.crypto.Cipher;
17import javax.crypto.SecretKey;
18
19import org.apache.commons.codec.binary.Base64;
20import org.apache.commons.codec.binary.Hex;
21
22import com.microstrategy.utils.DerInputStream;
23
24public class BouncyCastleExample {
25 public static void main(String[] args) throws IOException, GeneralSecurityException {
26 Security.addProvider(new org.bouncycastle.jce.provider.BouncyCastleProvider());
27
28
29// byte[] encoded = Hex.encode(plainText);
30// System.out.println(new String(encoded));
31
32
33 }
34
35 private static String getKey(String filename) throws IOException {
36 // Read key from file
37 String strKeyPEM = "";
38 BufferedReader br = new BufferedReader(new FileReader(filename));
39 String line;
40 while ((line = br.readLine()) != null) {
41 strKeyPEM += line + "\n";
42 }
43 br.close();
44 return strKeyPEM;
45 }
46
47 public static RSAPublicKey getPublicKey(String filename) throws IOException, GeneralSecurityException {
48 String publicKeyPEM = getKey(filename);
49 return getPublicKeyFromString(publicKeyPEM);
50 }
51
52 public static RSAPublicKey getPublicKeyFromString(String key) throws IOException, GeneralSecurityException {
53 String publicKeyPEM = key;
54 publicKeyPEM = publicKeyPEM.replace("-----BEGIN PUBLIC KEY-----\n", "");
55 publicKeyPEM = publicKeyPEM.replace("-----END PUBLIC KEY-----", "");
56 byte[] encoded = Base64.decodeBase64(publicKeyPEM);
57 KeyFactory kf = KeyFactory.getInstance("RSA");
58 RSAPublicKey pubKey = (RSAPublicKey) kf.generatePublic(new X509EncodedKeySpec(encoded));
59 return pubKey;
60 }
61
62 public static byte[] encrypt(String message) throws IOException, GeneralSecurityException {
63 byte[] input = message.getBytes();
64 Cipher cipher = Cipher.getInstance("RSA/None/PKCS1Padding");
65
66 RSAPublicKey key = getPublicKey("C:\\Users\\gszymanowski\\Downloads\\OpenSSL\\bin\\public.pem");
67
68 cipher.init(Cipher.ENCRYPT_MODE, key);
69
70 byte[] plainText = cipher.doFinal(input);
71 System.out.println("plain : " + new String(plainText));
72 return plainText;
73 }
74
75 public static String decrypt(String strToDecrypt, SecretKey key) {
76 try {
77 Cipher cipher = Cipher.getInstance("RSA/None/PKCS1Padding");
78 cipher.init(Cipher.DECRYPT_MODE, key);
79
80 return new String(cipher.doFinal(Hex.decodeHex(strToDecrypt.toCharArray())));
81 } catch (Exception e) {
82 System.out.println("Error while decrypting: " + e.toString());
83 }
84 return null;
85 }
86
87 public static void readPrivateKeyPKCS1PEM() throws Exception {
88 String content = new String(
89 Files.readAllBytes(Paths.get("C:\\Users\\gszymanowski\\Downloads\\OpenSSL\\bin\\sslPublickey.pem")));
90 content = content.replaceAll("\\n", "").replace("-----BEGIN RSA PRIVATE KEY-----", "")
91 .replace("-----END RSA PRIVATE KEY-----", "");
92 System.out.println("'" + content + "'");
93
94 byte[] bytes = Base64.decodeBase64(content);
95
96 DerInputStream derReader = new DerInputStream(bytes);
97 DerValue[] seq = derReader.getSequence(0);
98 // skip version seq[0];
99 BigInteger modulus = seq[1].getBigInteger();
100 BigInteger publicExp = seq[2].getBigInteger();
101 BigInteger privateExp = seq[3].getBigInteger();
102 BigInteger prime1 = seq[4].getBigInteger();
103 BigInteger prime2 = seq[5].getBigInteger();
104 BigInteger exp1 = seq[6].getBigInteger();
105 BigInteger exp2 = seq[7].getBigInteger();
106 BigInteger crtCoef = seq[8].getBigInteger();
107
108 RSAPrivateCrtKeySpec keySpec =
109 new RSAPrivateCrtKeySpec(modulus, publicExp, privateExp, prime1, prime2, exp1, exp2, crtCoef);
110 KeyFactory keyFactory = KeyFactory.getInstance("RSA");
111 PrivateKey privateKey = keyFactory.generatePrivate(keySpec);
112 System.out.println(privateKey);
113 }
114
115
116}