Search in sources :

Example 1 with RSAKeyPairGenerator

use of org.spongycastle.crypto.generators.RSAKeyPairGenerator in project universa by UniversaBlockchain.

the class RSAOAEPPrivateKey method generate.

/**
 * Generate a new key pair, with all options specified.
 *
 * @param bitStrength bit strength of the key, e.g. 2048
 * @param e           RSA public exponent
 * @param certainty   RSA key generation certainty
 * @param mgf1HashType The type of the hash(digest) function used for OAEP MGF1 hash generation.
 */
public void generate(int bitStrength, byte[] e, int certainty, HashType oaepHashType, HashType mgf1HashType) {
    final RSAKeyPairGenerator keyGen = new RSAKeyPairGenerator();
    keyGen.init(new RSAKeyGenerationParameters(BigIntegers.fromUnsignedByteArray(e), new SecureRandom(), bitStrength, certainty));
    final AsymmetricCipherKeyPair keyPair = keyGen.generateKeyPair();
    final RSAPrivateCrtKeyParameters privateKey = (RSAPrivateCrtKeyParameters) keyPair.getPrivate();
    if (mgf1HashType == null) {
        mgf1HashType = DEFAULT_MGF1_HASH;
    }
    // Don't worry we are passing thread-unsafe hash and mgf1Hash Digest instances:
    // init() will clone them anyway.
    init(e, BigIntegers.asUnsignedByteArray(privateKey.getP()), BigIntegers.asUnsignedByteArray(privateKey.getQ()), oaepHashType, mgf1HashType, new SecureRandom());
}
Also used : RSAKeyPairGenerator(org.spongycastle.crypto.generators.RSAKeyPairGenerator) SecureRandom(java.security.SecureRandom) RSAKeyGenerationParameters(org.spongycastle.crypto.params.RSAKeyGenerationParameters) RSAPrivateCrtKeyParameters(org.spongycastle.crypto.params.RSAPrivateCrtKeyParameters)

Example 2 with RSAKeyPairGenerator

use of org.spongycastle.crypto.generators.RSAKeyPairGenerator in project SightRemote by TebbeUbben.

the class Cryptograph method generateRSAKey.

public static KeyPair generateRSAKey() {
    RSAKeyPairGenerator generator = new RSAKeyPairGenerator();
    generator.init(new RSAKeyGenerationParameters(BigInteger.valueOf(65537), new SecureRandom(), 2048, 8));
    AsymmetricCipherKeyPair ackp = generator.generateKeyPair();
    KeyPair keyPair = new KeyPair();
    keyPair.privateKey = (RSAPrivateCrtKeyParameters) ackp.getPrivate();
    keyPair.publicKey = (RSAKeyParameters) ackp.getPublic();
    return keyPair;
}
Also used : AsymmetricCipherKeyPair(org.spongycastle.crypto.AsymmetricCipherKeyPair) RSAKeyPairGenerator(org.spongycastle.crypto.generators.RSAKeyPairGenerator) SecureRandom(java.security.SecureRandom) RSAKeyGenerationParameters(org.spongycastle.crypto.params.RSAKeyGenerationParameters) AsymmetricCipherKeyPair(org.spongycastle.crypto.AsymmetricCipherKeyPair)

Example 3 with RSAKeyPairGenerator

use of org.spongycastle.crypto.generators.RSAKeyPairGenerator in project universa by UniversaBlockchain.

the class OAEPEncodingTest method randomEncodeDecode.

/**
 * Make sure the SpongyCastle OAEPEncoding encoding and decoding operations
 * do not lose or corrupt data.
 * We test it:
 * For each hash function we may use with OEAP (like, SHA1 or SHA512),
 * and for each RSA key size (among 1024, 2048, 4096)
 * we create multiple (NUMBER_OF_RANDOM_ENCRYPTION_KEY_PAIRS) RSA key pairs;
 * for each of the key pair we test encryption-decryption cycle
 * with NUMBER_OF_RANDOM_ENCRYPTION_DECRYPTION_CYCLES_PER_KEY_PAIR random messages
 * (each of the maximum possible size for this cipher configuration)
 * and make sure the result matches the original random message.
 *
 * @throws Exception
 */
