Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- package ivb511.crypto;
- import javax.crypto.*;
- import java.io.*;
- import java.security.*;
- import java.security.cert.CertificateEncodingException;
- import java.security.cert.CertificateException;
- import java.security.cert.CertificateFactory;
- import java.security.cert.X509Certificate;
- public class JavaCrypto {
- private final static int EXIT = 11;
- private static KeyStore keyStore;
- private static KeyGenerator secretKeyGenerator;
- private static Cipher cipher;
- private static Cipher keyWrapper;
- private static Signature sig;
- private static BufferedReader br;
- static {
- try {
- br = new BufferedReader(new InputStreamReader(System.in));
- secretKeyGenerator = KeyGenerator.getInstance("RC4");
- secretKeyGenerator.init(new SecureRandom());
- keyWrapper = Cipher.getInstance("RSA");
- cipher = Cipher.getInstance("RC4");
- keyStore = KeyStore.getInstance("JCEKS");
- sig = Signature.getInstance("MD5withRSA");
- } catch (NoSuchAlgorithmException | KeyStoreException | NoSuchPaddingException e) {
- e.printStackTrace();
- }
- }
- public static void main(String[] args) {
- int menuItem = 0;
- do try {
- switch (menuItem = getMenuItem()) {
- case 1:
- createKeyStore();
- break;
- case 2:
- loadKeyStore();
- break;
- case 3:
- saveKeyStore();
- break;
- case 4:
- importCertificate();
- break;
- case 5:
- exportCertificate();
- break;
- case 6:
- createSymmetricKey();
- break;
- case 7:
- exportSymmetricKey();
- break;
- case 8:
- importSymmetricKey();
- break;
- case 9:
- encryptAndSignMessage();
- break;
- case 10:
- decryptCiphertexrAndVerifySignature();
- break;
- case 11:
- break;
- default:
- System.out.println("Не верно выбрано действие");
- }
- } catch (Exception e) {
- e.printStackTrace();
- }
- while (menuItem != EXIT);
- }
- private static void createSymmetricKey() throws IOException, KeyStoreException {
- String keyAlias = getStr("\nType key alias, please");
- char[] password = getStr("Type password, please").toCharArray();
- SecretKey secretKey = secretKeyGenerator.generateKey();
- keyStore.setEntry(keyAlias, new KeyStore.SecretKeyEntry(secretKey), new KeyStore.PasswordProtection(password));
- System.out.println("\nThe symmetric key was successfully created. \n");
- }
- private static void decryptCiphertexrAndVerifySignature() throws IOException, SignatureException, InvalidKeyException, KeyStoreException, UnrecoverableKeyException, NoSuchAlgorithmException {
- String skAlias = getStr("Type symmetric key alias, please");
- char[] skPassword = getStr("Type symmetric key alias, please").toCharArray();
- String ciphertextFileName = getStr("Type name of file to read ciphertext from, please");
- String signatureFileName = getStr("Type signature file name, please");
- String certAlias = getStr("Type certificate alias to verify signature, please");
- SecretKey secretKey = (SecretKey) keyStore.getKey(skAlias, skPassword);
- cipher.init(Cipher.DECRYPT_MODE, secretKey);
- FileInputStream fis = new FileInputStream(ciphertextFileName);
- byte[] message = new byte[fis.available()];
- CipherInputStream cis = new CipherInputStream(fis, cipher);
- cis.read(message);
- System.out.println("The message is: " + new String(message) + ".");
- cis.close();
- fis = new FileInputStream(signatureFileName);
- byte[] ds = new byte[fis.available()];
- fis.read(ds);
- fis.close();
- X509Certificate cert = (X509Certificate) keyStore.getCertificate(certAlias);
- sig.initVerify(cert.getPublicKey());
- sig.update(message);
- System.out.println(sig.verify(ds) ? "The signature matches." : "The signature does not match.");
- }
- private static void encryptAndSignMessage() throws IOException, InvalidKeyException, SignatureException, UnrecoverableKeyException, NoSuchAlgorithmException, KeyStoreException {
- String keyAlias = getStr("\nType symmetric key alias, please");
- char[] skPassword = getStr("Type symmetric key password, please").toCharArray();
- String message = getStr("Type your message to be encrypted, please");
- String ciphertextFileName = getStr("Type name of file to save encrypted message to, please");
- String prvkAlias = getStr("Type private key alias to sign the message, please");
- char[] prvkPassword = getStr("Type private key password, please").toCharArray();
- String signatureFileName = getStr("Type name of file to save signature, please");
- SecretKey secretKey = (SecretKey) keyStore.getKey(keyAlias, skPassword);
- cipher.init(Cipher.ENCRYPT_MODE, secretKey);
- CipherOutputStream cos = new CipherOutputStream(new FileOutputStream(ciphertextFileName), cipher);
- cos.write(message.getBytes());
- cos.flush();
- cos.close();
- PrivateKey privateKey = (PrivateKey) keyStore.getKey(prvkAlias, prvkPassword);
- sig.initSign(privateKey);
- sig.update(message.getBytes());
- byte[] ds = sig.sign();
- FileOutputStream fos = new FileOutputStream(signatureFileName);
- fos.write(ds);
- fos.flush();
- fos.close();
- }
- private static void importSymmetricKey() throws NoSuchAlgorithmException, InvalidKeyException, IOException, UnrecoverableKeyException, KeyStoreException {
- String skFileName = getStr("\nType file name to import from, please");
- String prvkAlias = getStr("Type private key alias, please");
- char[] prvkPassword = getStr("Type private key alias, please").toCharArray();
- String skAlias = getStr("Type alias to store symmetric key, please");
- char[] skPassword = getStr("Type symmetric key password, please").toCharArray();
- FileInputStream fis = new FileInputStream(skFileName);
- byte[] wrappedKey = new byte[fis.available()];
- fis.read();
- fis.close();
- keyWrapper.init(Cipher.UNWRAP_MODE, keyStore.getKey(prvkAlias, prvkPassword));
- SecretKey secretKey = (SecretKey) keyWrapper.unwrap(wrappedKey, "RC4", Cipher.SECRET_KEY);
- keyStore.setEntry(skAlias, new KeyStore.SecretKeyEntry(secretKey), new KeyStore.PasswordProtection(skPassword));
- System.out.println("\nThe symmetric key was successfully imported. \n");
- }
- private static void exportSymmetricKey() throws IOException, KeyStoreException, InvalidKeyException, IllegalBlockSizeException, UnrecoverableKeyException, NoSuchAlgorithmException {
- String skAlias = getStr("\nType symmetric key alias, please");
- char[] password = getStr("Type symmetric key password, please").toCharArray();
- String certAlias = getStr("Type certificate alias, please");
- String skFileName = getStr("Type name of a file to export the symmetric key, please");
- SecretKey key = (SecretKey) keyStore.getKey(skAlias, password);
- X509Certificate cert = (X509Certificate) keyStore.getCertificate(certAlias);
- keyWrapper.init(Cipher.WRAP_MODE, cert.getPublicKey());
- byte wrappedKey[] = keyWrapper.wrap(key);
- FileOutputStream fos = new FileOutputStream(skFileName);
- fos.write(wrappedKey);
- fos.flush();
- fos.close();
- }
- private static void exportCertificate() throws IOException, KeyStoreException, CertificateEncodingException {
- String alias = getStr("\nType certificate alias, please");
- String certFileName = getStr("Type certificate file name, please");
- X509Certificate cert = (X509Certificate) keyStore.getCertificate(alias);
- FileOutputStream fos = new FileOutputStream(certFileName);
- fos.write(cert.getEncoded());
- fos.close();
- System.out.println("\nThe certificate was successfully exported. \n");
- }
- private static void importCertificate() throws CertificateException, IOException, KeyStoreException {
- String fileName = getStr("\nType file name, please");
- String alias = getStr("\nType file name, please");
- FileInputStream fis = new FileInputStream(fileName);
- CertificateFactory cf = CertificateFactory.getInstance("X.509");
- X509Certificate cert = (X509Certificate) cf.generateCertificate(fis);
- fis.close();
- keyStore.setCertificateEntry(alias, cert);
- System.out.println("\nThe certificate was successfully imported. \n");
- }
- private static void saveKeyStore() throws IOException, CertificateException, NoSuchAlgorithmException, KeyStoreException {
- String fileName = getStr("\nType file name, please");
- char[] password = getStr("Type the keystore password,please").toCharArray();
- FileOutputStream fos = new FileOutputStream(fileName);
- keyStore.store(fos, password);
- fos.flush();
- fos.close();
- System.out.println("\nThe keystore was successfully saved. \n");
- }
- private static void loadKeyStore() throws IOException, CertificateException, NoSuchAlgorithmException {
- String fileName = getStr("\nType file name, please");
- char[] password = getStr("Type the keystore password, please").toCharArray();
- FileInputStream fis = new FileInputStream(fileName);
- keyStore.load(fis, password);
- fis.close();
- System.out.println("\nThe keystore was succesfully loaded. \n");
- }
- private static void createKeyStore() throws CertificateException, NoSuchAlgorithmException, IOException {
- char[] password = getStr("\nType the keystore password, please").toCharArray();
- keyStore.load(null, password);
- System.out.println("\nThe new keystore was successfully created. \n");
- }
- private static int getMenuItem() throws Exception {
- System.out.println("Menu");
- System.out.println("---------------------");
- System.out.println("1. Create keystore");
- System.out.println("2. Load keystore");
- System.out.println("3. Save keystore");
- System.out.println("4. Import certificate");
- System.out.println("5. Export certificate");
- System.out.println("6. Create symmetric key");
- System.out.println("7. Export symetric key");
- System.out.println("8. Import symmetric key");
- System.out.println("9. Encrypt and sign message");
- System.out.println("10. Decrypt ciphertext and verify signature");
- System.out.println("11. Exit");
- System.out.println("---------------------");
- return Integer.parseInt(getStr("Type menu item, please"));
- }
- private static String getStr(String s) throws IOException {
- System.out.println(s + ": ");
- return br.readLine();
- }
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement