@@ -320,21 +320,15 @@ public class RSAUtils { | |||||
X509EncodedKeySpec keySpec = new X509EncodedKeySpec(pubKeyBytes); | X509EncodedKeySpec keySpec = new X509EncodedKeySpec(pubKeyBytes); | ||||
KeyFactory keyFactory; | KeyFactory keyFactory; | ||||
try { | |||||
keyFactory = KeyFactory.getInstance("RSA"); | |||||
} catch (NoSuchAlgorithmException e) { | |||||
throw new com.jd.blockchain.crypto.CryptoException(e.getMessage(), e); | |||||
} | |||||
RSAPublicKey publicKey; | RSAPublicKey publicKey; | ||||
try { | try { | ||||
keyFactory = KeyFactory.getInstance("RSA"); | |||||
publicKey = (RSAPublicKey) keyFactory.generatePublic(keySpec); | publicKey = (RSAPublicKey) keyFactory.generatePublic(keySpec); | ||||
} catch (InvalidKeySpecException e) { | |||||
} catch (InvalidKeySpecException | NoSuchAlgorithmException e) { | |||||
throw new com.jd.blockchain.crypto.CryptoException(e.getMessage(), e); | throw new com.jd.blockchain.crypto.CryptoException(e.getMessage(), e); | ||||
} | } | ||||
assert publicKey != null; | |||||
BigInteger exponent = publicKey.getPublicExponent(); | BigInteger exponent = publicKey.getPublicExponent(); | ||||
BigInteger modulus = publicKey.getModulus(); | BigInteger modulus = publicKey.getModulus(); | ||||
@@ -430,7 +424,7 @@ public class RSAUtils { | |||||
BigInteger qInv = privKey.getQInv(); | BigInteger qInv = privKey.getQInv(); | ||||
byte[] modulusBytes = bigInteger2Bytes(modulus,MODULUS_LENGTH); | byte[] modulusBytes = bigInteger2Bytes(modulus,MODULUS_LENGTH); | ||||
byte[] pubExpBytes = pubExp.toByteArray(); | |||||
byte[] pubExpBytes = pubExp.toByteArray(); | |||||
byte[] privExpBytes = bigInteger2Bytes(privExp,PRIVEXP_LENGTH); | byte[] privExpBytes = bigInteger2Bytes(privExp,PRIVEXP_LENGTH); | ||||
byte[] pBytes = bigInteger2Bytes(p,P_LENGTH); | byte[] pBytes = bigInteger2Bytes(p,P_LENGTH); | ||||
byte[] qBytes = bigInteger2Bytes(q,Q_LENGTH); | byte[] qBytes = bigInteger2Bytes(q,Q_LENGTH); | ||||
@@ -463,21 +457,15 @@ public class RSAUtils { | |||||
PKCS8EncodedKeySpec keySpec = new PKCS8EncodedKeySpec(privKeyBytes); | PKCS8EncodedKeySpec keySpec = new PKCS8EncodedKeySpec(privKeyBytes); | ||||
KeyFactory keyFactory; | KeyFactory keyFactory; | ||||
try { | |||||
keyFactory = KeyFactory.getInstance("RSA"); | |||||
} catch (NoSuchAlgorithmException e) { | |||||
throw new com.jd.blockchain.crypto.CryptoException(e.getMessage(), e); | |||||
} | |||||
RSAPrivateCrtKey privateKey; | RSAPrivateCrtKey privateKey; | ||||
try { | try { | ||||
keyFactory = KeyFactory.getInstance("RSA"); | |||||
privateKey = (RSAPrivateCrtKey) keyFactory.generatePrivate(keySpec); | privateKey = (RSAPrivateCrtKey) keyFactory.generatePrivate(keySpec); | ||||
} catch (InvalidKeySpecException e) { | |||||
} catch (InvalidKeySpecException | NoSuchAlgorithmException e) { | |||||
throw new com.jd.blockchain.crypto.CryptoException(e.getMessage(), e); | throw new com.jd.blockchain.crypto.CryptoException(e.getMessage(), e); | ||||
} | } | ||||
assert privateKey != null; | |||||
BigInteger modulus = privateKey.getModulus(); | BigInteger modulus = privateKey.getModulus(); | ||||
BigInteger pubExp = privateKey.getPublicExponent(); | BigInteger pubExp = privateKey.getPublicExponent(); | ||||
BigInteger privExp = privateKey.getPrivateExponent(); | BigInteger privExp = privateKey.getPrivateExponent(); | ||||
@@ -540,7 +528,7 @@ public class RSAUtils { | |||||
result,0, length); | result,0, length); | ||||
} else { | } else { | ||||
System.arraycopy(srcBytes,0, | System.arraycopy(srcBytes,0, | ||||
result,length - srcLength, length); | |||||
result,length - srcLength, srcLength); | |||||
} | } | ||||
return result; | return result; | ||||
@@ -1,58 +0,0 @@ | |||||
package test.com.jd.blockchain.crypto.utils.classic; | |||||
import org.bouncycastle.asn1.x500.X500Name; | |||||
import org.bouncycastle.asn1.x509.SubjectPublicKeyInfo; | |||||
import org.bouncycastle.operator.ContentSigner; | |||||
import org.bouncycastle.operator.OperatorCreationException; | |||||
import org.bouncycastle.operator.jcajce.JcaContentSignerBuilder; | |||||
import org.bouncycastle.pkcs.PKCS10CertificationRequestBuilder; | |||||
import java.io.IOException; | |||||
import java.security.*; | |||||
/** | |||||
* @author zhanglin33 | |||||
* @title: CSRTest | |||||
* @description: TODO | |||||
* @date 2019-05-10, 12:55 | |||||
*/ | |||||
public class CSRTest { | |||||
public static String genCSR(String subject, String alg,String provider) { | |||||
String signalg=""; | |||||
int alglength=0; | |||||
String keyAlg=""; | |||||
if(alg.toUpperCase().equals("RSA1024")){ | |||||
signalg="SHA1WithRSA"; | |||||
alglength=1024; | |||||
keyAlg="RSA"; | |||||
}else if(alg.toUpperCase().equals("RSA2048")){ | |||||
signalg="SHA1WithRSA"; | |||||
alglength=2048; | |||||
keyAlg="RSA"; | |||||
}else if(alg.toUpperCase().equals("SM2")){ | |||||
signalg="SM3withSM2"; | |||||
alglength=256; | |||||
keyAlg="SM2"; | |||||
} | |||||
KeyPairGenerator keyGen; | |||||
PKCS10CertificationRequestBuilder builder; | |||||
try { | |||||
keyGen = KeyPairGenerator.getInstance(keyAlg); | |||||
keyGen.initialize(alglength); | |||||
KeyPair kp = keyGen.generateKeyPair(); | |||||
builder = new PKCS10CertificationRequestBuilder(new X500Name(subject), SubjectPublicKeyInfo.getInstance(kp.getPublic().getEncoded())); | |||||
JcaContentSignerBuilder jcaContentSignerBuilder = new JcaContentSignerBuilder(signalg); | |||||
jcaContentSignerBuilder.setProvider(provider); | |||||
ContentSigner contentSigner = jcaContentSignerBuilder.build(kp.getPrivate()); | |||||
builder.build(contentSigner); | |||||
return builder.toString(); | |||||
} catch (OperatorCreationException | NoSuchAlgorithmException e) { | |||||
e.printStackTrace(); | |||||
} | |||||
return null; | |||||
} | |||||
} |
@@ -1,79 +0,0 @@ | |||||
package test.com.jd.blockchain.crypto.utils.classic; | |||||
import org.bouncycastle.util.encoders.Base64; | |||||
import org.bouncycastle.util.encoders.Hex; | |||||
import org.junit.Test; | |||||
import java.io.ByteArrayInputStream; | |||||
import java.io.IOException; | |||||
import java.security.NoSuchProviderException; | |||||
import java.security.cert.CertificateException; | |||||
import java.security.cert.CertificateFactory; | |||||
import java.security.cert.X509Certificate; | |||||
import org.bouncycastle.jce.provider.BouncyCastleProvider; | |||||
/** | |||||
* @author zhanglin33 | |||||
* @title: CertTest | |||||
* @description: TODO | |||||
* @date 2019-05-09, 11:34 | |||||
*/ | |||||
public class CertTest { | |||||
private byte[] certBytes = Base64.decode("MIIEQDCCAyigAwIBAgIFICdVYzEwDQYJKoZIhvcNAQEFBQAwWTELMAkGA1UEBhMCQ04xMDAuBgNVBAoTJ0NoaW5hIEZpbmFuY2lhbCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTEYMBYGA1UEAxMPQ0ZDQSBURVNUIE9DQTExMB4XDTE5MDUxMDExMjAyNFoXDTIxMDUxMDExMjAyNFowcjELMAkGA1UEBhMCQ04xGDAWBgNVBAoTD0NGQ0EgVEVTVCBPQ0ExMTERMA8GA1UECxMITG9jYWwgUkExFTATBgNVBAsTDEluZGl2aWR1YWwtMTEfMB0GA1UEAxQWMDUxQGFhYWFhQFpIMDkzNTgwMjhAMzCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAJx3F2WD1dJPzK/nRHO7d1TJ1hTjzGTmv0PQ7ECsJAh3U3BtnGTpCB+b4+JMI4LO8nHkKIBQ3P9XnF+Bf1iXdWNAQ4aWCxa2nV7lCp4w0GliPu/EMgIfmsSDUtgqbM3cr8sR8r9m1xG3gt2TIQJ+jT7sAiguU/kyNzpjaccOUIgUFa8IDFq9UeB76MXtCuhlERRZQCl47e+9w7ZoxmE7e6IZORxPp7rQWVBHlR9ntWjJfNDTm3gMP5ehP+yIZnKx1LudxkBLQxpMmspzOyH1zqx5nkKe49AfWWpDxxRvYkriyYC3aE81qLsU/bhLwNEKOju7BGDF/mhJLZUedojM0gMCAwEAAaOB9TCB8jAfBgNVHSMEGDAWgBT8C7xEmg4xoYOpgYcnHgVCxr9W+DBIBgNVHSAEQTA/MD0GCGCBHIbvKgECMDEwLwYIKwYBBQUHAgEWI2h0dHA6Ly93d3cuY2ZjYS5jb20uY24vdXMvdXMtMTUuaHRtMDoGA1UdHwQzMDEwL6AtoCuGKWh0dHA6Ly8yMTAuNzQuNDIuMy9PQ0ExMS9SU0EvY3JsMjU2OTMuY3JsMAsGA1UdDwQEAwID6DAdBgNVHQ4EFgQU5oKGaQs7Jt5Gfbt1XhFTWAySEKswHQYDVR0lBBYwFAYIKwYBBQUHAwIGCCsGAQUFBwMEMA0GCSqGSIb3DQEBBQUAA4IBAQAlmPRaImZV51iKjtpMKuyLMw7dX8L0lY3tl+pVZZSxHuwsN4GCCtV0Ej50up+/6EbfL4NUTiuHVAjCroKKvb+94CrdEwdnQGM5IbGSjT78nQpeASXbIWuUwA+ImjvZOzvq/0b56AzonNzBxOMGko/bj5smM6X8jrgJ0NQppo2KNSVNC4JbuoNWI4FM94SE4DUi9H7EYl4JdOtDaDtCsq49o/A1CZyYrmoOPCgxpQQXmuB3lGq/jyoOlW2aW8uee/hYG1JJcSHLBjF0WBwdxssgbBotA5f1PebiIMSbFgjk57bd4M80hhU/rI4Hkn9pcp5R7NsX95TtyDIg90LboBnW"); | |||||
public static String getSubjectDN(byte[] der) { | |||||
String dn = ""; | |||||
try { | |||||
ByteArrayInputStream bIn = new ByteArrayInputStream(der); | |||||
//BouncyCastleProvider provider = new BouncyCastleProvider(); | |||||
//CertificateFactory cf = CertificateFactory.getInstance("X509", | |||||
//provider); | |||||
//CertificateFactory cf = CertificateFactory.getInstance("X.509", | |||||
// "SUN"); | |||||
//android 需采用bcprov | |||||
CertificateFactory cf = CertificateFactory.getInstance("X.509"); | |||||
// System.out.println(cf.getProvider().getName()); | |||||
X509Certificate cert = (X509Certificate) cf | |||||
.generateCertificate(bIn); | |||||
dn = cert.getSubjectDN().getName(); | |||||
System.out.println(Hex.toHexString(cert.getEncoded())); | |||||
byte[] pubKeyBytes = cert.getPublicKey().getEncoded(); | |||||
System.out.println(Hex.toHexString(pubKeyBytes)); | |||||
System.out.println(cert.getSigAlgName()); | |||||
String issuerName = cert.getIssuerDN().getName(); | |||||
System.out.println(issuerName); | |||||
String oid = cert.getSigAlgOID(); | |||||
System.out.println(oid); | |||||
System.out.println(); | |||||
String name = cert.getIssuerX500Principal().getName(); | |||||
System.out.println(name); | |||||
bIn.close(); | |||||
} catch (CertificateException | IOException e) { | |||||
e.printStackTrace(); | |||||
} | |||||
return dn; | |||||
} | |||||
// public static String parseCertDN(String dn, String type) { | |||||
// type = type + "="; | |||||
// String[] split = dn.split(","); | |||||
// for (String x : split) { | |||||
// if (x.contains(type)) { | |||||
// x = x.trim(); | |||||
// return x.substring(type.length()); | |||||
// } | |||||
// } | |||||
// return null; | |||||
// } | |||||
@Test | |||||
public void cert1Test() { | |||||
String string = getSubjectDN(certBytes); | |||||
System.out.println(Hex.toHexString(certBytes)); | |||||
System.out.println(string); | |||||
} | |||||
} |
@@ -159,10 +159,10 @@ public class RSAUtilsTest { | |||||
AsymmetricKeyParameter privKey = keyPair.getPrivate(); | AsymmetricKeyParameter privKey = keyPair.getPrivate(); | ||||
byte[] privKeyBytes = RSAUtils.privKey2Bytes_RawKey((RSAPrivateCrtKeyParameters) privKey); | byte[] privKeyBytes = RSAUtils.privKey2Bytes_RawKey((RSAPrivateCrtKeyParameters) privKey); | ||||
Random random = new Random(); | |||||
byte[] data; | byte[] data; | ||||
for (int i = 1; i < 1024; i++) { | |||||
data = new byte[i]; | |||||
Random random = new Random(); | |||||
data = new byte[1024]; | |||||
random.nextBytes(data); | random.nextBytes(data); | ||||
byte[] ciphertext = RSAUtils.encrypt(data, pubKey); | byte[] ciphertext = RSAUtils.encrypt(data, pubKey); | ||||
@@ -171,7 +171,6 @@ public class RSAUtilsTest { | |||||
assertArrayEquals(data, plaintextFromPrivKey); | assertArrayEquals(data, plaintextFromPrivKey); | ||||
assertArrayEquals(data, plaintextFromPrivKeyBytes); | assertArrayEquals(data, plaintextFromPrivKeyBytes); | ||||
} | |||||
} | } | ||||
@@ -1,212 +1,212 @@ | |||||
package test.com.jd.blockchain.crypto.utils.classic; | |||||
import org.bouncycastle.asn1.ASN1Sequence; | |||||
import org.bouncycastle.crypto.params.RSAKeyParameters; | |||||
import org.bouncycastle.crypto.params.RSAPrivateCrtKeyParameters; | |||||
import org.bouncycastle.crypto.util.OpenSSHPrivateKeyUtil; | |||||
import org.bouncycastle.crypto.util.OpenSSHPublicKeyUtil; | |||||
import org.bouncycastle.jce.spec.OpenSSHPrivateKeySpec; | |||||
import org.bouncycastle.jce.spec.OpenSSHPublicKeySpec; | |||||
import org.bouncycastle.util.Strings; | |||||
import org.bouncycastle.util.encoders.Base64; | |||||
import org.bouncycastle.util.encoders.Hex; | |||||
import org.bouncycastle.util.io.pem.PemReader; | |||||
import org.junit.Test; | |||||
import java.io.IOException; | |||||
import java.io.StringReader; | |||||
import java.math.BigInteger; | |||||
/** | |||||
* @author zhanglin33 | |||||
* @title: SSHKeyUtilsTest | |||||
* @description: Tests for methods in SSHKeyUtils | |||||
* @date 2019-05-07, 15:14 | |||||
*/ | |||||
public class SSHKeyUtilsTest { | |||||
@Test | |||||
public void parseRSAPublicKeyTest() { | |||||
String pubKeyStr = "AAAAB3NzaC1yc2EAAAADAQABAAABAQCYwLN4EXy7g0Xugv4lQfoujbARi48gPSxVupt" + | |||||
"GsSoGqsS00e9rA7v0qzFKa9Zhnw1WkjCnEXRYAMiCAJYkM/mGI8mb3qkcdNhGWZmPnopV+D46CTFB1" + | |||||
"4yeR9mjoOPXs4pjX3zGveKx5Nx8jvdoFewbTCtdN0x1XWTjNT5bXqP/4gXkLENEU5tLsWVAOu0ME/N" + | |||||
"e/9gMujAtDoolJ181a9P06bvEpIw5cLtUnsm5CtvBuiL7WBXxDJ/IASJrKNGBdK8xib1+Kb8tNLAT6" + | |||||
"Dj25BwylqiRNhb5l1Ni4aKrE2FqSEc5Nx5+csQMEl9MBJ3pEsLHBNbohDL+jbwLguRVD6CJ"; | |||||
byte[] pubKeyBytes = Base64.decode(pubKeyStr); | |||||
System.out.println(Hex.toHexString(pubKeyBytes)); | |||||
OpenSSHPublicKeySpec pubKeySpec = new OpenSSHPublicKeySpec(pubKeyBytes); | |||||
String pubKeyFormat = pubKeySpec.getFormat(); | |||||
String pubKeyType = pubKeySpec.getType(); | |||||
System.out.println(pubKeyFormat); | |||||
System.out.println(pubKeyType); | |||||
RSAKeyParameters pubKey = (RSAKeyParameters) OpenSSHPublicKeyUtil.parsePublicKey(pubKeyBytes); | |||||
BigInteger e = pubKey.getExponent(); | |||||
BigInteger n = pubKey.getModulus(); | |||||
System.out.println(Hex.toHexString(e.toByteArray())); | |||||
System.out.println(Hex.toHexString(n.toByteArray())); | |||||
System.out.println(); | |||||
System.out.println("-------------------------------------------------------"); | |||||
System.out.println(); | |||||
} | |||||
@Test | |||||
public void parseRSAPrivateKeyTest() { | |||||
String str2 = "-----BEGIN OPENSSH PRIVATE KEY-----\n" + | |||||
"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\n" + | |||||
"-----END OPENSSH PRIVATE KEY-----"; | |||||
byte[] Bytes2 = null; | |||||
try { | |||||
Bytes2 = new PemReader(new StringReader(str2)).readPemObject().getContent(); | |||||
} catch (IOException e1) { | |||||
e1.printStackTrace(); | |||||
} | |||||
System.out.println(Hex.toHexString(Bytes2)); | |||||
String str3 = "-----BEGIN OPENSSH PRIVATE KEY-----\n" + | |||||
"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\n" + | |||||
"-----END OPENSSH PRIVATE KEY-----"; | |||||
byte[] Bytes3 = null; | |||||
try { | |||||
Bytes3 = new PemReader(new StringReader(str3)).readPemObject().getContent(); | |||||
} catch (IOException e1) { | |||||
e1.printStackTrace(); | |||||
} | |||||
System.out.println(Hex.toHexString(Bytes3)); | |||||
// System.out.println(Hex.toHexString(Base64.decode("oNE9iA4ZyuZLbpEL7B29NaxGi4puT2Y5RDaMoEkoAKI"))); | |||||
// String test = "1ac477fa"; | |||||
// byte[] testBytes = Hex.decode(test); | |||||
// | |||||
// System.out.println(Base64.toBase64String(testBytes)); | |||||
byte[] AUTH_MAGIC = Strings.toByteArray("openssh-key-v1\0"); | |||||
System.out.println(Hex.toHexString(AUTH_MAGIC)); | |||||
System.out.println(Base64.toBase64String(AUTH_MAGIC)); | |||||
String privKeyStr = "-----BEGIN OPENSSH PRIVATE KEY-----\n" + | |||||
"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\n" + | |||||
"-----END OPENSSH PRIVATE KEY-----"; | |||||
byte[] privKeyBytes = null; | |||||
try { | |||||
privKeyBytes = new PemReader(new StringReader(privKeyStr)).readPemObject().getContent(); | |||||
} catch (IOException e1) { | |||||
e1.printStackTrace(); | |||||
} | |||||
assert privKeyBytes != null; | |||||
System.out.println(Hex.toHexString(privKeyBytes)); | |||||
OpenSSHPrivateKeySpec privKeySpec = new OpenSSHPrivateKeySpec(privKeyBytes); | |||||
String privKeyFormat = privKeySpec.getFormat(); | |||||
System.out.println(privKeyFormat); | |||||
RSAKeyParameters privKey = (RSAKeyParameters) OpenSSHPrivateKeyUtil.parsePrivateKeyBlob(privKeyBytes); | |||||
// BigInteger e = privKey.getPublicExponent(); | |||||
// BigInteger n = privKey.getModulus(); | |||||
// | |||||
// BigInteger d = privKey.getExponent(); | |||||
// BigInteger p = privKey.getP(); | |||||
// BigInteger q = privKey.getQ(); | |||||
// BigInteger dP = privKey.getDP(); | |||||
// BigInteger dQ = privKey.getDQ(); | |||||
// BigInteger qInv = privKey.getQInv(); | |||||
//package test.com.jd.blockchain.crypto.utils.classic; | |||||
// | |||||
//import org.bouncycastle.asn1.ASN1Sequence; | |||||
//import org.bouncycastle.crypto.params.RSAKeyParameters; | |||||
//import org.bouncycastle.crypto.params.RSAPrivateCrtKeyParameters; | |||||
//import org.bouncycastle.crypto.util.OpenSSHPrivateKeyUtil; | |||||
//import org.bouncycastle.crypto.util.OpenSSHPublicKeyUtil; | |||||
//import org.bouncycastle.jce.spec.OpenSSHPrivateKeySpec; | |||||
//import org.bouncycastle.jce.spec.OpenSSHPublicKeySpec; | |||||
//import org.bouncycastle.util.Strings; | |||||
//import org.bouncycastle.util.encoders.Base64; | |||||
//import org.bouncycastle.util.encoders.Hex; | |||||
//import org.bouncycastle.util.io.pem.PemReader; | |||||
//import org.junit.Test; | |||||
// | |||||
//import java.io.IOException; | |||||
//import java.io.StringReader; | |||||
//import java.math.BigInteger; | |||||
// | |||||
///** | |||||
// * @author zhanglin33 | |||||
// * @title: SSHKeyUtilsTest | |||||
// * @description: Tests for methods in SSHKeyUtils | |||||
// * @date 2019-05-07, 15:14 | |||||
// */ | |||||
//public class SSHKeyUtilsTest { | |||||
// | |||||
// @Test | |||||
// public void parseRSAPublicKeyTest() { | |||||
// | |||||
// String pubKeyStr = "AAAAB3NzaC1yc2EAAAADAQABAAABAQCYwLN4EXy7g0Xugv4lQfoujbARi48gPSxVupt" + | |||||
// "GsSoGqsS00e9rA7v0qzFKa9Zhnw1WkjCnEXRYAMiCAJYkM/mGI8mb3qkcdNhGWZmPnopV+D46CTFB1" + | |||||
// "4yeR9mjoOPXs4pjX3zGveKx5Nx8jvdoFewbTCtdN0x1XWTjNT5bXqP/4gXkLENEU5tLsWVAOu0ME/N" + | |||||
// "e/9gMujAtDoolJ181a9P06bvEpIw5cLtUnsm5CtvBuiL7WBXxDJ/IASJrKNGBdK8xib1+Kb8tNLAT6" + | |||||
// "Dj25BwylqiRNhb5l1Ni4aKrE2FqSEc5Nx5+csQMEl9MBJ3pEsLHBNbohDL+jbwLguRVD6CJ"; | |||||
// | |||||
// byte[] pubKeyBytes = Base64.decode(pubKeyStr); | |||||
// System.out.println(Hex.toHexString(pubKeyBytes)); | |||||
// OpenSSHPublicKeySpec pubKeySpec = new OpenSSHPublicKeySpec(pubKeyBytes); | |||||
// | |||||
// String pubKeyFormat = pubKeySpec.getFormat(); | |||||
// String pubKeyType = pubKeySpec.getType(); | |||||
// System.out.println(pubKeyFormat); | |||||
// System.out.println(pubKeyType); | |||||
// | |||||
// RSAKeyParameters pubKey = (RSAKeyParameters) OpenSSHPublicKeyUtil.parsePublicKey(pubKeyBytes); | |||||
// BigInteger e = pubKey.getExponent(); | |||||
// BigInteger n = pubKey.getModulus(); | |||||
// System.out.println(Hex.toHexString(e.toByteArray())); | // System.out.println(Hex.toHexString(e.toByteArray())); | ||||
// System.out.println(Hex.toHexString(n.toByteArray())); | // System.out.println(Hex.toHexString(n.toByteArray())); | ||||
// | // | ||||
// System.out.println(Hex.toHexString(d.toByteArray())); | |||||
// System.out.println(Hex.toHexString(p.toByteArray())); | |||||
// System.out.println(Hex.toHexString(q.toByteArray())); | |||||
// System.out.println(Hex.toHexString(dP.toByteArray())); | |||||
// System.out.println(Hex.toHexString(dQ.toByteArray())); | |||||
// System.out.println(Hex.toHexString(qInv.toByteArray())); | |||||
} | |||||
} | |||||
// System.out.println(); | |||||
// System.out.println("-------------------------------------------------------"); | |||||
// System.out.println(); | |||||
// | |||||
// | |||||
// } | |||||
// | |||||
// @Test | |||||
// public void parseRSAPrivateKeyTest() { | |||||
// | |||||
// String str2 = "-----BEGIN OPENSSH PRIVATE KEY-----\n" + | |||||
// "b3BlbnNzaC1rZXktdjEAAAAABG5vbmUAAAAEbm9uZQAAAAAAAAABAAABFwAAAAdzc2gtcn\n" + | |||||
// "NhAAAAAwEAAQAAAQEAwFyeWgHFu/ZMvqWa28QUGlKMDV7vpbzT7kyA/4yuotfprZKHNeEy\n" + | |||||
// "GugleJ/Kv5kqHh8Km4IZcfNcerTYds+U5m/uX4bSYpEbXco3DQ2lYQbYo7PBWwPMq2aIdd\n" + | |||||
// "i7WxUAlt0z1ugLNimskPzJ7DNra+ax0Wh9RnMsjZkfuBZiKq7wbBm7NyJmpg2B7xo5cz+G\n" + | |||||
// "Lw9e0tDlvgeLe+n68WvYWWFP59mfP6Qoy+NwjQnnwrhJi2j4dEexO97KmgnJhL07lu4eCQ\n" + | |||||
// "fdv68Tai9+aeDNawe7nmFYf2eNjah2jW/DwOwA/ErXnvgjLSMsgc6WGKfokhytAOFDGgvH\n" + | |||||
// "KKNd6BMYZwAAA9A7JircOyYq3AAAAAdzc2gtcnNhAAABAQDAXJ5aAcW79ky+pZrbxBQaUo\n" + | |||||
// "wNXu+lvNPuTID/jK6i1+mtkoc14TIa6CV4n8q/mSoeHwqbghlx81x6tNh2z5Tmb+5fhtJi\n" + | |||||
// "kRtdyjcNDaVhBtijs8FbA8yrZoh12LtbFQCW3TPW6As2KayQ/MnsM2tr5rHRaH1GcyyNmR\n" + | |||||
// "+4FmIqrvBsGbs3ImamDYHvGjlzP4YvD17S0OW+B4t76frxa9hZYU/n2Z8/pCjL43CNCefC\n" + | |||||
// "uEmLaPh0R7E73sqaCcmEvTuW7h4JB92/rxNqL35p4M1rB7ueYVh/Z42NqHaNb8PA7AD8St\n" + | |||||
// "ee+CMtIyyBzpYYp+iSHK0A4UMaC8coo13oExhnAAAAAwEAAQAAAQAEEvIXnen+LR06/G7n\n" + | |||||
// "MKPsWss0jUouDG3AokYpI2WfdUsxreTHM1nIUBpbD6dPn4LQ2H91A7BeRXUz9BiRi5vvtX\n" + | |||||
// "cq9sQF6mTV+65mzF8wSuDTtr7lmpL/HlDNjiWJrEwy5cRvTMLQBtnsyC3OntgrlNs3QCtH\n" + | |||||
// "DrFm3lNZpr+1f62Vu43dbcTPvLwcc335cJ73BU5WsMGaouCAqVXsVsgfkA66u6+gQs8O3F\n" + | |||||
// "IQntdzS8vYpkzH8N9qqNZit7kbFCRUTI7CDLHquJmclzB8uVwO0pR5+Aross+YL3QxPZoJ\n" + | |||||
// "+LXLlCi27oSmYk3fx3uh0XwwO3JFDQpeCxOuEsZbOy8BAAAAgCsktFksS0BViRuLyzC2H7\n" + | |||||
// "X7Uonf+dr8e4Yn+RgR329KFh/ok28/KZndZHsUnhdmiIjPr+SplFZZMrV/uJDkGezUNWGf\n" + | |||||
// "8qn+eEglm7nYfVf2EXTVNhpg8yfPChx90ybc8GYlqpEqf7LiCuEBCPqPJgq6K7i6UKbwn2\n" + | |||||
// "SfqUOBcz5BAAAAgQDqszdiNv0cTvZ/Xg3qJPsHXqQuLBYoe2vhU+Pipt9HviruUD1y3Mso\n" + | |||||
// "rOL9QBwjE7szGnwVE00J0mLp+s309+kftADLXqMyqFYiy7S8GIWQw0YNB2m8yjq+phHbBm\n" + | |||||
// "/Gs2P4+s8yKTcVJvMTyWr02rpCHiLTKDHoXPJcJ8yVMTHFRwAAAIEA0dHB9fXiesEKfwcp\n" + | |||||
// "X11IHAV8pTd+7VN81oGwxtRg88U7H2rmQFCxSZah2O/OCCmYLH3PHT95qnMHHqzcsVvoIy\n" + | |||||
// "7AfnMpp4KYU0Ic3aFuRjZk2sDsYUniPcCpuCvs8Jb75sDwKDW2EM8MowiNylDnYMmfYj0l\n" + | |||||
// "gIhz1/p79hXEI+EAAAAbemhhbmdsaW4zM0B6aGFuZ2xpbjMzLmxvY2Fs\n" + | |||||
// "-----END OPENSSH PRIVATE KEY-----"; | |||||
// | |||||
// byte[] Bytes2 = null; | |||||
// try { | |||||
// Bytes2 = new PemReader(new StringReader(str2)).readPemObject().getContent(); | |||||
// } catch (IOException e1) { | |||||
// e1.printStackTrace(); | |||||
// } | |||||
// System.out.println(Hex.toHexString(Bytes2)); | |||||
// | |||||
// String str3 = "-----BEGIN OPENSSH PRIVATE KEY-----\n" + | |||||
// "b3BlbnNzaC1rZXktdjEAAAAABG5vbmUAAAAEbm9uZQAAAAAAAAABAAABFwAAAAdzc2gtcn\n" + | |||||
// "NhAAAAAwEAAQAAAQEAvummQZm1FUFc/cV5nQBeowhjX4vIU4kBmyPmXHMViX4ORvWvD1yi\n" + | |||||
// "oxcaawPpP9QconpzjdCrNbmw0oZNt9UKlmrOU34YTRD5LFlEVOYjr/21/SO5yDGog8xJBU\n" + | |||||
// "HQYnXY5L2q9EXKOF45e5P6gSGUovrhePEsaniuQN48GIObPCOFkEN0ZV2DqRsn3It1vY+D\n" + | |||||
// "GiSb5EaZ2sNkudyzYfgFxcCbqBXmDa1WeyX5xYh8wldBJLUH+pO4gPoTXXX4UI4yNdDmPD\n" + | |||||
// "BWFvPVIOdpfdBnDbEp1AoE5Jx/+tbwFBIEvTPOECtOUKDGIlXXIH0I4waHbwf6EnHD5+BR\n" + | |||||
// "N0XwrzSkuwAAA9DYV/7H2Ff+xwAAAAdzc2gtcnNhAAABAQC+6aZBmbUVQVz9xXmdAF6jCG\n" + | |||||
// "Nfi8hTiQGbI+ZccxWJfg5G9a8PXKKjFxprA+k/1ByienON0Ks1ubDShk231QqWas5TfhhN\n" + | |||||
// "EPksWURU5iOv/bX9I7nIMaiDzEkFQdBiddjkvar0Rco4Xjl7k/qBIZSi+uF48SxqeK5A3j\n" + | |||||
// "wYg5s8I4WQQ3RlXYOpGyfci3W9j4MaJJvkRpnaw2S53LNh+AXFwJuoFeYNrVZ7JfnFiHzC\n" + | |||||
// "V0EktQf6k7iA+hNddfhQjjI10OY8MFYW89Ug52l90GcNsSnUCgTknH/61vAUEgS9M84QK0\n" + | |||||
// "5QoMYiVdcgfQjjBodvB/oSccPn4FE3RfCvNKS7AAAAAwEAAQAAAQArRruxUy6BSvfRbtpK\n" + | |||||
// "hLLvMg+UsRMQHJaInHKzskLHkBOcckTkrpMPdUU/zPsqxOJY0nkvRIYK/7TdhCRJ77ker8\n" + | |||||
// "dllcfccGSLcRDUTfb5BgIjB94tS1Rvy/chgfHC4APyliwSg197t6BAKyM18m7HIyfJSqJO\n" + | |||||
// "4FxfyADHbc3aq654tu+eaUtD7TEN1bH6PKMDvwSioMLgKU43GQeDJZbqamBE9y+KVhVx9y\n" + | |||||
// "3DEHrOPkRkZIG33y9j7B/i0vl+WnwUTzmLGRR0U6J9wrzyANL8ODYaAvk4FvUED8hQ72jh\n" + | |||||
// "NpAXsSgf6COUE1sUnO5DOwN1zHBNHaSo73Qu7aKZtL4BAAAAgDBW3ItiqU9Ip34KtLaayK\n" + | |||||
// "/BkRDDwFNvAxpOw9alpfbLGF5xbVjRN4wy7HJ4eA+7JJnx6A6xYrzykbPP+dnUnfzYuxH8\n" + | |||||
// "MrihOkYipw1VaR6/0XH+apmE1SmotuYbl+bpl9dlZYUI0pJ8wldqoDCNlSOcLy77HnKwu9\n" + | |||||
// "GpJx9KmW9WAAAAgQDdnrwfVv5trAuZZIcw2vLRWhoDT196k/Ty1GP4zFpDttb8OyZ8Ygpx\n" + | |||||
// "oA5PhYyl5M1g/2oR/Rpp3vfKDVThfn/bCnMtAbUHMfvYK3Oufvq5JmzT1rgGr3MEek+JBR\n" + | |||||
// "O17I87m4GE7iM1LzCUs2G/fKt2uoVXdniv0Vn0iCiZZc7JmwAAAIEA3IdsccarkUfFcQ2c\n" + | |||||
// "4TdHrx/RGmoTAO6k1xOHXZjWPmerinuOspIJL/ymWfqIxABCjub3UHyP7ap+1+AAnk+TMU\n" + | |||||
// "eR3tLEp9tRM6n0Td56DnQ9Q+RZhPqR486/teZ33cMBMHg52aIs/3AzMpK9xTFCRgqsKa6e\n" + | |||||
// "ednMB4Q1txvHU2EAAAAbemhhbmdsaW4zM0B6aGFuZ2xpbjMzLmxvY2Fs\n" + | |||||
// "-----END OPENSSH PRIVATE KEY-----"; | |||||
// | |||||
// byte[] Bytes3 = null; | |||||
// try { | |||||
// Bytes3 = new PemReader(new StringReader(str3)).readPemObject().getContent(); | |||||
// } catch (IOException e1) { | |||||
// e1.printStackTrace(); | |||||
// } | |||||
// System.out.println(Hex.toHexString(Bytes3)); | |||||
//// System.out.println(Hex.toHexString(Base64.decode("oNE9iA4ZyuZLbpEL7B29NaxGi4puT2Y5RDaMoEkoAKI"))); | |||||
//// String test = "1ac477fa"; | |||||
//// byte[] testBytes = Hex.decode(test); | |||||
//// | |||||
//// System.out.println(Base64.toBase64String(testBytes)); | |||||
// | |||||
// byte[] AUTH_MAGIC = Strings.toByteArray("openssh-key-v1\0"); | |||||
// System.out.println(Hex.toHexString(AUTH_MAGIC)); | |||||
// System.out.println(Base64.toBase64String(AUTH_MAGIC)); | |||||
// String privKeyStr = "-----BEGIN OPENSSH PRIVATE KEY-----\n" + | |||||
// "b3BlbnNzaC1rZXktdjEAAAAABG5vbmUAAAAEbm9uZQAAAAAAAAABAAABFwAAAAdzc2gtcn\n" + | |||||
// "NhAAAAAwEAAQAAAQEAmMCzeBF8u4NF7oL+JUH6Lo2wEYuPID0sVbqbRrEqBqrEtNHvawO7\n" + | |||||
// "9KsxSmvWYZ8NVpIwpxF0WADIggCWJDP5hiPJm96pHHTYRlmZj56KVfg+OgkxQdeMnkfZo6\n" + | |||||
// "Dj17OKY198xr3iseTcfI73aBXsG0wrXTdMdV1k4zU+W16j/+IF5CxDRFObS7FlQDrtDBPz\n" + | |||||
// "Xv/YDLowLQ6KJSdfNWvT9Om7xKSMOXC7VJ7JuQrbwboi+1gV8QyfyAEiayjRgXSvMYm9fi\n" + | |||||
// "m/LTSwE+g49uQcMpaokTYW+ZdTYuGiqxNhakhHOTcefnLEDBJfTASd6RLCxwTW6IQy/o28\n" + | |||||
// "C4LkVQ+giQAAA9AaxHf6GsR3+gAAAAdzc2gtcnNhAAABAQCYwLN4EXy7g0Xugv4lQfoujb\n" + | |||||
// "ARi48gPSxVuptGsSoGqsS00e9rA7v0qzFKa9Zhnw1WkjCnEXRYAMiCAJYkM/mGI8mb3qkc\n" + | |||||
// "dNhGWZmPnopV+D46CTFB14yeR9mjoOPXs4pjX3zGveKx5Nx8jvdoFewbTCtdN0x1XWTjNT\n" + | |||||
// "5bXqP/4gXkLENEU5tLsWVAOu0ME/Ne/9gMujAtDoolJ181a9P06bvEpIw5cLtUnsm5CtvB\n" + | |||||
// "uiL7WBXxDJ/IASJrKNGBdK8xib1+Kb8tNLAT6Dj25BwylqiRNhb5l1Ni4aKrE2FqSEc5Nx\n" + | |||||
// "5+csQMEl9MBJ3pEsLHBNbohDL+jbwLguRVD6CJAAAAAwEAAQAAAQARfhfPSylei9TpUGTs\n" + | |||||
// "PVb6F82u5K16QqceFiWL/ePTKaEnF9d0CNRwW15kqF6/hShQ3qLlrvEE1uofQRPwh2cuvl\n" + | |||||
// "BrIh95m8PcoowcT0qGN8xgdwcGBDodMhsxSs5suCnD4X53f+1C8/Nv7CtW5xPHuHxKy3dd\n" + | |||||
// "BVn1TvaaHgdn2PwJVKtZp+WVG3/UHr25nFHd8mYgpeHZqK9AW16N0UEMXMM1u8ZCubVOoS\n" + | |||||
// "IGuMAXpTug0xA+BXHo17FcDGKSzcXFzh+urIz5glRp5zFioHBqxNmkKfQkG6C7UxnPGyS/\n" + | |||||
// "/J+3lL2lvl0G8kO/5EDFMBhTMEy1NeR2b629S4G1qUxVAAAAgHDwE9kPiVETcxSzI4wotT\n" + | |||||
// "1Ee9nKVVD3oGdRqefvX7EUR8bvdv4nCqHPNBx8C6l8zo7fsQD81YL85F4eWbtrdxEijRHX\n" + | |||||
// "5m7J/muh/laY1Hq43WCkZGboO4fZ2HHi7oN096FqrKRpvbQGQi1FLbcISUdsitwrs6ywn3\n" + | |||||
// "fNx3q+X3V6AAAAgQDJRo9v+0QvldI33cpJKPKiaop5QvfIDzMatD3vLA1qqycgIi4KOtb5\n" + | |||||
// "+LP/jgIpCYah/sk+JpKNz/vsZmZmrfaVu9D3Le2LLBgMpEoSO8jOe9WGI4Ew75C7w7AZCa\n" + | |||||
// "SyUnHIVX/9D8Y5tx4cKx6Im9AGbNF35XZoKO4KCk5VMTXhnwAAAIEAwkjKIpTYdeAQVTRf\n" + | |||||
// "C13kg84Bu5n4WkiLnp1WOCg2GN5RekqprINtpjIMZoB9Fv292Np99La8yvmRoy5qzNHGdm\n" + | |||||
// "Q6AMku8jP123jF2J+wDvF714VtZHNvdCYBGJS+rZ81xtJfHhKtZqRAVtbPertOWZeuRm9V\n" + | |||||
// "o+/rEuEzgGYGXNcAAAAbemhhbmdsaW4zM0B6aGFuZ2xpbjMzLmxvY2Fs\n" + | |||||
// "-----END OPENSSH PRIVATE KEY-----"; | |||||
// | |||||
// byte[] privKeyBytes = null; | |||||
// try { | |||||
// privKeyBytes = new PemReader(new StringReader(privKeyStr)).readPemObject().getContent(); | |||||
// } catch (IOException e1) { | |||||
// e1.printStackTrace(); | |||||
// } | |||||
// | |||||
// assert privKeyBytes != null; | |||||
// System.out.println(Hex.toHexString(privKeyBytes)); | |||||
// | |||||
// | |||||
// OpenSSHPrivateKeySpec privKeySpec = new OpenSSHPrivateKeySpec(privKeyBytes); | |||||
// | |||||
// String privKeyFormat = privKeySpec.getFormat(); | |||||
// System.out.println(privKeyFormat); | |||||
// | |||||
// RSAKeyParameters privKey = (RSAKeyParameters) OpenSSHPrivateKeyUtil.parsePrivateKeyBlob(privKeyBytes); | |||||
// | |||||
//// BigInteger e = privKey.getPublicExponent(); | |||||
//// BigInteger n = privKey.getModulus(); | |||||
//// | |||||
//// BigInteger d = privKey.getExponent(); | |||||
//// BigInteger p = privKey.getP(); | |||||
//// BigInteger q = privKey.getQ(); | |||||
//// BigInteger dP = privKey.getDP(); | |||||
//// BigInteger dQ = privKey.getDQ(); | |||||
//// BigInteger qInv = privKey.getQInv(); | |||||
// | |||||
//// System.out.println(Hex.toHexString(e.toByteArray())); | |||||
//// System.out.println(Hex.toHexString(n.toByteArray())); | |||||
//// | |||||
//// System.out.println(Hex.toHexString(d.toByteArray())); | |||||
//// System.out.println(Hex.toHexString(p.toByteArray())); | |||||
//// System.out.println(Hex.toHexString(q.toByteArray())); | |||||
//// System.out.println(Hex.toHexString(dP.toByteArray())); | |||||
//// System.out.println(Hex.toHexString(dQ.toByteArray())); | |||||
//// System.out.println(Hex.toHexString(qInv.toByteArray())); | |||||
// | |||||
// | |||||
// | |||||
// } | |||||
// | |||||
//} |
@@ -14,7 +14,7 @@ | |||||
<dependencies> | <dependencies> | ||||
<dependency> | <dependency> | ||||
<groupId>com.jd.blockchain</groupId> | <groupId>com.jd.blockchain</groupId> | ||||
<artifactId>crypto-classic</artifactId> | |||||
<artifactId>crypto-framework</artifactId> | |||||
<version>${project.version}</version> | <version>${project.version}</version> | ||||
</dependency> | </dependency> | ||||
<dependency> | <dependency> | ||||
@@ -2,6 +2,7 @@ package com.jd.blockchain.crypto.service.pki; | |||||
import com.jd.blockchain.crypto.CryptoFunction; | import com.jd.blockchain.crypto.CryptoFunction; | ||||
import com.jd.blockchain.crypto.CryptoService; | import com.jd.blockchain.crypto.CryptoService; | ||||
import com.jd.blockchain.provider.NamedProvider; | |||||
import java.util.Arrays; | import java.util.Arrays; | ||||
import java.util.Collection; | import java.util.Collection; | ||||
@@ -14,6 +15,7 @@ import java.util.List; | |||||
* @description: TODO | * @description: TODO | ||||
* @date 2019-05-15, 16:35 | * @date 2019-05-15, 16:35 | ||||
*/ | */ | ||||
@NamedProvider("PKI-SOFTWARE") | |||||
public class PKICryptoService implements CryptoService { | public class PKICryptoService implements CryptoService { | ||||
public static final SHA1WITHRSA2048SignatureFunction SHA1WITHRSA2048 = new SHA1WITHRSA2048SignatureFunction(); | public static final SHA1WITHRSA2048SignatureFunction SHA1WITHRSA2048 = new SHA1WITHRSA2048SignatureFunction(); | ||||
@@ -4,18 +4,16 @@ import com.jd.blockchain.crypto.*; | |||||
import org.bouncycastle.asn1.DERNull; | import org.bouncycastle.asn1.DERNull; | ||||
import org.bouncycastle.asn1.pkcs.PKCSObjectIdentifiers; | import org.bouncycastle.asn1.pkcs.PKCSObjectIdentifiers; | ||||
import org.bouncycastle.asn1.x509.AlgorithmIdentifier; | import org.bouncycastle.asn1.x509.AlgorithmIdentifier; | ||||
import org.bouncycastle.jcajce.provider.asymmetric.rsa.BCRSAPrivateCrtKey; | |||||
import org.bouncycastle.jcajce.provider.asymmetric.util.KeyUtil; | import org.bouncycastle.jcajce.provider.asymmetric.util.KeyUtil; | ||||
import org.bouncycastle.jce.provider.BouncyCastleProvider; | import org.bouncycastle.jce.provider.BouncyCastleProvider; | ||||
import sun.security.rsa.RSAPrivateCrtKeyImpl; | |||||
import sun.security.rsa.RSAPrivateKeyImpl; | |||||
import sun.security.rsa.RSAPublicKeyImpl; | |||||
import java.math.BigInteger; | import java.math.BigInteger; | ||||
import java.security.*; | import java.security.*; | ||||
import java.security.interfaces.RSAPrivateCrtKey; | import java.security.interfaces.RSAPrivateCrtKey; | ||||
import java.security.interfaces.RSAPrivateKey; | |||||
import java.security.interfaces.RSAPublicKey; | import java.security.interfaces.RSAPublicKey; | ||||
import java.security.spec.InvalidKeySpecException; | |||||
import java.security.spec.PKCS8EncodedKeySpec; | |||||
import java.security.spec.X509EncodedKeySpec; | |||||
import static com.jd.blockchain.crypto.BaseCryptoKey.KEY_TYPE_BYTES; | import static com.jd.blockchain.crypto.BaseCryptoKey.KEY_TYPE_BYTES; | ||||
import static com.jd.blockchain.crypto.CryptoBytes.ALGORYTHM_CODE_SIZE; | import static com.jd.blockchain.crypto.CryptoBytes.ALGORYTHM_CODE_SIZE; | ||||
@@ -53,16 +51,21 @@ public class SHA1WITHRSA2048SignatureFunction implements SignatureFunction { | |||||
throw new CryptoException("This key is not SHA1WITHRSA2048 private key!"); | throw new CryptoException("This key is not SHA1WITHRSA2048 private key!"); | ||||
} | } | ||||
PKCS8EncodedKeySpec keySpec = new PKCS8EncodedKeySpec(rawPrivKeyBytes); | |||||
KeyFactory keyFactory; | |||||
RSAPrivateCrtKey rawPrivKey; | RSAPrivateCrtKey rawPrivKey; | ||||
Signature signer; | Signature signer; | ||||
byte[] signature; | byte[] signature; | ||||
try { | try { | ||||
rawPrivKey = (RSAPrivateCrtKey) RSAPrivateCrtKeyImpl.newKey(rawPrivKeyBytes); | |||||
keyFactory = KeyFactory.getInstance("RSA"); | |||||
rawPrivKey = (RSAPrivateCrtKey) keyFactory.generatePrivate(keySpec); | |||||
signer = Signature.getInstance("SHA1withRSA"); | signer = Signature.getInstance("SHA1withRSA"); | ||||
signer.initSign(rawPrivKey); | signer.initSign(rawPrivKey); | ||||
signer.update(data); | signer.update(data); | ||||
signature = signer.sign(); | signature = signer.sign(); | ||||
} catch (NoSuchAlgorithmException | InvalidKeyException | SignatureException e) { | |||||
} catch (NoSuchAlgorithmException | InvalidKeyException | SignatureException | InvalidKeySpecException e) { | |||||
throw new CryptoException(e.getMessage(), e); | throw new CryptoException(e.getMessage(), e); | ||||
} | } | ||||
@@ -86,17 +89,23 @@ public class SHA1WITHRSA2048SignatureFunction implements SignatureFunction { | |||||
if (digest.getAlgorithm() != SHA1WITHRSA2048.code() || rawDigestBytes.length != RAW_SIGNATUREDIGEST_SIZE) { | if (digest.getAlgorithm() != SHA1WITHRSA2048.code() || rawDigestBytes.length != RAW_SIGNATUREDIGEST_SIZE) { | ||||
throw new CryptoException("This is not SHA1WITHRSA2048 signature digest!"); | throw new CryptoException("This is not SHA1WITHRSA2048 signature digest!"); | ||||
} | } | ||||
RSAPublicKeyImpl rawPubKey; | |||||
X509EncodedKeySpec keySpec = new X509EncodedKeySpec(rawPubKeyBytes); | |||||
KeyFactory keyFactory; | |||||
RSAPublicKey rawPubKey; | |||||
Signature verifier; | Signature verifier; | ||||
boolean isValid = false; | |||||
boolean isValid; | |||||
try { | try { | ||||
rawPubKey = new RSAPublicKeyImpl(rawPubKeyBytes); | |||||
keyFactory = KeyFactory.getInstance("RSA"); | |||||
rawPubKey = (RSAPublicKey) keyFactory.generatePublic(keySpec); | |||||
verifier = Signature.getInstance("SHA1withRSA"); | verifier = Signature.getInstance("SHA1withRSA"); | ||||
verifier.initVerify(rawPubKey); | verifier.initVerify(rawPubKey); | ||||
verifier.update(data); | verifier.update(data); | ||||
isValid = verifier.verify(rawDigestBytes); | isValid = verifier.verify(rawDigestBytes); | ||||
} catch (NoSuchAlgorithmException | InvalidKeyException | SignatureException e) { | |||||
e.printStackTrace(); | |||||
} catch (NoSuchAlgorithmException | InvalidKeyException | SignatureException | InvalidKeySpecException e) { | |||||
throw new CryptoException(e.getMessage(), e); | |||||
} | } | ||||
return isValid; | return isValid; | ||||
@@ -146,14 +155,20 @@ public class SHA1WITHRSA2048SignatureFunction implements SignatureFunction { | |||||
if (privKey.getAlgorithm() != SHA1WITHRSA2048.code()) { | if (privKey.getAlgorithm() != SHA1WITHRSA2048.code()) { | ||||
throw new CryptoException("This key is not SHA1WITHRSA2048 private key!"); | throw new CryptoException("This key is not SHA1WITHRSA2048 private key!"); | ||||
} | } | ||||
PKCS8EncodedKeySpec keySpec = new PKCS8EncodedKeySpec(rawPrivKeyBytes); | |||||
KeyFactory keyFactory; | |||||
RSAPrivateCrtKey rawPrivKey; | |||||
byte[] rawPubKeyBytes; | byte[] rawPubKeyBytes; | ||||
try { | try { | ||||
RSAPrivateCrtKey rawPrivKey = (RSAPrivateCrtKey) RSAPrivateCrtKeyImpl.newKey(rawPrivKeyBytes); | |||||
keyFactory = KeyFactory.getInstance("RSA"); | |||||
rawPrivKey = (RSAPrivateCrtKey) keyFactory.generatePrivate(keySpec); | |||||
BigInteger modulus = rawPrivKey.getModulus(); | BigInteger modulus = rawPrivKey.getModulus(); | ||||
BigInteger exponent = rawPrivKey.getPublicExponent(); | BigInteger exponent = rawPrivKey.getPublicExponent(); | ||||
rawPubKeyBytes = KeyUtil.getEncodedSubjectPublicKeyInfo(RSA_ALGORITHM_IDENTIFIER, | rawPubKeyBytes = KeyUtil.getEncodedSubjectPublicKeyInfo(RSA_ALGORITHM_IDENTIFIER, | ||||
new org.bouncycastle.asn1.pkcs.RSAPublicKey(modulus, exponent)); | new org.bouncycastle.asn1.pkcs.RSAPublicKey(modulus, exponent)); | ||||
} catch (InvalidKeyException e) { | |||||
} catch (NoSuchAlgorithmException | InvalidKeySpecException e) { | |||||
throw new CryptoException(e.getMessage(), e); | throw new CryptoException(e.getMessage(), e); | ||||
} | } | ||||
@@ -0,0 +1,273 @@ | |||||
package com.jd.blockchain.crypto.service.pki; | |||||
import com.jd.blockchain.crypto.*; | |||||
import com.jd.blockchain.utils.io.BytesUtils; | |||||
import org.junit.Test; | |||||
import java.util.Random; | |||||
import static com.jd.blockchain.crypto.CryptoAlgorithm.*; | |||||
import static com.jd.blockchain.crypto.CryptoKeyType.PRIVATE; | |||||
import static com.jd.blockchain.crypto.CryptoKeyType.PUBLIC; | |||||
import static junit.framework.TestCase.assertNull; | |||||
import static org.junit.Assert.*; | |||||
import static org.junit.Assert.assertArrayEquals; | |||||
/** | |||||
* @author zhanglin33 | |||||
* @title: SHA1WITHRSA2048SignatureFunctionTest | |||||
* @description: TODO | |||||
* @date 2019-05-16, 10:49 | |||||
*/ | |||||
public class SHA1WITHRSA2048SignatureFunctionTest { | |||||
@Test | |||||
public void getAlgorithmTest() { | |||||
CryptoAlgorithm algorithm = Crypto.getAlgorithm("SHA1WITHRSA2048"); | |||||
assertNotNull(algorithm); | |||||
SignatureFunction signatureFunction = Crypto.getSignatureFunction(algorithm); | |||||
assertEquals(signatureFunction.getAlgorithm().name(), algorithm.name()); | |||||
assertEquals(signatureFunction.getAlgorithm().code(), algorithm.code()); | |||||
algorithm = Crypto.getAlgorithm("SHA1withRsa2048"); | |||||
assertNotNull(algorithm); | |||||
assertEquals(signatureFunction.getAlgorithm().name(), algorithm.name()); | |||||
assertEquals(signatureFunction.getAlgorithm().code(), algorithm.code()); | |||||
algorithm = Crypto.getAlgorithm("rsa2048"); | |||||
assertNull(algorithm); | |||||
} | |||||
@Test | |||||
public void generateKeyPairTest() { | |||||
CryptoAlgorithm algorithm = Crypto.getAlgorithm("SHA1WITHRSA2048"); | |||||
assertNotNull(algorithm); | |||||
SignatureFunction signatureFunction = Crypto.getSignatureFunction(algorithm); | |||||
AsymmetricKeypair keyPair = signatureFunction.generateKeypair(); | |||||
PubKey pubKey = keyPair.getPubKey(); | |||||
PrivKey privKey = keyPair.getPrivKey(); | |||||
assertEquals(PUBLIC.CODE, pubKey.getKeyType().CODE); | |||||
assertTrue(pubKey.getRawKeyBytes().length > 259); | |||||
assertEquals(PRIVATE.CODE, privKey.getKeyType().CODE); | |||||
assertTrue(privKey.getRawKeyBytes().length > 1155); | |||||
assertEquals(algorithm.code(), pubKey.getAlgorithm()); | |||||
assertEquals(algorithm.code(), privKey.getAlgorithm()); | |||||
byte[] algoBytes = CryptoAlgorithm.getCodeBytes(algorithm); | |||||
byte[] pubKeyTypeBytes = new byte[] { PUBLIC.CODE }; | |||||
byte[] privKeyTypeBytes = new byte[] { PRIVATE.CODE }; | |||||
byte[] rawPubKeyBytes = pubKey.getRawKeyBytes(); | |||||
byte[] rawPrivKeyBytes = privKey.getRawKeyBytes(); | |||||
assertArrayEquals(BytesUtils.concat(algoBytes, pubKeyTypeBytes, rawPubKeyBytes), pubKey.toBytes()); | |||||
assertArrayEquals(BytesUtils.concat(algoBytes, privKeyTypeBytes, rawPrivKeyBytes), privKey.toBytes()); | |||||
} | |||||
@Test | |||||
public void retrievePubKeyTest() { | |||||
CryptoAlgorithm algorithm = Crypto.getAlgorithm("SHA1WITHRSA2048"); | |||||
assertNotNull(algorithm); | |||||
SignatureFunction signatureFunction = Crypto.getSignatureFunction(algorithm); | |||||
AsymmetricKeypair keyPair = signatureFunction.generateKeypair(); | |||||
PubKey pubKey = keyPair.getPubKey(); | |||||
PrivKey privKey = keyPair.getPrivKey(); | |||||
PubKey retrievedPubKey = signatureFunction.retrievePubKey(privKey); | |||||
assertEquals(pubKey.getKeyType(), retrievedPubKey.getKeyType()); | |||||
assertEquals(pubKey.getRawKeyBytes().length, retrievedPubKey.getRawKeyBytes().length); | |||||
assertEquals(pubKey.getAlgorithm(), retrievedPubKey.getAlgorithm()); | |||||
assertArrayEquals(pubKey.toBytes(), retrievedPubKey.toBytes()); | |||||
} | |||||
@Test | |||||
public void signTest() { | |||||
byte[] data = new byte[1024]; | |||||
Random random = new Random(); | |||||
random.nextBytes(data); | |||||
CryptoAlgorithm algorithm = Crypto.getAlgorithm("SHA1WITHRSA2048"); | |||||
assertNotNull(algorithm); | |||||
SignatureFunction signatureFunction = Crypto.getSignatureFunction(algorithm); | |||||
AsymmetricKeypair keyPair = signatureFunction.generateKeypair(); | |||||
PrivKey privKey = keyPair.getPrivKey(); | |||||
SignatureDigest signatureDigest = signatureFunction.sign(privKey, data); | |||||
byte[] signatureBytes = signatureDigest.toBytes(); | |||||
assertEquals(2 + 256, signatureBytes.length); | |||||
assertEquals(algorithm.code(), signatureDigest.getAlgorithm()); | |||||
assertEquals(PKIAlgorithm.SHA1WITHRSA2048.code(), signatureDigest.getAlgorithm()); | |||||
assertEquals((short) (SIGNATURE_ALGORITHM | ASYMMETRIC_KEY | ((byte) 31 & 0x00FF)), | |||||
signatureDigest.getAlgorithm()); | |||||
byte[] algoBytes = BytesUtils.toBytes(signatureDigest.getAlgorithm()); | |||||
byte[] rawSinatureBytes = signatureDigest.getRawDigest(); | |||||
assertArrayEquals(BytesUtils.concat(algoBytes, rawSinatureBytes), signatureBytes); | |||||
} | |||||
@Test | |||||
public void verifyTest() { | |||||
byte[] data = new byte[1024]; | |||||
Random random = new Random(); | |||||
random.nextBytes(data); | |||||
CryptoAlgorithm algorithm = Crypto.getAlgorithm("SHA1WITHRSA2048"); | |||||
assertNotNull(algorithm); | |||||
SignatureFunction signatureFunction = Crypto.getSignatureFunction(algorithm); | |||||
AsymmetricKeypair keyPair = signatureFunction.generateKeypair(); | |||||
PubKey pubKey = keyPair.getPubKey(); | |||||
PrivKey privKey = keyPair.getPrivKey(); | |||||
SignatureDigest signatureDigest = signatureFunction.sign(privKey, data); | |||||
assertTrue(signatureFunction.verify(signatureDigest, pubKey, data)); | |||||
} | |||||
@Test | |||||
public void supportPrivKeyTest() { | |||||
CryptoAlgorithm algorithm = Crypto.getAlgorithm("SHA1WITHRSA2048"); | |||||
assertNotNull(algorithm); | |||||
SignatureFunction signatureFunction = Crypto.getSignatureFunction(algorithm); | |||||
AsymmetricKeypair keyPair = signatureFunction.generateKeypair(); | |||||
PrivKey privKey = keyPair.getPrivKey(); | |||||
byte[] privKeyBytes = privKey.toBytes(); | |||||
assertTrue(signatureFunction.supportPrivKey(privKeyBytes)); | |||||
} | |||||
@Test | |||||
public void resolvePrivKeyTest() { | |||||
CryptoAlgorithm algorithm = Crypto.getAlgorithm("SHA1WITHRSA2048"); | |||||
assertNotNull(algorithm); | |||||
SignatureFunction signatureFunction = Crypto.getSignatureFunction(algorithm); | |||||
AsymmetricKeypair keyPair = signatureFunction.generateKeypair(); | |||||
PrivKey privKey = keyPair.getPrivKey(); | |||||
byte[] privKeyBytes = privKey.toBytes(); | |||||
PrivKey resolvedPrivKey = signatureFunction.resolvePrivKey(privKeyBytes); | |||||
assertEquals(PRIVATE.CODE, resolvedPrivKey.getKeyType().CODE); | |||||
assertEquals(PKIAlgorithm.SHA1WITHRSA2048.code(), resolvedPrivKey.getAlgorithm()); | |||||
assertEquals((short) (SIGNATURE_ALGORITHM | ASYMMETRIC_KEY | ((byte) 31 & 0x00FF)), | |||||
resolvedPrivKey.getAlgorithm()); | |||||
assertArrayEquals(privKeyBytes, resolvedPrivKey.toBytes()); | |||||
} | |||||
@Test | |||||
public void supportPubKeyTest() { | |||||
CryptoAlgorithm algorithm = Crypto.getAlgorithm("SHA1WITHRSA2048"); | |||||
assertNotNull(algorithm); | |||||
SignatureFunction signatureFunction = Crypto.getSignatureFunction(algorithm); | |||||
AsymmetricKeypair keyPair = signatureFunction.generateKeypair(); | |||||
PubKey pubKey = keyPair.getPubKey(); | |||||
byte[] pubKeyBytes = pubKey.toBytes(); | |||||
assertTrue(signatureFunction.supportPubKey(pubKeyBytes)); | |||||
} | |||||
@Test | |||||
public void resolvePubKeyTest() { | |||||
CryptoAlgorithm algorithm = Crypto.getAlgorithm("SHA1WITHRSA2048"); | |||||
assertNotNull(algorithm); | |||||
SignatureFunction signatureFunction = Crypto.getSignatureFunction(algorithm); | |||||
AsymmetricKeypair keyPair = signatureFunction.generateKeypair(); | |||||
PubKey pubKey = keyPair.getPubKey(); | |||||
byte[] pubKeyBytes = pubKey.toBytes(); | |||||
PubKey resolvedPubKey = signatureFunction.resolvePubKey(pubKeyBytes); | |||||
assertEquals(PUBLIC.CODE, resolvedPubKey.getKeyType().CODE); | |||||
assertEquals(PKIAlgorithm.SHA1WITHRSA2048.code(), resolvedPubKey.getAlgorithm()); | |||||
assertEquals((short) (SIGNATURE_ALGORITHM | ASYMMETRIC_KEY | ((byte) 31 & 0x00FF)), | |||||
resolvedPubKey.getAlgorithm()); | |||||
assertArrayEquals(pubKeyBytes, resolvedPubKey.toBytes()); | |||||
} | |||||
@Test | |||||
public void supportDigestTest() { | |||||
byte[] data = new byte[1024]; | |||||
Random random = new Random(); | |||||
random.nextBytes(data); | |||||
CryptoAlgorithm algorithm = Crypto.getAlgorithm("SHA1WITHRSA2048"); | |||||
assertNotNull(algorithm); | |||||
SignatureFunction signatureFunction = Crypto.getSignatureFunction(algorithm); | |||||
AsymmetricKeypair keyPair = signatureFunction.generateKeypair(); | |||||
PrivKey privKey = keyPair.getPrivKey(); | |||||
SignatureDigest signatureDigest = signatureFunction.sign(privKey, data); | |||||
byte[] signatureDigestBytes = signatureDigest.toBytes(); | |||||
assertTrue(signatureFunction.supportDigest(signatureDigestBytes)); | |||||
} | |||||
@Test | |||||
public void resolveDigestTest() { | |||||
byte[] data = new byte[1024]; | |||||
Random random = new Random(); | |||||
random.nextBytes(data); | |||||
CryptoAlgorithm algorithm = Crypto.getAlgorithm("SHA1WITHRSA2048"); | |||||
assertNotNull(algorithm); | |||||
SignatureFunction signatureFunction = Crypto.getSignatureFunction(algorithm); | |||||
AsymmetricKeypair keyPair = signatureFunction.generateKeypair(); | |||||
PrivKey privKey = keyPair.getPrivKey(); | |||||
SignatureDigest signatureDigest = signatureFunction.sign(privKey, data); | |||||
byte[] signatureDigestBytes = signatureDigest.toBytes(); | |||||
SignatureDigest resolvedSignatureDigest = signatureFunction.resolveDigest(signatureDigestBytes); | |||||
assertEquals(256, resolvedSignatureDigest.getRawDigest().length); | |||||
assertEquals(PKIAlgorithm.SHA1WITHRSA2048.code(), resolvedSignatureDigest.getAlgorithm()); | |||||
assertEquals((short) (SIGNATURE_ALGORITHM | ASYMMETRIC_KEY | ((byte) 31 & 0x00FF)), | |||||
resolvedSignatureDigest.getAlgorithm()); | |||||
assertArrayEquals(signatureDigestBytes, resolvedSignatureDigest.toBytes()); | |||||
} | |||||
} |
@@ -40,7 +40,6 @@ public class CSRBuilderTest { | |||||
String csr = builder.buildRequest(countryName,stateName,cityName, | String csr = builder.buildRequest(countryName,stateName,cityName, | ||||
organizationName,departmentName,domainName, | organizationName,departmentName,domainName, | ||||
emailName); | emailName); | ||||
System.out.println(csr); | |||||
PublicKey pubKey = builder.getPubKey(); | PublicKey pubKey = builder.getPubKey(); | ||||
PrivateKey privKey = builder.getPrivKey(); | PrivateKey privKey = builder.getPrivKey(); | ||||