RSA Decryption Client
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
import com.squareup.okhttp.OkHttpClient; | |
import com.squareup.okhttp.Request; | |
import com.squareup.okhttp.Response; | |
import javax.crypto.Cipher; | |
import java.security.*; | |
import java.security.spec.PKCS8EncodedKeySpec; | |
import java.security.spec.X509EncodedKeySpec; | |
import java.util.Base64; | |
/** | |
* @author Anass AIT BEN EL ARBI | |
* <ul> | |
* <li>AES/CBC/NoPadding (128)</li> | |
* <li>AES/CBC/PKCS5Padding (128)</li> | |
* <li>AES/ECB/NoPadding (128)</li> | |
* <li>AES/ECB/PKCS5Padding (128)</li> | |
* <li>RSA/ECB/PKCS1Padding (1024, 2048)</li> | |
* <li>RSA/ECB/OAEPWithSHA-1AndMGF1Padding (1024, 2048)</li> | |
* <li>RSA/ECB/OAEPWithSHA-256AndMGF1Padding (1024, 2048)</li> | |
* </ul> | |
* <p> | |
* for more details @see <a href="https://docs.oracle.com/javase/7/docs/api/javax/crypto/Cipher.html">Java Ciphers</a> | |
*/ | |
public class RSA { | |
private PrivateKey privateKey; | |
private PublicKey publicKey; | |
private static final String PRIVATE_KEY_STRING = "MIICdgIBADANBgkqhkiG9w0BAQEFAASCAmAwggJcAgEAAoGBAJhBgzcXBm5A0srvFFu4FsBy+LLW+X0sH/9RvP40VIGOCusY0/CqA65YXWqyQE5jQCegBmnAeVYSvK+3PU4Y1fmr1uiquE6sZB5sl96T0ka+PKzPf4oKoAi6nwLUSenj5xTFjLsFGiuMXrCpMCPImf9JBVk89TJV43Xs3DSNKoj1AgMBAAECgYBsDysCgVv2ChnRH4eSZP/4zGCIBR0C4rs+6RM6U4eaf2ZuXqulBfUg2uRKIoKTX8ubk+6ZRZqYJSo3h9SBxgyuUrTehhOqmkMDo/oa9v7aUqAKw/uoaZKHlj+3p4L3EK0ZBpz8jjs/PXJc77Lk9ZKOUY+T0AW2Fz4syMaQOiETzQJBANF5q1lntAXN2TUWkzgir+H66HyyOpMu4meaSiktU8HWmKHa0tSB/v7LTfctnMjAbrcXywmb4ddixOgJLlAjEncCQQC6Enf3gfhEEgZTEz7WG9ev/M6hym4C+FhYKbDwk+PVLMVR7sBAtfPkiHVTVAqC082E1buZMzSKWHKAQzFL7o7zAkBye0VLOmLnnSWtXuYcktB+92qh46IhmEkCCA+py2zwDgEiy/3XSCh9Rc0ZXqNGD+0yQV2kpb3awc8NZR8bit9nAkBo4TgVnoCdfbtq4BIvBQqR++FMeJmBuxGwv+8n63QkGFQwVm6vCuAqFHBtQ5WZIGFbWk2fkKkwwaHogfcrYY/ZAkEAm5ibtJx/jZdPEF9VknswFTDJl9xjIfbwtUb6GDMc0KH7v+QTBW4GsHwt/gL+kGvLOLcEdLL5rau3IC7EQT0ZYg=="; | |
private static final String PUBLIC_KEY_STRING = "MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQCYQYM3FwZuQNLK7xRbuBbAcviy1vl9LB//Ubz+NFSBjgrrGNPwqgOuWF1qskBOY0AnoAZpwHlWEryvtz1OGNX5q9boqrhOrGQebJfek9JGvjysz3+KCqAIup8C1Enp4+cUxYy7BRorjF6wqTAjyJn/SQVZPPUyVeN17Nw0jSqI9QIDAQAB"; | |
public void init(){ | |
try { | |
KeyPairGenerator generator = KeyPairGenerator.getInstance("RSA"); | |
generator.initialize(1024); | |
KeyPair pair = generator.generateKeyPair(); | |
privateKey = pair.getPrivate(); | |
publicKey = pair.getPublic(); | |
} catch (Exception ignored) { | |
} | |
} | |
public void initFromStrings(){ | |
try{ | |
//X509EncodedKeySpec keySpecPublic = new X509EncodedKeySpec(decode(PUBLIC_KEY_STRING)); | |
PKCS8EncodedKeySpec keySpecPrivate = new PKCS8EncodedKeySpec(decode(PRIVATE_KEY_STRING)); | |
KeyFactory keyFactory = KeyFactory.getInstance("RSA"); | |
// publicKey = keyFactory.generatePublic(keySpecPublic); | |
privateKey = keyFactory.generatePrivate(keySpecPrivate); | |
}catch (Exception ignored){} | |
} | |
public void printKeys(){ | |
System.err.println("Public key\n"+ encode(publicKey.getEncoded())); | |
System.err.println("Private key\n"+ encode(privateKey.getEncoded())); | |
} | |
public String encrypt(String message) throws Exception { | |
byte[] messageToBytes = message.getBytes(); | |
Cipher cipher = Cipher.getInstance("RSA/ECB/PKCS1Padding"); | |
cipher.init(Cipher.ENCRYPT_MODE, publicKey); | |
byte[] encryptedBytes = cipher.doFinal(messageToBytes); | |
return encode(encryptedBytes); | |
} | |
private static String encode(byte[] data) { | |
return Base64.getEncoder().encodeToString(data); | |
} | |
private static byte[] decode(String data) { | |
return Base64.getDecoder().decode(data); | |
} | |
public String decrypt(String encryptedMessage) throws Exception { | |
byte[] encryptedBytes = decode(encryptedMessage); | |
Cipher cipher = Cipher.getInstance("RSA/ECB/PKCS1Padding"); | |
cipher.init(Cipher.DECRYPT_MODE, privateKey); | |
byte[] decryptedMessage = cipher.doFinal(encryptedBytes); | |
return new String(decryptedMessage, "UTF8"); | |
} | |
public static void main(String[] args) { | |
RSA rsa = new RSA(); | |
rsa.initFromStrings(); | |
try{ | |
OkHttpClient client = new OkHttpClient(); | |
Request request = new Request.Builder() | |
.url("http://localhost:3000/getSecretMessage") | |
.method("GET",null) | |
.build(); | |
Response response = client.newCall(request).execute(); | |
String encryptedMessage = response.body().string(); | |
System.err.println("RESPONSE BODY = "+encryptedMessage); | |
String secretMessage = rsa.decrypt(encryptedMessage); | |
System.err.println("SECRET MESSAGE = "+secretMessage); | |
}catch (Exception ignored){} | |
} | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment