forked from sPredictorX1708/Ultimate-Java-Resources
-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathSignatureExample.java
More file actions
116 lines (92 loc) · 4.06 KB
/
SignatureExample.java
File metadata and controls
116 lines (92 loc) · 4.06 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
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
import java.io.File;
import java.io.IOException;
import java.io.PrintWriter;
import java.nio.file.Files;
import java.security.InvalidKeyException;
import java.security.KeyFactory;
import java.security.KeyPair;
import java.security.KeyPairGenerator;
import java.security.NoSuchAlgorithmException;
import java.security.PrivateKey;
import java.security.PublicKey;
import java.security.Signature;
import java.security.spec.PKCS8EncodedKeySpec;
import java.security.spec.X509EncodedKeySpec;
import java.util.Base64;
import java.util.List;
public class SignatureExample {
public static KeyPair generateKeyPair() throws NoSuchAlgorithmException {
KeyPairGenerator keyPairGen = KeyPairGenerator.getInstance("RSA");
KeyPair keyPair = keyPairGen.generateKeyPair();
return keyPair;
}
public static void writeKeyToFile(String folderPath, KeyPair keyPair) throws IOException {
File publicKeyFile = new File(folderPath.concat("/publicKey.pem"));
publicKeyFile.getParentFile().mkdirs();
File privateKeyFile = new File(folderPath.concat("/privateKey.pem"));
privateKeyFile.getParentFile().mkdir();
PrintWriter publicKeyOut = new PrintWriter(publicKeyFile);
publicKeyOut.write("-----BEGIN PUBLIC KEY-----");
publicKeyOut.write(System.lineSeparator());
publicKeyOut.write(Base64.getMimeEncoder().encodeToString(keyPair.getPublic().getEncoded()));
publicKeyOut.write(System.lineSeparator());
publicKeyOut.write("-----END PUBLIC KEY-----");
publicKeyOut.close();
PrintWriter privateKeyOut = new PrintWriter(privateKeyFile);
privateKeyOut.write("-----BEGIN PRIVATE KEY-----");
privateKeyOut.write(System.lineSeparator());
privateKeyOut.write(Base64.getMimeEncoder().encodeToString(keyPair.getPrivate().getEncoded()));
privateKeyOut.write(System.lineSeparator());
privateKeyOut.write("-----END PRIVATE KEY-----");
privateKeyOut.close();
}
public static byte[] sign(String data, String privateKeyFilePath) throws InvalidKeyException, Exception{
Signature rsa = Signature.getInstance("SHA1withRSA");
rsa.initSign(getPrivate(privateKeyFilePath));
rsa.update(data.getBytes());
return rsa.sign();
}
public static PrivateKey getPrivate(String filename) throws Exception {
List<String> encodedKeyArray = Files.readAllLines(new File(filename).toPath());
String encodedKey = "";
encodedKeyArray.remove(0);
encodedKeyArray.remove(encodedKeyArray.size() - 1);
for (String line : encodedKeyArray) {
encodedKey = encodedKey + line;
}
PKCS8EncodedKeySpec spec = new PKCS8EncodedKeySpec(Base64.getMimeDecoder().decode(encodedKey.trim()));
KeyFactory kf = KeyFactory.getInstance("RSA");
return kf.generatePrivate(spec);
}
private static boolean verifySignature(byte[] data, byte[] signature, String publicKeyFilePath) throws Exception {
Signature sig = Signature.getInstance("SHA1withRSA");
sig.initVerify(getPublic(publicKeyFilePath));
sig.update(data);
return sig.verify(signature);
}
public static PublicKey getPublic(String filename) throws Exception {
List<String> encodedKeyArray = Files.readAllLines(new File(filename).toPath());
String encodedKey = "";
encodedKeyArray.remove(0);
encodedKeyArray.remove(encodedKeyArray.size() - 1);
for (String line : encodedKeyArray) {
encodedKey = encodedKey + line;
}
X509EncodedKeySpec spec = new X509EncodedKeySpec(Base64.getMimeDecoder().decode(encodedKey.trim()));
KeyFactory kf = KeyFactory.getInstance("RSA");
return kf.generatePublic(spec);
}
public static void main(String[] args) throws InvalidKeyException, Exception {
KeyPair keyPair = generateKeyPair();
writeKeyToFile("KEYS", keyPair);
String data = "YOUR DATA HERE";
byte[] signedData = sign(data, "KEYS/privateKey.pem");
boolean verifySignedData = verifySignature(data.getBytes(), signedData, "KEYS/publicKey.pem");
System.out.println("Data to be Signed: " + data);
System.out.println("Signed Data: " + Base64.getEncoder().encodeToString(signedData));
if(verifySignedData)
System.out.println("Signature successfully verified.");
else
System.out.println("Signature couldn't be verified.");
}
}