-
Notifications
You must be signed in to change notification settings - Fork 2
/
Copy pathB10_AesCfbOfbPcbcPkcs5PaddingRandomStringJava11.java
261 lines (233 loc) · 13.4 KB
/
B10_AesCfbOfbPcbcPkcs5PaddingRandomStringJava11.java
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
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
package net.bplaced.javacrypto.symmetricencryption;
/*
* Herkunft/Origin: http://javacrypto.bplaced.net/
* Programmierer/Programmer: Michael Fehr
* Copyright/Copyright: frei verwendbares Programm (Public Domain)
* Copyright: This is free and unencumbered software released into the public domain.
* Lizenttext/Licence: <http://unlicense.org>
* getestet mit/tested with: Java Runtime Environment 8 Update 191 x64
* getestet mit/tested with: Java Runtime Environment 11.0.1 x64
* Datum/Date (dd.mm.jjjj): 13.01.2019
* Funktion: verschlüsselt einen string im aes cfb / ofb / pcbc modus pkcs5 padding
* Function: encrypts a string using aes cfb / ofb / pcbc modus with pkcs5 padding
*
* Sicherheitshinweis/Security notice
* Die Programmroutinen dienen nur der Darstellung und haben keinen Anspruch auf eine
* korrekte Funktion, insbesondere mit Blick auf die Sicherheit !
* Prüfen Sie die Sicherheit bevor das Programm in der echten Welt eingesetzt wird.
* The program routines just show the function but please be aware of the security part -
* check yourself before using in the real world !
*/
import java.io.UnsupportedEncodingException;
import java.security.InvalidAlgorithmParameterException;
import java.security.InvalidKeyException;
import java.security.NoSuchAlgorithmException;
import java.security.SecureRandom;
import javax.crypto.BadPaddingException;
import javax.crypto.Cipher;
import javax.crypto.IllegalBlockSizeException;
import javax.crypto.NoSuchPaddingException;
import javax.crypto.spec.IvParameterSpec;
import javax.crypto.spec.SecretKeySpec;
public class B10_AesCfbOfbPcbcPkcs5PaddingRandomStringJava11 {
public static void main(String[] args)
throws UnsupportedEncodingException, NoSuchAlgorithmException, NoSuchPaddingException, InvalidKeyException,
IllegalBlockSizeException, BadPaddingException, InvalidAlgorithmParameterException {
System.out.println(
"B10 AES in den Betriebsmodi CFB, OFB und PCBC PKCS5Padding mit Zufalls-Initvektor mit einem String");
// es werden ein paar variablen benötigt:
String plaintextString = "HalloWelt012345"; // hier 15 zeichen
String decryptedtextString = ""; // enthält später den entschlüsselten text
// diese konstanten und variablen benötigen wir zur ver- und entschlüsselung
// der schlüssel ist exakt 32 zeichen lang und bestimmt die stärke der
// verschlüsselung
// mögliche schlüssellängen sind 16 byte (128 bit), 24 byte (192 bit) und 32
// byte (256 bit)
// final byte[] keyByte = "1234567890123456".getBytes("UTF-8"); // 16 byte
final byte[] keyByte = "12345678901234567890123456789012".getBytes("UTF-8"); // 32 byte
// der initialisierungsvektor ist exakt 16 zeichen lang
final byte[] initvectorByte = new byte[16];
SecureRandom secureRandom = new SecureRandom();
secureRandom.nextBytes(initvectorByte);
byte[] plaintextByte = null;
// der verschluesselte (encrypted) text kommt in diese variable in form eines
// byte arrays
byte[] ciphertextByte = null; // die länge steht noch nicht fest, da sie von der größe des plaintextes abhängt
// der entschlüsselte (decrypted) text kommt in dieses byte array, welches
// später in einen string umkodiert wird
byte[] decryptedtextByte = null; // die länge steht noch nicht fest, da sie von der größe des plaintextes
// abhängt
// modus AES CFB PKCS Padding
// ab hier arbeiten wir nun im verschlüsselungsmodus
// umwandlung des klartextes in ein byte array
plaintextByte = plaintextString.getBytes("UTF-8");
ciphertextByte = AesCfbPaddingEncrypt(plaintextByte, keyByte, initvectorByte);
// ab hier arbeiten wir nun im entschlüsselungsmodus
// nun wird der ciphertext wieder entschlüsselt
decryptedtextByte = AesCfbPaddingDecrypt(ciphertextByte, keyByte, initvectorByte);
// zurück-kodierung des byte array in text
decryptedtextString = new String(decryptedtextByte, "UTF-8");
// ausgabe der variablen
System.out.println("");
System.out.println("Betriebsmodus: AES CFB PKCS Padding");
System.out.println("keyByte (hex) :" + printHexBinary(keyByte));
System.out.println("initvectorByte (hex) :" + printHexBinary(initvectorByte));
System.out.println("plaintextString :" + plaintextString);
System.out.println("plaintextByte (hex) :" + printHexBinary(plaintextByte));
System.out.println("= = = Verschlüsselung = = =");
System.out.println("ciphertextByte (hex) :" + printHexBinary(ciphertextByte));
System.out.println("= = = Entschlüsselung = = =");
System.out.println("decryptedtextByte (hex):" + printHexBinary(decryptedtextByte));
System.out.println("decryptedtextString :" + decryptedtextString);
// modus AES OFB PKCS Padding
// ab hier arbeiten wir nun im verschlüsselungsmodus
// umwandlung des klartextes in ein byte array
plaintextByte = plaintextString.getBytes("UTF-8");
ciphertextByte = AesOfbPaddingEncrypt(plaintextByte, keyByte, initvectorByte);
// ab hier arbeiten wir nun im entschlüsselungsmodus
// nun wird der ciphertext wieder entschlüsselt
decryptedtextByte = AesOfbPaddingDecrypt(ciphertextByte, keyByte, initvectorByte);
// zurück-kodierung des byte array in text
decryptedtextString = new String(decryptedtextByte, "UTF-8");
// ausgabe der variablen
System.out.println("");
System.out.println("Betriebsmodus: AES OFB PKCS Padding");
System.out.println("keyByte (hex) :" + printHexBinary(keyByte));
System.out.println("initvectorByte (hex) :" + printHexBinary(initvectorByte));
System.out.println("plaintextString :" + plaintextString);
System.out.println("plaintextByte (hex) :" + printHexBinary(plaintextByte));
System.out.println("= = = Verschlüsselung = = =");
System.out.println("ciphertextByte (hex) :" + printHexBinary(ciphertextByte));
System.out.println("= = = Entschlüsselung = = =");
System.out.println("decryptedtextByte (hex):" + printHexBinary(decryptedtextByte));
System.out.println("decryptedtextString :" + decryptedtextString);
// modus AES PCBC PKCS Padding
// ab hier arbeiten wir nun im verschlüsselungsmodus
// umwandlung des klartextes in ein byte array
plaintextByte = plaintextString.getBytes("UTF-8");
ciphertextByte = AesPcbcPaddingEncrypt(plaintextByte, keyByte, initvectorByte);
// ab hier arbeiten wir nun im entschlüsselungsmodus
// nun wird der ciphertext wieder entschlüsselt
decryptedtextByte = AesPcbcPaddingDecrypt(ciphertextByte, keyByte, initvectorByte);
// zurück-kodierung des byte array in text
decryptedtextString = new String(decryptedtextByte, "UTF-8");
// ausgabe der variablen
System.out.println("");
System.out.println("Betriebsmodus: AES PCBC PKCS Padding");
System.out.println("keyByte (hex) :" + printHexBinary(keyByte));
System.out.println("initvectorByte (hex) :" + printHexBinary(initvectorByte));
System.out.println("plaintextString :" + plaintextString);
System.out.println("plaintextByte (hex) :" + printHexBinary(plaintextByte));
System.out.println("= = = Verschlüsselung = = =");
System.out.println("ciphertextByte (hex) :" + printHexBinary(ciphertextByte));
System.out.println("= = = Entschlüsselung = = =");
System.out.println("decryptedtextByte (hex):" + printHexBinary(decryptedtextByte));
System.out.println("decryptedtextString :" + decryptedtextString);
}
public static byte[] AesCfbPaddingEncrypt(byte[] plaintextByte, byte[] keyByte, byte[] initvectorByte)
throws NoSuchAlgorithmException, NoSuchPaddingException, InvalidKeyException,
InvalidAlgorithmParameterException, IllegalBlockSizeException, BadPaddingException {
byte[] ciphertextByte = null;
// der schlüssel wird in die richtige form gebracht
SecretKeySpec keySpec = new SecretKeySpec(keyByte, "AES");
// der initvector wird in die richtige form gebracht
IvParameterSpec ivKeySpec = new IvParameterSpec(initvectorByte);
// die verschlüsselungsroutine wird mit dem gewünschten parameter erstellt
Cipher aesCipherEnc = Cipher.getInstance("AES/CFB/PKCS5PADDING");
// nun wird die routine mit dem schlüssel initialisiert
aesCipherEnc.init(Cipher.ENCRYPT_MODE, keySpec, ivKeySpec);
// hier erfolgt nun die verschlüsselung des plaintextes
ciphertextByte = aesCipherEnc.doFinal(plaintextByte);
return ciphertextByte;
}
public static byte[] AesCfbPaddingDecrypt(byte[] ciphertextByte, byte[] keyByte, byte[] initvectorByte)
throws NoSuchAlgorithmException, NoSuchPaddingException, InvalidKeyException,
InvalidAlgorithmParameterException, IllegalBlockSizeException, BadPaddingException {
byte[] decryptedtextByte = null;
// der schlüssel wird in die richtige form gebracht
SecretKeySpec keySpec = new SecretKeySpec(keyByte, "AES");
// der initvector wird in die richtige form gebracht
IvParameterSpec ivKeySpec = new IvParameterSpec(initvectorByte);
// die verschlüsselungsroutine wird mit dem gewünschten parameter erstellt
Cipher aesCipherDec = Cipher.getInstance("AES/CFB/PKCS5PADDING");
// nun wird die routine mit dem schlüssel initialisiert
aesCipherDec.init(Cipher.DECRYPT_MODE, keySpec, ivKeySpec);
// hier erfolgt nun die verschlüsselung des plaintextes
decryptedtextByte = aesCipherDec.doFinal(ciphertextByte);
return decryptedtextByte;
}
public static byte[] AesOfbPaddingEncrypt(byte[] plaintextByte, byte[] keyByte, byte[] initvectorByte)
throws NoSuchAlgorithmException, NoSuchPaddingException, InvalidKeyException,
InvalidAlgorithmParameterException, IllegalBlockSizeException, BadPaddingException {
byte[] ciphertextByte = null;
// der schlüssel wird in die richtige form gebracht
SecretKeySpec keySpec = new SecretKeySpec(keyByte, "AES");
// der initvector wird in die richtige form gebracht
IvParameterSpec ivKeySpec = new IvParameterSpec(initvectorByte);
// die verschlüsselungsroutine wird mit dem gewünschten parameter erstellt
Cipher aesCipherEnc = Cipher.getInstance("AES/OFB/PKCS5PADDING");
// nun wird die routine mit dem schlüssel initialisiert
aesCipherEnc.init(Cipher.ENCRYPT_MODE, keySpec, ivKeySpec);
// hier erfolgt nun die verschlüsselung des plaintextes
ciphertextByte = aesCipherEnc.doFinal(plaintextByte);
return ciphertextByte;
}
public static byte[] AesOfbPaddingDecrypt(byte[] ciphertextByte, byte[] keyByte, byte[] initvectorByte)
throws NoSuchAlgorithmException, NoSuchPaddingException, InvalidKeyException,
InvalidAlgorithmParameterException, IllegalBlockSizeException, BadPaddingException {
byte[] decryptedtextByte = null;
// der schlüssel wird in die richtige form gebracht
SecretKeySpec keySpec = new SecretKeySpec(keyByte, "AES");
// der initvector wird in die richtige form gebracht
IvParameterSpec ivKeySpec = new IvParameterSpec(initvectorByte);
// die verschlüsselungsroutine wird mit dem gewünschten parameter erstellt
Cipher aesCipherDec = Cipher.getInstance("AES/OFB/PKCS5PADDING");
// nun wird die routine mit dem schlüssel initialisiert
aesCipherDec.init(Cipher.DECRYPT_MODE, keySpec, ivKeySpec);
// hier erfolgt nun die verschlüsselung des plaintextes
decryptedtextByte = aesCipherDec.doFinal(ciphertextByte);
return decryptedtextByte;
}
public static byte[] AesPcbcPaddingEncrypt(byte[] plaintextByte, byte[] keyByte, byte[] initvectorByte)
throws NoSuchAlgorithmException, NoSuchPaddingException, InvalidKeyException,
InvalidAlgorithmParameterException, IllegalBlockSizeException, BadPaddingException {
byte[] ciphertextByte = null;
// der schlüssel wird in die richtige form gebracht
SecretKeySpec keySpec = new SecretKeySpec(keyByte, "AES");
// der initvector wird in die richtige form gebracht
IvParameterSpec ivKeySpec = new IvParameterSpec(initvectorByte);
// die verschlüsselungsroutine wird mit dem gewünschten parameter erstellt
Cipher aesCipherEnc = Cipher.getInstance("AES/PCBC/PKCS5PADDING");
// nun wird die routine mit dem schlüssel initialisiert
aesCipherEnc.init(Cipher.ENCRYPT_MODE, keySpec, ivKeySpec);
// hier erfolgt nun die verschlüsselung des plaintextes
ciphertextByte = aesCipherEnc.doFinal(plaintextByte);
return ciphertextByte;
}
public static byte[] AesPcbcPaddingDecrypt(byte[] ciphertextByte, byte[] keyByte, byte[] initvectorByte)
throws NoSuchAlgorithmException, NoSuchPaddingException, InvalidKeyException,
InvalidAlgorithmParameterException, IllegalBlockSizeException, BadPaddingException {
byte[] decryptedtextByte = null;
// der schlüssel wird in die richtige form gebracht
SecretKeySpec keySpec = new SecretKeySpec(keyByte, "AES");
// der initvector wird in die richtige form gebracht
IvParameterSpec ivKeySpec = new IvParameterSpec(initvectorByte);
// die verschlüsselungsroutine wird mit dem gewünschten parameter erstellt
Cipher aesCipherDec = Cipher.getInstance("AES/PCBC/PKCS5PADDING");
// nun wird die routine mit dem schlüssel initialisiert
aesCipherDec.init(Cipher.DECRYPT_MODE, keySpec, ivKeySpec);
// hier erfolgt nun die verschlüsselung des plaintextes
decryptedtextByte = aesCipherDec.doFinal(ciphertextByte);
return decryptedtextByte;
}
public static String printHexBinary(byte[] bytes) {
final char[] hexArray = "0123456789ABCDEF".toCharArray();
char[] hexChars = new char[bytes.length * 2];
for (int j = 0; j < bytes.length; j++) {
int v = bytes[j] & 0xFF;
hexChars[j * 2] = hexArray[v >>> 4];
hexChars[j * 2 + 1] = hexArray[v & 0x0F];
}
return new String(hexChars);
}
}