ael.com.loterias.Library.c_PGP_KeyGenerator.java Source code

Java tutorial

Introduction

Here is the source code for ael.com.loterias.Library.c_PGP_KeyGenerator.java

Source

package ael.com.loterias.Library;

/*
* Copyright 2014, The Interactua Open Source Project
*
* Licensed under the GPL version 3.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
*     http://www.gnu.org/copyleft/gpl.html
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/

import java.security.InvalidKeyException;
import java.security.Key;
import java.security.KeyFactory;
import java.security.KeyPair;
import java.security.KeyPairGenerator;
import java.security.NoSuchAlgorithmException;
import java.security.NoSuchProviderException;
import java.security.PrivateKey;
import java.security.PublicKey;
import java.security.SecureRandom;
import java.security.spec.InvalidKeySpecException;
import java.security.spec.PKCS8EncodedKeySpec;
import java.security.spec.X509EncodedKeySpec;
/**
 * Download page:   http://www.bouncycastle.org/latest_releases.html
 *                  http://www.bouncycastle.org/download/bcprov-ext-jdk15on-151.jar (2,8 mb)
 * Instrucctions:   http://stackoverflow.com/questions/6471351/ssl-on-android-via-bouncycastle
 *
 *                  Mover .jar a:
 *                      C:\Program Files\Java\jre7\lib\ext
 *                      C:\Program Files (x86)\Java\jre7\lib\ext
 *                      C:\Program Files\Java\jdk1.8.0_05\lib
 *
 *                  Modify java.security: (tuve que aadir permisos en seguridad de windows para
 *                      ese fichero aadiendo el gurpo "usuarios autenticados" buscando con la cadena "usuarios" y
 *                      seleccionando "usuarios autenticados". Despus me permiti modificar el java.security
 *
 *                      add line: security.provider.11=org.bouncycastle.jce.provider.BouncyCastleProvider
 *
 *                      C:\Program Files\Java\jre7\lib\security (modificar)
 *                      C:\Program Files (x86)\Java\jre7\lib\security (modificar)
 *                      C:\Program Files\Java\jdk1.8.0_05\lib (no existe java.security)
 *
 *                      classpath:
 *                          CLASSPATH=%CLASSPATH%;c:\bcprov-ext-jdk15on-151.jar
 *                      keytool -genkey -alias LoterIAS -keystore C:\DATA\PROJECTs\LoterIAS.keystore -storepass LoterIAS -storetype BKS -providerclass org.bouncycastle.jce.provider.BouncyCastleProvider -providerpath "C:\Program Files\Java\jre7\lib\ext\bcprov-ext-jdk15on-151.jar"
 *                      keytool -list -keystore C:\DATA\PROJECTs\LoterIAS.keystore -storetype BKS
 *
 *  Se puede hacer esto o aadirlo en project structure - dependencias - libs - aadir fichero: bcprov-ext-jdk15on-151.jar
 *
 *
 *
 *
 *
 *
 */
import org.bouncycastle.util.encoders.Base64;
import android.content.Context;

import javax.crypto.BadPaddingException;
import javax.crypto.Cipher;
import javax.crypto.IllegalBlockSizeException;
import javax.crypto.NoSuchPaddingException;

public class c_PGP_KeyGenerator {

    PublicKey pubKey;
    PrivateKey privKey;
    Context context;
    int SizeAlgorithm = 2048;

    String pubKeyString;
    String privKeyString;

    public c_PGP_KeyGenerator(Context context) {
        this.context = context;
        c_logging.getInstance().log(c_logging.LOG_INFO, "CONSTRUCTOR");
        //Security.addProvider(new org.bouncycastle.jce.provider.BouncyCastleProvider());
    }

    public void generateKeys() {

        try {
            KeyPairGenerator generator;
            generator = KeyPairGenerator.getInstance("RSA", "BC");
            generator.initialize(SizeAlgorithm, new SecureRandom());
            KeyPair pairKeys = generator.generateKeyPair();

            pubKey = pairKeys.getPublic();
            privKey = pairKeys.getPrivate();

            byte[] publicKeyBytes = pubKey.getEncoded();
            this.pubKeyString = new String(Base64.encode(publicKeyBytes));

            byte[] privKeyBytes = privKey.getEncoded();
            this.privKeyString = new String(Base64.encode(privKeyBytes));

            c_logging.getInstance().log(c_logging.LOG_INFO, "GEN KEY PAIR OK (" + SizeAlgorithm + ")!!!");
            c_logging.getInstance().log(c_logging.LOG_INFO, "PGP Private Key: " + this.privKeyString);
            c_logging.getInstance().log(c_logging.LOG_INFO, "PGP Public Key :  " + this.pubKeyString);

        } catch (NoSuchAlgorithmException e) {
            e.printStackTrace();
        } catch (NoSuchProviderException e) {
            e.printStackTrace();
        }
    }

