Java tutorial
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)); } }