· 7 years ago · Apr 04, 2018, 07:36 AM
1package mkri;
2
3import java.math.BigInteger;
4import java.security.InvalidKeyException;
5import java.security.Key;
6import java.security.KeyFactory;
7import java.security.KeyPair;
8import java.security.KeyPairGenerator;
9import java.security.MessageDigest;
10import java.security.NoSuchAlgorithmException;
11import java.security.PrivateKey;
12import java.security.Provider;
13import java.security.PublicKey;
14import java.security.SecureRandom;
15import java.security.Signature;
16import java.security.SignatureException;
17import java.security.spec.InvalidKeySpecException;
18import java.security.spec.PKCS8EncodedKeySpec;
19import java.security.spec.X509EncodedKeySpec;
20import java.util.Base64;
21import java.util.Base64.*;
22
23import javax.crypto.Cipher;
24import javax.crypto.KeyAgreement;
25import javax.crypto.NoSuchPaddingException;
26import javax.crypto.SecretKey;
27import javax.crypto.interfaces.DHPublicKey;
28import javax.crypto.spec.DHParameterSpec;
29import javax.crypto.spec.DHPublicKeySpec;
30import javax.crypto.spec.SecretKeySpec;
31
32public class ProtocolSec {
33
34 private Signature sign;
35 private KeyPair keyPair;
36
37 private KeyAgreement aKeyAgree;
38 private byte[] pass;
39
40 private Decoder dec = Base64.getDecoder();
41 private Encoder enc = Base64.getEncoder();
42
43
44
45 /**
46 * Generuje RSA
47 * @throws NoSuchAlgorithmException
48 * @throws InvalidKeyException
49 * @throws InvalidKeySpecException
50 * @throws SignatureException
51 */
52 public void genRSA() throws NoSuchAlgorithmException, InvalidKeyException, InvalidKeySpecException, SignatureException{
53
54 //--------------- Generovani a inicializace RSA algoritmu pro podpis, verze 2048 b, SHA512----
55
56
57
58 KeyPairGenerator keyGen = KeyPairGenerator.getInstance("RSA");
59 keyGen.initialize(2048);
60
61 keyPair = keyGen.generateKeyPair();
62
63
64 //byte[] publickoKey = keyPair.getPublic().getEncoded();
65
66 // byte[] privatkoKey = keyPair.getPrivate().getEncoded();
67
68
69 //PrivateKey privateKey = KeyFactory.getInstance("RSA").generatePrivate(new PKCS8EncodedKeySpec(privatkoKey));
70 // PublicKey publicKey = KeyFactory.getInstance("RSA").generatePublic(new X509EncodedKeySpec(publickoKey));
71
72 sign = Signature.getInstance("SHA512withRSA");
73
74 sign.initSign(keyPair.getPrivate());
75
76
77 //sign.initVerify(publicKey);
78
79 //pass = sign.sign();
80
81
82
83 /*
84 // Key publicky = keyPair.getPublic();
85 // Key privatko = keyPair.getPrivate();
86
87 //_____
88 byte[] publiccKey = keyGen.genKeyPair().getPublic().getEncoded();
89 StringBuffer retString = new StringBuffer();
90 retString.append("[");
91 for (int i = 0; i < publiccKey.length; ++i) {
92 retString.append(publiccKey[i]);
93 retString.append(", ");
94 }
95 retString = retString.delete(retString.length()-2,retString.length());
96 retString.append("]");
97 System.out.println(retString);
98
99 //_____
100*/
101
102
103
104
105
106
107
108
109 //---------------------------------------------
110 }
111
112 public String getPublicKey(){
113
114 return enc.encodeToString(keyPair.getPublic().getEncoded());
115 }
116
117 /**
118 * Podepisuje data
119 * Vstup i vystup kodovan v BASE64!
120 * @param data
121 * @return
122 * @throws SignatureException
123 */
124 public String sign(String data) throws SignatureException{
125
126 //--------------- RSA podepsani, stup: data----
127 sign.update(dec.decode(data));
128 byte[] signature = sign.sign();
129 //---------------------------------------------
130 return enc.encodeToString(signature);
131 }
132
133 /**
134 * generovani Diffie Hellman
135 * Vraci verejny klic v BASE64!
136 */
137 public String genDH() throws Exception{
138
139 byte[] pubA = null;
140 //--------------- Diffie helman, inicializace a vraceni verejneho klice----
141
142 KeyPairGenerator keyGen = KeyPairGenerator.getInstance("DH");
143 aKeyAgree= KeyAgreement.getInstance("DH");
144 KeyPair aPair = keyGen.generateKeyPair();
145 aKeyAgree.init(aPair.getPrivate());
146 aKeyAgree.doPhase(keyPair.getPublic(),true);
147 pubA = aKeyAgree.generateSecret();
148
149 ///?????????????????
150
151 //-------------------------------------------------------------------------
152 return enc.encodeToString(pubA);
153 }
154
155 /**
156 * inicializuje algoritmus DH klicem PK protistrany,
157 * vypocte sdilene tajemstvi
158 * vzpocte hash a vrati jej
159 * Vstup kodovan BASE64!
160 * @param pk
161 * @throws Exception
162 */
163 public void procDH(String pk) throws Exception {
164
165
166 byte[] bpk = dec.decode(pk.getBytes());
167 //--------------- Diffie Hellman , hash SHA1 -----------------------
168
169
170 MessageDigest hash = null;
171 pass = hash.digest(hash.digest(aKeyAgree.generateSecret()));
172 //Hash ulozit do pass - pouziva se na sifrovani
173 //-------------------------------------------------------------------
174 }
175
176 /**
177 * SifrovánÃ, vstup nenà kódován BASE64!
178 * Výstup kódován BASE64!
179 * @param data
180 * @return
181 * @throws Exception
182 */
183 public String encrypt(String data) throws Exception{
184
185 byte[] encAes = null;
186
187 //--------------- inicializace, sifrovani AES-128, mod ECB, padding PKCS5Padding----
188
189
190
191 Cipher cipher = Cipher.getInstance("AES/ECB/PKCS5Padding");
192 SecretKeySpec secretKey = new SecretKeySpec(keyPair.getPrivate().getEncoded(), "AES");
193 cipher.init(Cipher.ENCRYPT_MODE, secretKey);
194 encAes = cipher.doFinal(data.getBytes("UTF8"));
195
196
197
198 //-------------------------------------------------------------------
199 return enc.encodeToString(encAes);
200 }
201
202 /**
203 * DesifrovánÃ, vstup je kódován BASE64!
204 * Výstup kódován BASE64!
205 * @param data
206 * @return
207 * @throws Exception
208 */
209 public String decrypt(String data) throws Exception{
210
211 byte[] decAes = null;
212 //--------------- inicializace, desifrovani AES-128, mod ECB, padding PKCS5Padding---
213
214 Cipher cipher = Cipher.getInstance("AES/ECB/PKCS5PADDING");
215 SecretKeySpec secretKey = new SecretKeySpec(keyPair.getPublic().getEncoded(), "AES");
216 cipher.init(Cipher.DECRYPT_MODE, secretKey);
217 decAes = Base64.getDecoder().decode(data.getBytes("UTF8"));
218
219
220 //-------------------------------------------------------------------
221 return new String(decAes);
222 }
223
224
225
226}