jCryption.java 3.57 KB
package com.bsth.controller.sys.util;

import java.io.UnsupportedEncodingException;
import java.net.URLDecoder;
import java.security.GeneralSecurityException;
import java.security.KeyPair;
import java.security.KeyPairGenerator;
import java.security.NoSuchAlgorithmException;
import java.security.interfaces.RSAPublicKey;
import java.util.HashMap;
import java.util.Map;

import javax.crypto.Cipher;

public class jCryption {
	
    public KeyPair generateKeypair(int keyLength) {
        try {
            KeyPairGenerator kpg = KeyPairGenerator.getInstance("RSA");
            kpg.initialize(keyLength);
            return kpg.generateKeyPair();
        } catch (NoSuchAlgorithmException e) {
            throw new RuntimeException("RSA algorithm not supported",e);
        }
    }
    
    public String decrypt( String encrypted, KeyPair keys ) {
        Cipher dec;
        try {
            dec = Cipher.getInstance("RSA/NONE/NoPadding");
            dec.init(Cipher.DECRYPT_MODE, keys.getPrivate());
        } catch (GeneralSecurityException e) {
            throw new RuntimeException("RSA algorithm not supported",e);
        }
        String[] blocks = encrypted.split("\\s");
        StringBuffer result = new StringBuffer();
        try {
            for ( int i = blocks.length-1; i >= 0; i-- ) {
                byte[] data = hexStringToByteArray(blocks[i]);
                byte[] decryptedBlock = dec.doFinal(data);
                result.append( new String(decryptedBlock) );
            }
        } catch (GeneralSecurityException e) {
            throw new RuntimeException("Decrypt error",e);
        }
        return result.reverse().toString();
    }
    
    public static Map<String, String> parse(String url,String encoding) {
        try {
            String urlToParse = URLDecoder.decode(url,encoding);
            String[] params = urlToParse.split("&");
            Map<String, String> parsed = new HashMap<>();
            for (int i = 0; i<params.length; i++ )  {
                String[] p = params[i].split("=");
                String name = p[0];
                String value = (p.length==2)?p[1]:null;
                parsed.put(name, value);
            }
            return parsed;
        } catch (UnsupportedEncodingException e) {
            throw new RuntimeException("Unknown encoding.",e);
        }
    }
    
    public static String getPublicKeyModulus( KeyPair keyPair ) {
        RSAPublicKey publicKey = (RSAPublicKey) keyPair.getPublic();
        return publicKey.getModulus().toString(16);
    }
    
    public static String getPublicKeyExponent( KeyPair keyPair ) {
        RSAPublicKey publicKey = (RSAPublicKey) keyPair.getPublic();
        return publicKey.getPublicExponent().toString(16);
    }
    
    public static int getMaxDigits(int keyLength)   {
        return ((keyLength *2)/16)+3;
    }
    
    public static String byteArrayToHexString(byte[] bytes) {
        StringBuffer result = new StringBuffer();
        for (int i=0; i < bytes.length; i++) {
            result.append( Integer.toString( ( bytes[i] & 0xff ) + 0x100, 16).substring( 1 ) );
        }
        return result.toString();
    }
    
    public static byte[] hexStringToByteArray(String data) {
        int k = 0;
        byte[] results = new byte[data.length() / 2];
        for (int i = 0; i < data.length();) {
            results[k] = (byte) (Character.digit(data.charAt(i++), 16) << 4);
            results[k] += (byte) (Character.digit(data.charAt(i++), 16));
            k++;
        }
        return results;
    }
}