import org.bouncycastle.crypto.*;
import org.bouncycastle.crypto.digests.SHA1Digest;
import org.bouncycastle.crypto.params.RSAKeyParameters;
import org.bouncycastle.crypto.signers.RSADigestSigner;
import org.bouncycastle.x509.X509V1CertificateGenerator;
import org.bouncycastle.x509.X509V3CertificateGenerator;
import javax.security.auth.x500.X500Principal;
import java.io.DataInputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.math.BigInteger;
import java.security.*;
import java.security.cert.X509Certificate;
import java.security.interfaces.RSAPrivateKey;
import java.security.interfaces.RSAPublicKey;
import java.security.spec.PKCS8EncodedKeySpec;
import java.util.Date;
/**
* @Author: Flop Coder
* @Since: 6/16/14
*/
public class Main {
public static void main(String[] args) throws Exception{
byte[] nonce = "pQeYgQ28X1fhMCHahJ5Mmw==".getBytes();
KeyPairGenerator generator = KeyPairGenerator.getInstance("RSA");
SecureRandom random = SecureRandom.getInstance("SHA1PRNG");
generator.initialize(2048,random);
KeyPair keyPair = generator.generateKeyPair();
PrivateKey privateKey = keyPair.getPrivate();
PublicKey publicKey = keyPair.getPublic();
/*PrivateKey privateKey = readPrivateKey();*/
byte[] signature = generateSignature(nonce, privateKey);
X509Certificate certificate = genCert(keyPair);
System.out.println(certificate.getIssuerX500Principal());
System.out.println(verify(signature, certificate.getPublicKey(), nonce));
}
public static PrivateKey readPrivateKey() throws Exception{
File file = new File("E:\\Projects\\src\\main\\resources\\certs\\server.key");
FileInputStream fis = new FileInputStream(file);
DataInputStream dis = new DataInputStream(fis);
byte[] buf = new byte[(int)file.length()];
dis.readFully(buf);
dis.close();
PKCS8EncodedKeySpec kspec = new PKCS8EncodedKeySpec(buf);
KeyFactory kf = KeyFactory.getInstance("RSA");
PrivateKey privKey = kf.generatePrivate(kspec);
return privKey;
}
public static byte[] generateSignature(byte[] msg, PrivateKey privateKey) throws CryptoException, IOException {
RSAKeyParameters privParameters = new RSAKeyParameters
(true, ((RSAPrivateKey) privateKey).getModulus(), ((RSAPrivateKey) privateKey).getPrivateExponent());
SHA1Digest digest = new SHA1Digest();
byte[] signedData;
RSADigestSigner eng = new RSADigestSigner(digest);
eng.init(true, privParameters);
eng.update(msg, 0, msg.length);
signedData = eng.generateSignature();
return signedData;
}
public static X509Certificate genCert(KeyPair keyPair) throws Exception
{
X509V3CertificateGenerator certgen = new X509V3CertificateGenerator();
Date startDate = new Date(); // time from which certificate is valid
Date expiryDate = new Date(); // time after which certificate is not valid
BigInteger serialNumber = new BigInteger("123"); // serial number for certificate
// EC public/private key pair
X509V1CertificateGenerator certGen = new X509V1CertificateGenerator();
X500Principal dnName = new X500Principal("CN=flop@gmail.com,C=Dhaka");
certGen.setSerialNumber(serialNumber);
certGen.setIssuerDN(dnName);
certGen.setNotBefore(startDate);
certGen.setNotAfter(expiryDate);
certGen.setSubjectDN(dnName); // note: same as issuer
certGen.setPublicKey(keyPair.getPublic());
certGen.setSignatureAlgorithm("SHA1withRSA");
X509Certificate cert = certGen.generate(keyPair.getPrivate());
return cert;
}
private static boolean verify(byte[] signature, PublicKey pubKey, byte[] paramToSign) throws Exception {
RSAKeyParameters pubParameters =
new RSAKeyParameters(false, ((RSAPublicKey) pubKey).getModulus(), ((RSAPublicKey) pubKey).getPublicExponent());
SHA1Digest digest = new SHA1Digest();
org.bouncycastle.crypto.Signer eng = new RSADigestSigner(digest);
eng.init(false, pubParameters);
eng.update(paramToSign, 0, paramToSign.length);
return eng.verifySignature(signature);
}
}
0 Comments