-
Notifications
You must be signed in to change notification settings - Fork 2
/
B11_AesCtrNoPaddingRandomString.java
124 lines (112 loc) · 6.45 KB
/
B11_AesCtrNoPaddingRandomString.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
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
* Datum/Date (dd.mm.jjjj): 01.11.2018
* Funktion: verschlüsselt einen string im aes ctr modus kein padding
* Function: encrypts a string using aes ctr modus without 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;
import javax.xml.bind.DatatypeConverter;
public class B11_AesCtrNoPaddingRandomString {
public static void main(String[] args)
throws UnsupportedEncodingException, NoSuchAlgorithmException, NoSuchPaddingException, InvalidKeyException,
IllegalBlockSizeException, BadPaddingException, InvalidAlgorithmParameterException {
System.out.println("B11 AES im Betriebsmodus CTR Kein Padding 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
// ab hier arbeiten wir nun im verschlüsselungsmodus
// umwandlung des klartextes in ein byte array
plaintextByte = plaintextString.getBytes("UTF-8");
ciphertextByte = AesCtrNoPaddingEncrypt(plaintextByte, keyByte, initvectorByte);
// ab hier arbeiten wir nun im entschlüsselungsmodus
// nun wird der ciphertext wieder entschlüsselt
decryptedtextByte = AesCtrNoPaddingDecrypt(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("keyByte (hex) :" + DatatypeConverter.printHexBinary(keyByte));
System.out.println("initvectorByte (hex) :" + DatatypeConverter.printHexBinary(initvectorByte));
System.out.println("plaintextString :" + plaintextString);
System.out.println("plaintextByte (hex) :" + DatatypeConverter.printHexBinary(plaintextByte));
System.out.println("= = = Verschlüsselung = = =");
System.out.println("ciphertextByte (hex) :" + DatatypeConverter.printHexBinary(ciphertextByte));
System.out.println("= = = Entschlüsselung = = =");
System.out.println("decryptedtextByte (hex):" + DatatypeConverter.printHexBinary(decryptedtextByte));
System.out.println("decryptedtextString :" + decryptedtextString);
}
public static byte[] AesCtrNoPaddingEncrypt(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/CTR/NOPADDING");
// 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[] AesCtrNoPaddingDecrypt(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/CTR/NOPADDING");
// 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;
}
}