    public PublicKey getPublicKey() {

        byte[] sigBytes = Base64.decode(this.pubKeyString);
        X509EncodedKeySpec x509KeySpec = new X509EncodedKeySpec(sigBytes);
        KeyFactory keyFact = null;
        try {
            keyFact = KeyFactory.getInstance("RSA", "BC");
        } catch (NoSuchAlgorithmException e) {
            e.printStackTrace();
        } catch (NoSuchProviderException e) {
            e.printStackTrace();
        }
        try {
            return keyFact.generatePublic(x509KeySpec);
        } catch (InvalidKeySpecException e) {
            e.printStackTrace();
        }
        return null;
    }

    public String getPublicKeyAsString() {
        return this.pubKeyString;
    }

    public PrivateKey getPrivateKey() {

        byte[] sigBytes = Base64.decode(this.privKeyString);
        X509EncodedKeySpec x509KeySpec = new X509EncodedKeySpec(sigBytes);
        KeyFactory keyFact = null;
        try {
            keyFact = KeyFactory.getInstance("RSA", "BC");
        } catch (NoSuchAlgorithmException e) {
            e.printStackTrace();
        } catch (NoSuchProviderException e) {
            e.printStackTrace();
        }
        try {
            return keyFact.generatePrivate(x509KeySpec);
        } catch (InvalidKeySpecException e) {
            e.printStackTrace();
        }
        return null;
    }

    public String getPrivateKeyAsString() {
        return this.privKeyString;
    }

    public String encrypt(Key publicKey, String PlainText) {
        String encryptedData = null;

        try {
            byte[] BytePlainText = PlainText.getBytes();
            Cipher cipher = Cipher.getInstance("RSA", "BC");
            cipher.init(Cipher.ENCRYPT_MODE, publicKey);
            byte[] encryptedBytes = cipher.doFinal(BytePlainText);
            byte[] encodedBytes = Base64.encode(encryptedBytes); //used library encode decode
            encryptedData = new String(encodedBytes);
        } catch (BadPaddingException e) {
            e.printStackTrace();
        } catch (IllegalBlockSizeException e) {
            e.printStackTrace();
        } catch (NoSuchAlgorithmException e) {
            e.printStackTrace();
        } catch (NoSuchProviderException e) {
            e.printStackTrace();
        } catch (NoSuchPaddingException e) {
            e.printStackTrace();
        } catch (InvalidKeyException e) {
            e.printStackTrace();
        }
        return encryptedData;
    }

