jCryption.java
3.57 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
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;
}
}