4

I want to use ECC in order to exchange a Session Key for a long-term data transmission. This key exchange should be encrypted using ECC-192bit (curvename: prime192v1). That means that i want to implement an own hybrid encryption model.

Therefore i used bouncy castle for JAVA. I implemented ECDSA and it works fine. I implemented the AES-128 bit symmetric encryption and this also works fine. But i cant implement a simple Asymmetric encryption using ECC.

So my question: Can this asymmetric encryption implemented with bouncy castle at all?

This is my try to implement an ECC encryption using the AsymmetricBlockCipher interface. But this doesn't work.

Do I really have to implement my own ECCEngine like there is an implementation for the RSAEngine (RSACoreEngin)?

Here is my code:

import org.bouncycastle.jce.interfaces.ECPublicKey;
import org.bouncycastle.jce.interfaces.ECPrivateKey;
import org.bouncycastle.crypto.AsymmetricBlockCipher;
import org.bouncycastle.crypto.InvalidCipherTextException;
import org.bouncycastle.crypto.engines.AESEngine;
import org.bouncycastle.crypto.modes.CBCBlockCipher;
import org.bouncycastle.crypto.params.ECDomainParameters;
import org.bouncycastle.jce.ECNamedCurveTable;
import org.bouncycastle.jce.spec.ECParameterSpec;
import org.bouncycastle.crypto.params.ECPrivateKeyParameters;
import org.bouncycastle.crypto.params.ECPublicKeyParameters;
import javax.crypto.Cipher;



public class ASymCrypto {

    //cipher init
    private static AsymmetricBlockCipher bc = null;
//    private static PaddedBufferedBlockCipher cipher = null;


    //keys and info parameter
    private static ECPublicKeyParameters publicParam = null;
    private static ECPrivateKeyParameters privParam = null;



    /**
     * Constructor
     */
    ASymCrypto(ECPublicKey pubKey, ECPrivateKey privKey) {


//  //default paddedBufferedBlockCipher with PKCS5/7 padding
//  cipher = new PaddedBufferedBlockCipher(bc);
        System.out.println( "remotePrivateKey:  " + privKey + " -(format): "+ privKey.getFormat() + " algo: " + privKey.getAlgorithm());
        System.out.println( "remotePrivateKey:  " + pubKey + " -(format): "+ pubKey.getFormat() + " algo: " + pubKey.getAlgorithm());

    //get the key and the EC parameters
    ECParameterSpec ecSpec = ECNamedCurveTable.getParameterSpec("prime192v1");
    ECDomainParameters domainParam = new ECDomainParameters(
        ecSpec.getCurve() , 
        ecSpec.getG(), 
        ecSpec.getN());

    //ECPublicKeyParameters(ECPoint Q, ECDomainParameters params) 
    publicParam = new ECPublicKeyParameters( pubKey.getQ() , domainParam );
    if(publicParam == null)
        System.out.println("ERROR: Initializing ASymCrpto failed at ECPublicKeyParam.");

    //ECPrivateKeyParameters(java.math.BigInteger d, ECDomainParameters params) 
    privParam = new ECPrivateKeyParameters( privKey.getD(), domainParam );
    if(privParam == null)
        System.out.println("ERROR: Initializing ASymCrpto failed at ECPrivateKeyParam.");

    bc = new AsymmetricBlockCipher(new AESEngine());
    }

    /**
     *  encryptEC192 function
     *  @param input: byte array with the message to encrypt
     *  @param output: byte array with the encrypted message using the public key of the partner
     *  @return bool true if successfully encrypted
     *  @throws InvalidCipherTextException 
     */
    public boolean encryptEC192(byte[] input, byte[] output) throws InvalidCipherTextException{

    if(publicParam == null)
        System.out.println("ERROR2: Initializing ASymCrpto failed at ECPublicKeyParam.");
    bc.init( true, publicParam);

    System.out.println("InputBS: " + bc.getInputBlockSize() + " OutputBS: " + bc.getOutputBlockSize() + "\n");
    output = bc.processBlock(input, 0, input.length );

    return true;
    }


    /**
     *  encryptEC192 function
     *  @param input: byte array with the message to encrypt
     *  @param output: byte array with the encrypted message using the public key of the partner
     *  @return bool true if successfully encrypted
     *  @throws InvalidCipherTextException 
     */    
    public boolean decryptEC192(byte[] input, byte[] output) throws InvalidCipherTextException{

    if(privParam == null)
        System.out.println("ERROR2: Initializing ASymCrpto failed at ECPrivateKeyParam.");
    bc.init( false, privParam);
    System.out.println("InputBS: " + bc.getInputBlockSize() + " OutputBS: " + bc.getOutputBlockSize() + "\n");
    output = bc.processBlock(input, 0, input.length );

    return true;
    }


//  INFORMATION PURPOSE ONLY:
//  public byte[] processBlock(byte[] in,
//                             int inOff,
//                             int len)
//                      throws InvalidCipherTextException
//  process the block of len bytes stored in in from offset inOff.
//  Parameters:
//  in - the input data
//  inOff - offset into the in array where the data starts
//  len - the length of the block to be processed.
//  Returns:
//  the resulting byte array of the encryption/decryption process.
//  Throws:
//  InvalidCipherTextException - data decrypts improperly.
//  DataLengthException - the input data is too large for the cipher.


}
Bill the Lizard
  • 398,270
  • 210
  • 566
  • 880
Manuel
  • 41
  • 1
  • 1
  • 2
  • Are you sure you know Java well enough? You are trying to treat an interace like a class and they are not the same thing. You don't actually have any code at all to do the encryption. Are you sure you understand elliptic curve crypto well enough to do this? – President James K. Polk May 18 '11 at 22:51
  • Thanky for response and sry for the late response. Yes, i know the difference between an interface and a class. This code example above should only explain my question and is full of errors and not complete. Otherwise I have to implement my own EC Engine what will be really a challenge for me but not impossible I think. If i understand elliptic curve crypto well enough? Thats my question. I would of course prefer an implemented API solution. And I would like to know if there is one already existing? – Manuel May 24 '11 at 08:28

0 Answers0