椭圆曲线密码学(ECC),具有用于非对称加密的弹性城堡

时间:2011-05-18 13:31:52

标签: java encryption bouncycastle elliptic-curve

我想使用ECC来交换会话密钥以进行长期数据传输。应使用ECC-192bit(curvename:prime192v1)对此密钥交换进行加密。这意味着我想实现自己的混合加密模型。

因此我使用了JAVA的充气城堡。我实施了ECDSA,它运行正常。我实现了AES-128位对称加密,这也很好。但我无法使用ECC实现简单的非对称加密。

所以我的问题:这种非对称加密能否与充气城堡一起实施?

这是我尝试使用AsymmetricBlockCipher接口实现ECC加密。但这不起作用。

我是否真的必须实现自己的ECCEngine,就像RSAEngine(RSACoreEngin)的实现一样?

这是我的代码:

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.


}

1 个答案:

答案 0 :(得分:1)

BC有这样的解决方案。查看示例org.bouncycastle.crypto.test.ECIESTest。或者看这里http://www.flexiprovider.de/examples/ExampleECIES.html(另一家提供商)。