/* * To change this template, choose Tools | Templates * and open the template in the editor. */ package org.redPandaLib.crypt; import java.security.*; import java.security.spec.InvalidKeySpecException; import java.security.spec.PKCS8EncodedKeySpec; import java.security.spec.X509EncodedKeySpec; import java.util.logging.Level; import java.util.logging.Logger; import javax.crypto.BadPaddingException; import javax.crypto.Cipher; import javax.crypto.IllegalBlockSizeException; import javax.crypto.NoSuchPaddingException; /** * * @author rflohr */ public class RSA { public static final String Algorithm = "RSA"; //AES/CBC/PKCS5Padding private static KeyPair keyPair; private static String privateString = "3Z2KzWG796gAE2zUz9Tuy3mBvA2sDfdSwPUqgwzS8pqnYdYrh2jY6f6dTqYGcaBAkX8nW2ZbahuW165ZsjrszkKhY1gTrMT3HrdnQXqxb5Y6b5CWi1rDEv8qFKFKkkduapoqR5Y3eYTdV32MdZ7vaqvaCdwCC6Tm9dx1DHsM8LSemMGYAniMq2bNchtg8SyGx4d4Mq3mp8EPkFCtmb4ZRDh9N2tqTFqDb7jtMErycYhg5XkNCVJBT14aJerYbYMp1FmbEkQ8Mgct6cSehqfo6PMJRC34xj1iJWoayWnu2cAHrBishLFRR3dYRqF72zm9sfyUZ5jtziMAJbM7QU4ZjeidYJAvc7tuf1KTgkteteVCH4nJByNNohLb39S29MuAWhyMHHtZXseYAK6aDM3C8aUcdpXUE7UsgHh7bNsjfC7MSfcTMYKZTNYzxT8oqT2qiC2H5G9FkvbrF6K97Ka5fz7Umz2hFpCQTnKs4yvSHgvxRBqDLL1WPFrQpZGzQsLhreJT4QAqTTkHriFCzJ3rbcb2hnd6Sm84yoV3wZzFq9JjhRYtb5epUzJhUmEMfSo5Tt6PUP9KmQrP5Tw9L5qZ94cmRiUKxFn4W26mUYWW6BUQ6Tx68BwjszXJqV9CFtSJ9e6UyBsjqDNQZousoiktfXFpgizq5nvFhswsWF6YH1qWfDQZLnd4xw3RE8ENGw73VXpxEXjtPzW9Ax9774RCw7kSteFXBMxRtvrYMXK1YDczHcTMqf5VSVZqhednHB4DTgyPm7Zpxum2nmoZavN12UtJVtWAwq3Ypqz5JAUKEpNLfd5zrmbdEipkVfzsc2VfUEBkAGcn6J1QGsYMFUEREyXtM42WxJqRbMjc9MnZ4gZC754HFuehFp7e8PpE4EZay73bYoayme1iECJLiQZ51TNV4n3mMiSV7bkVF8LVkmkdnx3xgqwZUqZYTLGWk9AhyqbG56rFf3GgbHsfAzq4wTcg4QMtpSUzRcgajk4hjPdwngYEjBePUyLXfefUPpaiyLwCngm536v7DVdMn9NGirhh3V5VhBPnsBoYP5GMcZs5Hju4hDGpyYYkZubeGXDJh5vSJsSA6KuQSDK5NSsacsihxoADTvZq1de2MEmwLiaFqXzqrevSuq274yYEBjj5hPwFsLh6Nbk1C3YGSfDkW4zkSBsg5rgYqeTWWChFbWkGLAos8SzhpLiD5qFcboconysv6kpFEuneu4YbWrb1Tj2ii3P2Xbcawr8fbqJMeA1r6qTjEsxZj2o69dNeMnqs5Hf5QLgP7ivbbLguEv8LWzeUF2WWRufbkRPk711a5hLZRUJeMvmPDj1qphx3UvVFEVZhuAdEHkpijHL1nAm5qBXJrYcWdBPAQkBjceEQnZpfcTr5iiAXQcioDNfokuDLKG3uYB1EZVrrDKg5aKQ428KokitVu28QwfBAuksEjHLLh97akpCjjbPEQ6ZEAP9f5gZP5bLcrbG4BK1CkYB3Ns4oyW3R3nvA4r4VnBtCj6d5XuoLGWatCQceqTE6hdhjNgEDaVQ16WV7Yv2aqHHzwHpcwRZgP7XrFHQTb6jmo9hVTBHYw6csWRp1rPfogeXu7nnaBoyjfWZkZ7xrCJPYNEtVw28Zd33rYY1snaiExbrMd3TSZY6cLGaHEdcUn"; private static String publicString = "2TuPVgMCHJy5atawrsADEzjP7MCVbyyCA89UW6Wvjp9Hr9zt9GFeQZXo3gy5q7Nb2FfsjBJak45W766vwyALkWXWEhAae5HWT3iTPVZLBPUVrrRKbnTgWCNFhpHzSSLEkVu6Wqsr6ZEfChGVa3e2wbE5eS26pfs3WdUxqwBkydQuGdFFtFsqYU8TBgAijTGYtMLUfdTCtWiEN6eft6kHoMrj7dzwacruBwhYnPaP2dNLmZf4NSmcCxD7xKUEPdPPWmrX27LHyXb4zC1CkWo6wdkCVqXzNmS1dBqKbjbFAKrSUp8KwmLiAwx3u68cKjou7ASXBgknVvDcYFzRZyqAfVod9USq2CgyJTFqBd5KdQSy55RpfpooSJmMr6Ng9fDG86Qc3Z4pSj1oiZcSJC"; /** * Erzeugt ein RSA Schluesselpaar * * @return RSA Schluesselpaar * @throws Exception */ public static KeyPair getKeyPair() throws Exception { if (keyPair == null) { KeyPairGenerator kpg; try { kpg = KeyPairGenerator.getInstance(Algorithm); kpg.initialize(3072); keyPair = kpg.generateKeyPair(); } catch (NoSuchAlgorithmException e) { throw new Exception( "Fehler beim Erzeugen des Schluesselpaars: " + e.getMessage()); } } return keyPair; } public static void main(String[] args) throws Exception { // for (Provider provider : Security.getProviders()) { // System.out.println(provider.getName()); // for (String key : provider.stringPropertyNames()) { // System.out.println("\t" + key + "\t" + provider.getProperty(key)); // } // } String toEnc = "ich bin ein sehr toller schluessel"; KeyPair keyPair1 = getKeyPair(); byte[] pub = keyPair1.getPublic().getEncoded(); byte[] priv = keyPair1.getPrivate().getEncoded(); // // byte[] pub = Base58.decode(publicString); // byte[] priv = Base58.decode(privateString); // String encode = Base64.encode(pub); // System.out.println("PRIVATE: " + Base58.encode(priv)); // System.out.println("PUBLIC: " + Base58.encode(pub)); //System.out.println("" + encode); System.out.println("LEN: " + Base58.encode(pub).length()); System.out.println("enc: " + Base58.encode(pub)); System.out.println("LEN: " + Base58.encode(priv).length()); System.out.println("enc: " + Base58.encode(priv)); PublicKey publicKey = KeyFactory.getInstance(Algorithm).generatePublic(new X509EncodedKeySpec(pub)); // Cipher cipher = Cipher.getInstance("RSA"); // cipher.init(Cipher.ENCRYPT_MODE, keyPair1.getPublic()); // byte[] update = cipher.doFinal(toEnc.getBytes()); // cipher. // ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream(); // CipherOutputStream cipherOutputStream = new CipherOutputStream(byteArrayOutputStream, cipher); // cipherOutputStream.write(toEnc.getBytes()); // System.out.println("" + update.length); // // System.out.println("enc: " + Base64.encode(update)); Cipher cipher2 = Cipher.getInstance(Algorithm); cipher2.init(Cipher.ENCRYPT_MODE, publicKey); byte[] update2 = cipher2.doFinal(toEnc.getBytes()); //System.out.println("enc: " + Base64.encode(update2)); System.out.println("encrypted: " + Base58.encode(update2)); update2 = Base58.decode(Base58.encode(update2)); System.out.println("" + update2.length); String a = "4xuCTgb2LwFCgEdBDb3N7bvQTEsSKFk4HuYL1QXVo63gKb5uqRaksJ2AuKExgGdpA3tvTNN3xPosDebQrH8uujf9fyJB4C6S3PSugTLc1CZ6V8RqBmSp6WP2TvyPfQrfPBXC1GykoZVjfsH5PGTzsNM4mdGwBsFJv51g3J51dFFR1dqoh5X7pAWpXSQXchLfvVPqzsKg6nFUwao7HJunyRxtUPAVDrTDxReW3wBuvEhUw3XkGvHJam1JXcm6yBK6QHL2GXbKBqjzKw9TdZ5dS4rK4kmJmLoTd5SMwwb1S4XCU17G86YVihNe3UaGvX3sUL5nrtCmgAS82V3TSeazDpmiLi72EL"; System.out.println("" + encodeForServer("ich bin ein sehr toller schluessel".getBytes("UTF-8"))); System.out.println("d: " + decode(Base58.decode(a))); // PrivateKey privateKey = KeyFactory.getInstance("RSA").generatePrivate(new PKCS8EncodedKeySpec(priv)); // // Cipher cipher3 = Cipher.getInstance("RSA"); // cipher3.init(Cipher.DECRYPT_MODE, privateKey); // byte[] update3 = cipher3.doFinal(update2); // // System.out.println("enc: " + new String(update3)); } public static String decode(byte[] bytes) throws AddressFormatException { try { byte[] priv = Base58.decode(privateString); PrivateKey privateKey = KeyFactory.getInstance(Algorithm).generatePrivate(new PKCS8EncodedKeySpec(priv)); Cipher cipher3 = Cipher.getInstance(Algorithm); cipher3.init(Cipher.DECRYPT_MODE, privateKey); System.out.println("Byte lentgth: " + bytes.length); byte[] update3 = cipher3.doFinal(bytes); return new String(update3); } catch (IllegalBlockSizeException ex) { Logger.getLogger(RSA.class.getName()).log(Level.SEVERE, null, ex); } catch (BadPaddingException ex) { Logger.getLogger(RSA.class.getName()).log(Level.SEVERE, null, ex); } catch (InvalidKeyException ex) { Logger.getLogger(RSA.class.getName()).log(Level.SEVERE, null, ex); } catch (NoSuchPaddingException ex) { Logger.getLogger(RSA.class.getName()).log(Level.SEVERE, null, ex); } catch (NoSuchAlgorithmException ex) { Logger.getLogger(RSA.class.getName()).log(Level.SEVERE, null, ex); } catch (InvalidKeySpecException ex) { Logger.getLogger(RSA.class.getName()).log(Level.SEVERE, null, ex); } return null; } public static String encodeForServer(byte[] byteToEncode) throws AddressFormatException { byte[] pub = Base58.decode(publicString); System.out.println("public key len: " + pub.length); try { PublicKey publicKey = KeyFactory.getInstance(Algorithm).generatePublic(new X509EncodedKeySpec(pub)); // Cipher cipher = Cipher.getInstance("RSA"); // cipher.init(Cipher.ENCRYPT_MODE, keyPair1.getPublic()); // byte[] update = cipher.doFinal(toEnc.getBytes()); // cipher. // ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream(); // CipherOutputStream cipherOutputStream = new CipherOutputStream(byteArrayOutputStream, cipher); // cipherOutputStream.write(toEnc.getBytes()); // System.out.println("" + update.length); // // System.out.println("enc: " + Base64.encode(update)); Cipher cipher2 = Cipher.getInstance(Algorithm); cipher2.init(Cipher.ENCRYPT_MODE, publicKey); byte[] update2 = cipher2.doFinal(byteToEncode); return Base58.encode(update2); } catch (IllegalBlockSizeException ex) { Logger.getLogger(RSA.class.getName()).log(Level.SEVERE, null, ex); } catch (BadPaddingException ex) { Logger.getLogger(RSA.class.getName()).log(Level.SEVERE, null, ex); } catch (InvalidKeyException ex) { Logger.getLogger(RSA.class.getName()).log(Level.SEVERE, null, ex); } catch (NoSuchPaddingException ex) { Logger.getLogger(RSA.class.getName()).log(Level.SEVERE, null, ex); } catch (InvalidKeySpecException ex) { Logger.getLogger(RSA.class.getName()).log(Level.SEVERE, null, ex); } catch (NoSuchAlgorithmException ex) { Logger.getLogger(RSA.class.getName()).log(Level.SEVERE, null, ex); } return null; } }