    public String decrypt(PrivateKey pKey, String text) throws Exception {
        /*String RSA_PUBLIC_KEYx =
            "-----BEGIN PUBLIC KEY-----" +
            "MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAs83oPzPVBV4fLxUJB9Xi" +
            "/1+w3ghi6d+NEwnQA1rFho6Eb5nTChQ+Lk38lI0ogQdwjqLK0QhYy6UHQPiXE613" +
            "RfQayt2a/Qgfd6kmqJr01Vqgy09SYn/BvrorErzWjceyvK6F8MVDUWaspV3YP9QY" +
            "wdgihNs3vpjJJnQCKeTdr2cUwT1emNEyy6hfD6fBXYW7u19cj0I9guYFfhWx8IMB" +
            "oKEbg3BWdNHXc2DqRT3RN5HE8hwIw70rCdBHpiJixl38xeKpCdSYCCmnyMmpGF8V" +
            "7jKFoDlHppbkr8Nfq524o2DbIsKGnjqIxFLDpE4l24FsVtO0z4PkdcJmvqBRxCW1" +
            "BwIDAQAB" + "-----END PUBLIC KEY-----";
            
        String RSA_PUBLIC_KEY = "-----BEGIN RSA PRIVATE KEY-----\n" +
        "MIIEogIBAAKCAQEAs83oPzPVBV4fLxUJB9Xi/1+w3ghi6d+NEwnQA1rFho6Eb5nT\n" +
        "ChQ+Lk38lI0ogQdwjqLK0QhYy6UHQPiXE613RfQayt2a/Qgfd6kmqJr01Vqgy09S\n" +
        "Yn/BvrorErzWjceyvK6F8MVDUWaspV3YP9QYwdgihNs3vpjJJnQCKeTdr2cUwT1e\n" +
        "mNEyy6hfD6fBXYW7u19cj0I9guYFfhWx8IMBoKEbg3BWdNHXc2DqRT3RN5HE8hwI\n" +
        "w70rCdBHpiJixl38xeKpCdSYCCmnyMmpGF8V7jKFoDlHppbkr8Nfq524o2DbIsKG\n" +
        "njqIxFLDpE4l24FsVtO0z4PkdcJmvqBRxCW1BwIDAQABAoIBAEi/grwvqHynfE58\n" +
        "YE7/Rvy0Jsdu9TZS8K1HRxZUX571grf0sOJfFll9zDf+dOjfrbbIPu8cRXD/sFOl\n" +
        "QNsBUETJYx25U8AUzUaI9c86At1f8bbQvTCFKEqW4F6QcO6kYbjdk+u6pGYG+Mtf\n" +
        "kOMiWXH0lOLUH1XKU3hvb4CrzNXuXM2PiePal6/RmEkAVCysl9vqtdU0yDdTFx8V\n" +
        "ggkPluvx6K7L8fhYuGSVfWoAgk54wMnHWHm5fZcIiq1L5u3B5UAQTESf7ZfToE2i\n" +
        "Iumequn6qN+BuSppYa1VzO6mHE+CJWUUgpCp5A1flr0z9v5kPMLr3mQVyQ5MWzZh\n" +
        "JtPhmWECgYEA6R8znoFvVfDJTjWVVM/WV4q9++Amtf770KsL2nPk82hxuot+gYxA\n" +
        "Cz2NoYworWmUJPv1mGdPYIEFFFRWi7PsmuJRKG6zRj2pGChO7YmcK6sFanKnYLSv\n" +
        "QCGTEI7kKoOa7090xE6FLMHJc2800H/J4pfve15uF1teXxZIhI4ElvMCgYEAxXMw\n" +
        "4Do/9ds039vhj4gnwlYQsnCFVFhcOOWbk3SRsqkE+E5xfvrtAbj0XE6rv3Igiven\n" +
        "rBfS8FYlDGnKt9Bb9XgAcwDjH29twLLMrNizMTyEx9GsFCpg8RIJSGNnxZpS1IvN\n" +
        "lrM5HiaSFBwgINp4IprHBDAM6HGnezcmSAvC1p0CgYBZ5g9o6688rAtlXqKEv1WA\n" +
        "Et/q1uj2vCrtsFh02MaM21UoRAz39lboPsd0afFx1kor7QIr0IM6yuZjjZaGb08p\n" +
        "92amufHmf3bK+xhc3/lamawP/cDwOR1wFMJ62y+/+VpxOOnlngYbWWvPWS47zVvU\n" +
        "RxUyNRstZK3C63vxqja44wKBgFd3t+cc5sia2slwNnPG9RX52luxzN6YZgIudMTV\n" +
        "ltV2WmVFGrINpoBk1pstnpeojxIAs55gz2j4QGFHXC4hdxs+lbRcaEC8s/nxOwo2\n" +
        "1OqyzH9YOsqUG22vd71Bi+7VdmwBoolny523qG6QJwtmvGFX/2Gzh4RRFMhYnfS8\n" +
        "gQthAoGAee8HPnM+hhtBngyKjE81PvHLCqGkSuB5lyCKcvtIV7XeEIDiNb9lWTFa\n" +
        "L999yx6tGOKigKD/pRzGCFMXmi7ScgmTGk83s37XjmSCpgyECCWeZbpkGD/579ed\n" +
        "tRwLKtFKVH+sFxwOdeXe+cBWOhslECU5wuqu3m4k3KCwiQd+G80=\n" +
        "-----END RSA PRIVATE KEY-----\n";
            
            
        String pubKeyPEM = RSA_PUBLIC_KEY.replace("-----BEGIN RSA PRIVATE KEY-----\n", "");
        pubKeyPEM = pubKeyPEM.replace("-----END RSA PRIVATE KEY-----\n", "");
        */
        byte[] encoded = Base64.decode(this.getPrivateKeyAsString());
        /*
                c_logging.getInstance().log(c_logging.LOG_INFO, "key no formateada: " + RSA_PUBLIC_KEY);
                c_logging.getInstance().log(c_logging.LOG_INFO, "key formateada: " + pubKeyPEM);
        */
        X509EncodedKeySpec x509KeySpec = new X509EncodedKeySpec(encoded);
        KeyFactory keyFact = KeyFactory.getInstance("RSA", "BC");
        PublicKey privatekey = keyFact.generatePublic(x509KeySpec);

        //PKCS8EncodedKeySpec keySpec = new PKCS8EncodedKeySpec(encoded);
        //KeyFactory kf = KeyFactory.getInstance("RSA");
        //PublicKey pubKey = kf.generatePublic(keySpec);

        Cipher cipher = Cipher.getInstance("RSA", "BC");
        cipher.init(Cipher.DECRYPT_MODE, privatekey);

        byte[] decodedStr = Base64.decode(text);
        return new String(cipher.doFinal(decodedStr));
    }
}