@@ -49,7 +49,6 @@ public class ED25519SignatureFunction implements SignatureFunction { | |||||
} | } | ||||
// 调用ED25519签名算法计算签名结果 | // 调用ED25519签名算法计算签名结果 | ||||
// return new SignatureDigest(ED25519, Ed25519Utils.sign_512(data, rawPrivKeyBytes)); | |||||
return new SignatureDigest(ED25519, ED25519Utils.sign(data, rawPrivKeyBytes)); | return new SignatureDigest(ED25519, ED25519Utils.sign(data, rawPrivKeyBytes)); | ||||
} | } | ||||
@@ -76,7 +75,6 @@ public class ED25519SignatureFunction implements SignatureFunction { | |||||
} | } | ||||
// 调用ED25519验签算法验证签名结果 | // 调用ED25519验签算法验证签名结果 | ||||
// return Ed25519Utils.verify(data, rawPubKeyBytes, rawDigestBytes); | |||||
return ED25519Utils.verify(data, rawPubKeyBytes, rawDigestBytes); | return ED25519Utils.verify(data, rawPubKeyBytes, rawDigestBytes); | ||||
} | } | ||||
@@ -84,21 +82,8 @@ public class ED25519SignatureFunction implements SignatureFunction { | |||||
public PubKey retrievePubKey(PrivKey privKey) { | public PubKey retrievePubKey(PrivKey privKey) { | ||||
byte[] rawPrivKeyBytes = privKey.getRawKeyBytes(); | byte[] rawPrivKeyBytes = privKey.getRawKeyBytes(); | ||||
byte[] rawPubKeyBytes = ED25519Utils.retrievePublicKey(rawPrivKeyBytes); | byte[] rawPubKeyBytes = ED25519Utils.retrievePublicKey(rawPrivKeyBytes); | ||||
// EdDSAParameterSpec spec = EdDSANamedCurveTable.getByName(EdDSANamedCurveTable.CURVE_ED25519_SHA512); | |||||
// EdDSAPrivateKeySpec privateKeySpec = new EdDSAPrivateKeySpec(rawPrivKeyBytes, spec); | |||||
// byte[] rawPubKeyBytes = privateKeySpec.getA().toByteArray(); | |||||
return new PubKey(ED25519, rawPubKeyBytes); | return new PubKey(ED25519, rawPubKeyBytes); | ||||
} | } | ||||
// | |||||
// @Override | |||||
// public byte[] retrievePubKey(byte[] privKeyBytes) { | |||||
// | |||||
// byte[] rawPrivKeyBytes = resolvePrivKey(privKeyBytes).getRawKeyBytes(); | |||||
// EdDSAParameterSpec spec = EdDSANamedCurveTable.getByName(EdDSANamedCurveTable.CURVE_ED25519_SHA512); | |||||
// EdDSAPrivateKeySpec privateKeySpec = new EdDSAPrivateKeySpec(rawPrivKeyBytes, spec); | |||||
// byte[] rawPubKeyBytes = privateKeySpec.getA().toByteArray(); | |||||
// return new PubKey(ED25519, rawPubKeyBytes).toBytes(); | |||||
// } | |||||
@Override | @Override | ||||
public boolean supportPrivKey(byte[] privKeyBytes) { | public boolean supportPrivKey(byte[] privKeyBytes) { | ||||
@@ -112,7 +97,7 @@ public class ED25519SignatureFunction implements SignatureFunction { | |||||
if (supportPrivKey(privKeyBytes)) { | if (supportPrivKey(privKeyBytes)) { | ||||
return new PrivKey(privKeyBytes); | return new PrivKey(privKeyBytes); | ||||
} else { | } else { | ||||
throw new CryptoException("privKeyBytes is invalid!"); | |||||
throw new CryptoException("privKeyBytes are invalid!"); | |||||
} | } | ||||
} | } | ||||
@@ -129,7 +114,7 @@ public class ED25519SignatureFunction implements SignatureFunction { | |||||
if (supportPubKey(pubKeyBytes)) { | if (supportPubKey(pubKeyBytes)) { | ||||
return new PubKey(pubKeyBytes); | return new PubKey(pubKeyBytes); | ||||
} else { | } else { | ||||
throw new CryptoException("pubKeyBytes is invalid!"); | |||||
throw new CryptoException("pubKeyBytes are invalid!"); | |||||
} | } | ||||
} | } | ||||
@@ -144,7 +129,7 @@ public class ED25519SignatureFunction implements SignatureFunction { | |||||
if (supportDigest(digestBytes)) { | if (supportDigest(digestBytes)) { | ||||
return new SignatureDigest(digestBytes); | return new SignatureDigest(digestBytes); | ||||
} else { | } else { | ||||
throw new CryptoException("digestBytes is invalid!"); | |||||
throw new CryptoException("digestBytes are invalid!"); | |||||
} | } | ||||
} | } | ||||
@@ -162,11 +147,6 @@ public class ED25519SignatureFunction implements SignatureFunction { | |||||
byte[] privKeyBytes = privKeyParams.getEncoded(); | byte[] privKeyBytes = privKeyParams.getEncoded(); | ||||
byte[] pubKeyBytes = pubKeyParams.getEncoded(); | byte[] pubKeyBytes = pubKeyParams.getEncoded(); | ||||
// KeyPairGenerator keyPairGenerator = new KeyPairGenerator(); | |||||
// KeyPair keyPair = keyPairGenerator.generateKeyPair(); | |||||
// EdDSAPrivateKey privKey = (EdDSAPrivateKey) keyPair.getPrivate(); | |||||
// EdDSAPublicKey pubKey = (EdDSAPublicKey) keyPair.getPublic(); | |||||
// return new CryptoKeyPair(new PubKey(ED25519, pubKey.getAbyte()), new PrivKey(ED25519, privKey.getSeed())); | |||||
return new AsymmetricKeypair(new PubKey(ED25519, pubKeyBytes), new PrivKey(ED25519, privKeyBytes)); | return new AsymmetricKeypair(new PubKey(ED25519, pubKeyBytes), new PrivKey(ED25519, privKeyBytes)); | ||||
} | } | ||||
@@ -9,6 +9,7 @@ import com.jd.blockchain.crypto.CryptoBytes; | |||||
import com.jd.blockchain.crypto.CryptoException; | import com.jd.blockchain.crypto.CryptoException; | ||||
import com.jd.blockchain.crypto.HashDigest; | import com.jd.blockchain.crypto.HashDigest; | ||||
import com.jd.blockchain.crypto.HashFunction; | import com.jd.blockchain.crypto.HashFunction; | ||||
import com.jd.blockchain.crypto.utils.classic.RIPEMD160Utils; | |||||
import com.jd.blockchain.utils.security.RipeMD160Utils; | import com.jd.blockchain.utils.security.RipeMD160Utils; | ||||
public class RIPEMD160HashFunction implements HashFunction { | public class RIPEMD160HashFunction implements HashFunction { | ||||
@@ -34,7 +35,7 @@ public class RIPEMD160HashFunction implements HashFunction { | |||||
throw new CryptoException("data is null!"); | throw new CryptoException("data is null!"); | ||||
} | } | ||||
byte[] digestBytes = RipeMD160Utils.hash(data); | |||||
byte[] digestBytes = RIPEMD160Utils.hash(data); | |||||
return new HashDigest(RIPEMD160, digestBytes); | return new HashDigest(RIPEMD160, digestBytes); | ||||
} | } | ||||
@@ -9,6 +9,7 @@ import com.jd.blockchain.crypto.CryptoBytes; | |||||
import com.jd.blockchain.crypto.CryptoException; | import com.jd.blockchain.crypto.CryptoException; | ||||
import com.jd.blockchain.crypto.HashDigest; | import com.jd.blockchain.crypto.HashDigest; | ||||
import com.jd.blockchain.crypto.HashFunction; | import com.jd.blockchain.crypto.HashFunction; | ||||
import com.jd.blockchain.crypto.utils.classic.SHA256Utils; | |||||
import com.jd.blockchain.utils.security.ShaUtils; | import com.jd.blockchain.utils.security.ShaUtils; | ||||
public class SHA256HashFunction implements HashFunction { | public class SHA256HashFunction implements HashFunction { | ||||
@@ -34,7 +35,7 @@ public class SHA256HashFunction implements HashFunction { | |||||
throw new CryptoException("data is null!"); | throw new CryptoException("data is null!"); | ||||
} | } | ||||
byte[] digestBytes = ShaUtils.hash_256(data); | |||||
byte[] digestBytes = SHA256Utils.hash(data); | |||||
return new HashDigest(SHA256, digestBytes); | return new HashDigest(SHA256, digestBytes); | ||||
} | } | ||||
@@ -0,0 +1,10 @@ | |||||
package com.jd.blockchain.crypto.utils.classic; | |||||
/** | |||||
* @author zhanglin33 | |||||
* @title: AESUtils | |||||
* @description: AES/CBC/PKCS7Padding symmetric encryption algorithm | |||||
* @date 2019-04-22, 09:37 | |||||
*/ | |||||
public class AESUtils { | |||||
} |
@@ -114,9 +114,8 @@ public class RSAUtils { | |||||
try { | try { | ||||
return signer.generateSignature(); | return signer.generateSignature(); | ||||
} catch (CryptoException e) { | } catch (CryptoException e) { | ||||
e.printStackTrace(); | |||||
throw new com.jd.blockchain.crypto.CryptoException(e.getMessage(), e); | |||||
} | } | ||||
return null; | |||||
} | } | ||||
/** | /** | ||||
@@ -177,14 +176,14 @@ public class RSAUtils { | |||||
encryptor.init(true, params); | encryptor.init(true, params); | ||||
try { | try { | ||||
for (int i= 0; i < blockNum; i++) { | for (int i= 0; i < blockNum; i++) { | ||||
inputLength = ((plainBytes.length - i * PLAINTEXT_BLOCKSIZE) > i * PLAINTEXT_BLOCKSIZE)? | |||||
inputLength = ((plainBytes.length - i * PLAINTEXT_BLOCKSIZE) > PLAINTEXT_BLOCKSIZE)? | |||||
PLAINTEXT_BLOCKSIZE : (plainBytes.length - i * PLAINTEXT_BLOCKSIZE); | PLAINTEXT_BLOCKSIZE : (plainBytes.length - i * PLAINTEXT_BLOCKSIZE); | ||||
buffer = encryptor.processBlock(plainBytes, i * PLAINTEXT_BLOCKSIZE, inputLength); | buffer = encryptor.processBlock(plainBytes, i * PLAINTEXT_BLOCKSIZE, inputLength); | ||||
System.arraycopy(buffer,0, | System.arraycopy(buffer,0, | ||||
result, i * CIPHERTEXT_BLOCKSIZE, CIPHERTEXT_BLOCKSIZE); | result, i * CIPHERTEXT_BLOCKSIZE, CIPHERTEXT_BLOCKSIZE); | ||||
} | } | ||||
} catch (InvalidCipherTextException e) { | } catch (InvalidCipherTextException e) { | ||||
e.printStackTrace(); | |||||
throw new com.jd.blockchain.crypto.CryptoException(e.getMessage(), e); | |||||
} | } | ||||
return result; | return result; | ||||
} | } | ||||
@@ -274,19 +273,8 @@ public class RSAUtils { | |||||
BigInteger modulus = pubKey.getModulus(); | BigInteger modulus = pubKey.getModulus(); | ||||
BigInteger exponent = pubKey.getExponent(); | BigInteger exponent = pubKey.getExponent(); | ||||
byte[] modulusBytes = new byte[MODULUS_LENGTH]; | |||||
byte[] exponentBytes = exponent.toByteArray(); | byte[] exponentBytes = exponent.toByteArray(); | ||||
byte[] encodedModulusBytes = modulus.toByteArray(); | |||||
int encodedModulusLength = encodedModulusBytes.length; | |||||
if (encodedModulusLength > MODULUS_LENGTH) { | |||||
System.arraycopy(encodedModulusBytes,encodedModulusLength - MODULUS_LENGTH, | |||||
modulusBytes,0, MODULUS_LENGTH); | |||||
} else { | |||||
System.arraycopy(encodedModulusBytes,0, | |||||
modulusBytes,MODULUS_LENGTH - encodedModulusLength, MODULUS_LENGTH); | |||||
} | |||||
byte[] modulusBytes = bigInteger2Bytes(modulus,MODULUS_LENGTH); | |||||
return BytesUtils.concat(modulusBytes,exponentBytes); | return BytesUtils.concat(modulusBytes,exponentBytes); | ||||
} | } | ||||
@@ -309,15 +297,14 @@ public class RSAUtils { | |||||
try { | try { | ||||
keyFactory = KeyFactory.getInstance("RSA"); | keyFactory = KeyFactory.getInstance("RSA"); | ||||
} catch (NoSuchAlgorithmException e) { | } catch (NoSuchAlgorithmException e) { | ||||
e.printStackTrace(); | |||||
throw new com.jd.blockchain.crypto.CryptoException(e.getMessage(), e); | |||||
} | } | ||||
RSAPublicKey publicKey = null; | RSAPublicKey publicKey = null; | ||||
try { | try { | ||||
assert keyFactory != null; | |||||
publicKey = (RSAPublicKey) keyFactory.generatePublic(keySpec); | publicKey = (RSAPublicKey) keyFactory.generatePublic(keySpec); | ||||
} catch (InvalidKeySpecException e) { | } catch (InvalidKeySpecException e) { | ||||
e.printStackTrace(); | |||||
throw new com.jd.blockchain.crypto.CryptoException(e.getMessage(), e); | |||||
} | } | ||||
assert publicKey != null; | assert publicKey != null; | ||||
@@ -416,86 +403,15 @@ public class RSAUtils { | |||||
BigInteger dQ = privKey.getDQ(); | BigInteger dQ = privKey.getDQ(); | ||||
BigInteger qInv = privKey.getQInv(); | BigInteger qInv = privKey.getQInv(); | ||||
byte[] modulusBytes = new byte[MODULUS_LENGTH]; | |||||
byte[] modulusBytes = bigInteger2Bytes(modulus,MODULUS_LENGTH); | |||||
byte[] pubExpBytes = pubExp.toByteArray(); | byte[] pubExpBytes = pubExp.toByteArray(); | ||||
byte[] privExpBytes = new byte[PRIVEXP_LENGTH]; | |||||
byte[] pBytes = new byte[P_LENGTH]; | |||||
byte[] qBytes = new byte[Q_LENGTH]; | |||||
byte[] dPBytes = new byte[DP_LENGTH]; | |||||
byte[] dQBytes = new byte[DQ_LENGTH]; | |||||
byte[] qInvBytes = new byte[QINV_LENGTH]; | |||||
byte[] encodedModulusBytes = modulus.toByteArray(); | |||||
byte[] encodedPrivExpBytes = privExp.toByteArray(); | |||||
byte[] encodedPBytes = p.toByteArray(); | |||||
byte[] encodedQBytes = q.toByteArray(); | |||||
byte[] encodedDPBytes = dP.toByteArray(); | |||||
byte[] encodedDQBytes = dQ.toByteArray(); | |||||
byte[] encodedQInvBytes = qInv.toByteArray(); | |||||
int encodedModulusLength = encodedModulusBytes.length; | |||||
int encodedPrivExpBytesLength = encodedPrivExpBytes.length; | |||||
int encodedPBytesLength = encodedPBytes.length; | |||||
int encodedQBytesLength = encodedQBytes.length; | |||||
int encodedDPBytesLength = encodedDPBytes.length; | |||||
int encodedDQBytesLength = encodedDQBytes.length; | |||||
int encodedQInvBytesLength = encodedQInvBytes.length; | |||||
if (encodedModulusLength > MODULUS_LENGTH) { | |||||
System.arraycopy(encodedModulusBytes,encodedModulusLength - MODULUS_LENGTH, | |||||
modulusBytes,0, MODULUS_LENGTH); | |||||
} else { | |||||
System.arraycopy(encodedModulusBytes,0, | |||||
modulusBytes,MODULUS_LENGTH - encodedModulusLength, MODULUS_LENGTH); | |||||
} | |||||
if (encodedPrivExpBytesLength > PRIVEXP_LENGTH) { | |||||
System.arraycopy(encodedPrivExpBytes,encodedPrivExpBytesLength - PRIVEXP_LENGTH, | |||||
privExpBytes,0, PRIVEXP_LENGTH); | |||||
} else { | |||||
System.arraycopy(encodedPrivExpBytes,0, | |||||
privExpBytes,PRIVEXP_LENGTH - encodedPrivExpBytesLength, PRIVEXP_LENGTH); | |||||
} | |||||
if (encodedPBytesLength > P_LENGTH) { | |||||
System.arraycopy(encodedPBytes,encodedPBytesLength - P_LENGTH, | |||||
pBytes,0, P_LENGTH); | |||||
} else { | |||||
System.arraycopy(encodedPBytes,0, | |||||
pBytes,P_LENGTH - encodedPBytesLength, P_LENGTH); | |||||
} | |||||
if (encodedQBytesLength > Q_LENGTH) { | |||||
System.arraycopy(encodedQBytes,encodedQBytesLength - Q_LENGTH, | |||||
qBytes,0, Q_LENGTH); | |||||
} else { | |||||
System.arraycopy(encodedQBytes,0, | |||||
qBytes,Q_LENGTH - encodedQBytesLength, Q_LENGTH); | |||||
} | |||||
if (encodedDPBytesLength > DP_LENGTH) { | |||||
System.arraycopy(encodedDPBytes,encodedDPBytesLength - DP_LENGTH, | |||||
dPBytes,0, DP_LENGTH); | |||||
} else { | |||||
System.arraycopy(encodedDPBytes,0, | |||||
dPBytes,DP_LENGTH - encodedDPBytesLength, DP_LENGTH); | |||||
} | |||||
byte[] privExpBytes = bigInteger2Bytes(privExp,PRIVEXP_LENGTH); | |||||
byte[] pBytes = bigInteger2Bytes(p,P_LENGTH); | |||||
byte[] qBytes = bigInteger2Bytes(q,Q_LENGTH); | |||||
byte[] dPBytes = bigInteger2Bytes(dP,DP_LENGTH); | |||||
byte[] dQBytes = bigInteger2Bytes(dQ,DQ_LENGTH); | |||||
byte[] qInvBytes = bigInteger2Bytes(qInv,QINV_LENGTH); | |||||
if (encodedDQBytesLength > DQ_LENGTH) { | |||||
System.arraycopy(encodedDQBytes,encodedDQBytesLength - DQ_LENGTH, | |||||
dQBytes,0, DQ_LENGTH); | |||||
} else { | |||||
System.arraycopy(encodedDQBytes,0, | |||||
dQBytes,DQ_LENGTH - encodedDQBytesLength, DQ_LENGTH); | |||||
} | |||||
if (encodedQInvBytesLength > QINV_LENGTH) { | |||||
System.arraycopy(encodedQInvBytes,encodedQInvBytesLength - QINV_LENGTH, | |||||
qInvBytes,0, QINV_LENGTH); | |||||
} else { | |||||
System.arraycopy(encodedQInvBytes,0, | |||||
qInvBytes,QINV_LENGTH - encodedQInvBytesLength, QINV_LENGTH); | |||||
} | |||||
return BytesUtils.concat(modulusBytes,pubExpBytes,privExpBytes,pBytes,qBytes,dPBytes,dQBytes,qInvBytes); | return BytesUtils.concat(modulusBytes,pubExpBytes,privExpBytes,pBytes,qBytes,dPBytes,dQBytes,qInvBytes); | ||||
} | } | ||||
@@ -524,15 +440,14 @@ public class RSAUtils { | |||||
try { | try { | ||||
keyFactory = KeyFactory.getInstance("RSA"); | keyFactory = KeyFactory.getInstance("RSA"); | ||||
} catch (NoSuchAlgorithmException e) { | } catch (NoSuchAlgorithmException e) { | ||||
e.printStackTrace(); | |||||
throw new com.jd.blockchain.crypto.CryptoException(e.getMessage(), e); | |||||
} | } | ||||
RSAPrivateCrtKeyImpl privateKey = null; | |||||
RSAPrivateCrtKeyImpl privateKey; | |||||
try { | try { | ||||
assert keyFactory != null; | |||||
privateKey = (RSAPrivateCrtKeyImpl) keyFactory.generatePrivate(keySpec); | privateKey = (RSAPrivateCrtKeyImpl) keyFactory.generatePrivate(keySpec); | ||||
} catch (InvalidKeySpecException e) { | } catch (InvalidKeySpecException e) { | ||||
e.printStackTrace(); | |||||
throw new com.jd.blockchain.crypto.CryptoException(e.getMessage(), e); | |||||
} | } | ||||
assert privateKey != null; | assert privateKey != null; | ||||
@@ -587,4 +502,21 @@ public class RSAUtils { | |||||
return new RSAPrivateCrtKeyParameters(modulus, pubExp, privExp, p, q, dP, dQ, qInv); | return new RSAPrivateCrtKeyParameters(modulus, pubExp, privExp, p, q, dP, dQ, qInv); | ||||
} | } | ||||
private static byte[] bigInteger2Bytes(BigInteger src, int length){ | |||||
byte[] result = new byte[length]; | |||||
byte[] srcBytes = src.toByteArray(); | |||||
int srcLength = srcBytes.length; | |||||
if (srcLength > length) { | |||||
System.arraycopy(srcBytes,srcLength - length, | |||||
result,0, length); | |||||
} else { | |||||
System.arraycopy(srcBytes,0, | |||||
result,length - srcLength, length); | |||||
} | |||||
return result; | |||||
} | |||||
} | } |
@@ -7,6 +7,13 @@ import org.bouncycastle.crypto.params.RSAKeyParameters; | |||||
import org.bouncycastle.crypto.params.RSAPrivateCrtKeyParameters; | import org.bouncycastle.crypto.params.RSAPrivateCrtKeyParameters; | ||||
import org.junit.Test; | import org.junit.Test; | ||||
import javax.crypto.BadPaddingException; | |||||
import javax.crypto.Cipher; | |||||
import javax.crypto.IllegalBlockSizeException; | |||||
import javax.crypto.NoSuchPaddingException; | |||||
import java.security.*; | |||||
import java.security.interfaces.RSAPrivateKey; | |||||
import java.security.interfaces.RSAPublicKey; | |||||
import java.util.Random; | import java.util.Random; | ||||
import static org.junit.Assert.*; | import static org.junit.Assert.*; | ||||
@@ -131,22 +138,24 @@ public class RSAUtilsTest { | |||||
@Test | @Test | ||||
public void decryptTest(){ | public void decryptTest(){ | ||||
byte[] data = new byte[512]; | |||||
Random random = new Random(); | |||||
random.nextBytes(data); | |||||
AsymmetricCipherKeyPair keyPair = RSAUtils.generateKeyPair(); | AsymmetricCipherKeyPair keyPair = RSAUtils.generateKeyPair(); | ||||
AsymmetricKeyParameter pubKey = keyPair.getPublic(); | AsymmetricKeyParameter pubKey = keyPair.getPublic(); | ||||
AsymmetricKeyParameter privKey = keyPair.getPrivate(); | AsymmetricKeyParameter privKey = keyPair.getPrivate(); | ||||
byte[] privKeyBytes = RSAUtils.privKey2Bytes_RawKey((RSAPrivateCrtKeyParameters) privKey); | byte[] privKeyBytes = RSAUtils.privKey2Bytes_RawKey((RSAPrivateCrtKeyParameters) privKey); | ||||
byte[] ciphertext = RSAUtils.encrypt(data,pubKey); | |||||
byte[] data; | |||||
for (int i = 1; i < 1024; i++) { | |||||
data = new byte[i]; | |||||
Random random = new Random(); | |||||
random.nextBytes(data); | |||||
byte[] ciphertext = RSAUtils.encrypt(data, pubKey); | |||||
byte[] plaintextFromPrivKey = RSAUtils.decrypt(ciphertext,privKey); | |||||
byte[] plaintextFromPrivKeyBytes = RSAUtils.decrypt(ciphertext,privKeyBytes); | |||||
byte[] plaintextFromPrivKey = RSAUtils.decrypt(ciphertext, privKey); | |||||
byte[] plaintextFromPrivKeyBytes = RSAUtils.decrypt(ciphertext, privKeyBytes); | |||||
assertArrayEquals(data,plaintextFromPrivKey); | |||||
assertArrayEquals(data,plaintextFromPrivKeyBytes); | |||||
assertArrayEquals(data, plaintextFromPrivKey); | |||||
assertArrayEquals(data, plaintextFromPrivKeyBytes); | |||||
} | |||||
} | } | ||||
@@ -189,4 +198,58 @@ public class RSAUtilsTest { | |||||
(count * 1000.00D) / elapsedTS)); | (count * 1000.00D) / elapsedTS)); | ||||
} | } | ||||
} | } | ||||
@Test | |||||
public void consistencyTest(){ | |||||
byte[] data = new byte[222]; | |||||
Random random = new Random(); | |||||
random.nextBytes(data); | |||||
KeyPairGenerator keyPairGen = null; | |||||
try { | |||||
keyPairGen = KeyPairGenerator.getInstance("RSA"); | |||||
} catch (NoSuchAlgorithmException e) { | |||||
e.printStackTrace(); | |||||
} | |||||
assert keyPairGen != null; | |||||
keyPairGen.initialize(2048, new SecureRandom()); | |||||
KeyPair keyPair = keyPairGen.generateKeyPair(); | |||||
RSAPrivateKey privateKey = (RSAPrivateKey) keyPair.getPrivate(); | |||||
RSAPublicKey publicKey = (RSAPublicKey) keyPair.getPublic(); | |||||
byte[] publicKeyBytes = publicKey.getEncoded(); | |||||
byte[] privateKeyBytes = privateKey.getEncoded(); | |||||
RSAKeyParameters pubKey = RSAUtils.bytes2PubKey_PKCS8(publicKeyBytes); | |||||
RSAPrivateCrtKeyParameters privKey = RSAUtils.bytes2PrivKey_PKCS8(privateKeyBytes); | |||||
Cipher cipher; | |||||
byte[] ciphertext = null; | |||||
try { | |||||
cipher = Cipher.getInstance("RSA/ECB/PKCS1Padding"); | |||||
cipher.init(Cipher.ENCRYPT_MODE, publicKey); | |||||
ciphertext = cipher.doFinal(data); | |||||
} catch (NoSuchAlgorithmException | NoSuchPaddingException | InvalidKeyException | |||||
| IllegalBlockSizeException | BadPaddingException e) { | |||||
e.printStackTrace(); | |||||
} | |||||
assert ciphertext != null; | |||||
byte[] plaintext = RSAUtils.decrypt(ciphertext,privKey); | |||||
assertArrayEquals(data,plaintext); | |||||
ciphertext = RSAUtils.encrypt(data,pubKey); | |||||
try { | |||||
cipher = Cipher.getInstance("RSA/ECB/PKCS1Padding"); | |||||
cipher.init(Cipher.DECRYPT_MODE, privateKey); | |||||
plaintext = cipher.doFinal(ciphertext); | |||||
} catch (NoSuchAlgorithmException | NoSuchPaddingException | InvalidKeyException | |||||
| IllegalBlockSizeException | BadPaddingException e) { | |||||
e.printStackTrace(); | |||||
} | |||||
assertArrayEquals(data,plaintext); | |||||
} | |||||
} | } |