@Test
public void randomEncodeDecode() throws Exception {
    RSAKeyPairGenerator keyGen = new RSAKeyPairGenerator();
    for (Digest digest : DIGESTS) {
        for (int i = 0; i < NUMBER_OF_RANDOM_ENCRYPTION_KEY_PAIRS; i++) {
            // Create key pair
            SecureRandom rng = new SecureRandom();
            int publicExponent = PUBLIC_EXPONENTS[rng.nextInt(PUBLIC_EXPONENTS.length)];
            int keySize = KEY_SIZES[rng.nextInt(KEY_SIZES.length)];
            keyGen.init(new RSAKeyGenerationParameters(BigInteger.valueOf(publicExponent), new SecureRandom(), keySize, RSA_KEY_CERTAINTY));
            AsymmetricCipherKeyPair keyPair = keyGen.generateKeyPair();
            RSAKeyParameters publicKey = (RSAKeyParameters) keyPair.getPublic(), privateKey = (RSAKeyParameters) keyPair.getPrivate();
            assertEquals(keySize, publicKey.getModulus().bitLength());
            // though actually it is sufficient to keysize <= publicKey.getModulus().bitLength()
            int maxMessageSize = keySize / 8 - 2 - 2 * digest.getDigestSize(), minMessageSize = 1, messageSize = (maxMessageSize >= minMessageSize) ? rng.nextInt(maxMessageSize - minMessageSize + 1) + minMessageSize : 0;
            // messageSize may become negative with too small RSA key size and too large digest.
            if (messageSize > 0) {
                // For each key pair we do multiple encryption-decryption cycles
                for (int j = 0; j < NUMBER_OF_RANDOM_ENCRYPTION_DECRYPTION_CYCLES_PER_KEY_PAIR; j++) {
                    // Create random message
                    byte[] message = new byte[messageSize];
                    rng.nextBytes(message);
                    AsymmetricBlockCipher encoder = new OAEPEncoding(RSAEngineFactory.make(), digest), decoder = new OAEPEncoding(RSAEngineFactory.make(), digest);
                    encoder.init(true, publicKey);
                    decoder.init(false, privateKey);
                    byte[] encoded = encoder.processBlock(message, 0, message.length);
                    byte[] decoded = decoder.processBlock(encoded, 0, encoded.length);
                    // Finally, test the encoding/decoding cycle
                    String assertMessage = String.format("Digest %s,\n message %s,\n public key %s / %s,\n private key %s / %s", digest, Hex.toHexString(message), publicKey.getExponent(), publicKey.getModulus(), privateKey.getExponent(), privateKey.getModulus());
                    assertArrayEquals(assertMessage, message, decoded);
                }
            }
        }
    }
}
Also used : Digest(org.spongycastle.crypto.Digest) SHA256Digest(org.spongycastle.crypto.digests.SHA256Digest) SHA1Digest(org.spongycastle.crypto.digests.SHA1Digest) SHA512Digest(org.spongycastle.crypto.digests.SHA512Digest) SHA224Digest(org.spongycastle.crypto.digests.SHA224Digest) RSAKeyPairGenerator(org.spongycastle.crypto.generators.RSAKeyPairGenerator) SecureRandom(java.security.SecureRandom) RSAKeyGenerationParameters(org.spongycastle.crypto.params.RSAKeyGenerationParameters) OAEPEncoding(org.spongycastle.crypto.encodings.OAEPEncoding) RSAKeyParameters(org.spongycastle.crypto.params.RSAKeyParameters) AsymmetricCipherKeyPair(org.spongycastle.crypto.AsymmetricCipherKeyPair) AsymmetricBlockCipher(org.spongycastle.crypto.AsymmetricBlockCipher) Test(org.junit.Test)

Aggregations

SecureRandom (java.security.SecureRandom)3 RSAKeyPairGenerator (org.spongycastle.crypto.generators.RSAKeyPairGenerator)3 RSAKeyGenerationParameters (org.spongycastle.crypto.params.RSAKeyGenerationParameters)3 AsymmetricCipherKeyPair (org.spongycastle.crypto.AsymmetricCipherKeyPair)2 Test (org.junit.Test)1 AsymmetricBlockCipher (org.spongycastle.crypto.AsymmetricBlockCipher)1 Digest (org.spongycastle.crypto.Digest)1 SHA1Digest (org.spongycastle.crypto.digests.SHA1Digest)1 SHA224Digest (org.spongycastle.crypto.digests.SHA224Digest)1 SHA256Digest (org.spongycastle.crypto.digests.SHA256Digest)1 SHA512Digest (org.spongycastle.crypto.digests.SHA512Digest)1 OAEPEncoding (org.spongycastle.crypto.encodings.OAEPEncoding)1 RSAKeyParameters (org.spongycastle.crypto.params.RSAKeyParameters)1 RSAPrivateCrtKeyParameters (org.spongycastle.crypto.params.RSAPrivateCrtKeyParameters)1