⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 jcedhkeyagreement.java

📁 kmlnjlkj nlkjlkjkljl okopokipoipo oipipipo i
💻 JAVA
字号:
package org.bouncycastle.jce.provider;import org.bouncycastle.crypto.params.DESParameters;import org.bouncycastle.util.Strings;import javax.crypto.KeyAgreementSpi;import javax.crypto.SecretKey;import javax.crypto.ShortBufferException;import javax.crypto.interfaces.DHPrivateKey;import javax.crypto.interfaces.DHPublicKey;import javax.crypto.spec.DHParameterSpec;import javax.crypto.spec.SecretKeySpec;import java.math.BigInteger;import java.security.InvalidAlgorithmParameterException;import java.security.InvalidKeyException;import java.security.Key;import java.security.SecureRandom;import java.security.spec.AlgorithmParameterSpec;import java.util.Hashtable;/** * Diffie-Hellman key agreement. There's actually a better way of doing this * if you are using long term public keys, see the light-weight version for * details. */public class JCEDHKeyAgreement    extends KeyAgreementSpi{    private BigInteger      x;    private BigInteger      p;    private BigInteger      g;    private BigInteger      result;    private SecureRandom    random;    private static final Hashtable algorithms = new Hashtable();    static    {        Integer i64 = new Integer(64);        Integer i192 = new Integer(192);        Integer i448 = new Integer(448);        algorithms.put("DES", i64);        algorithms.put("DESEDE", i192);        algorithms.put("BLOWFISH", i448);    }    private byte[] bigIntToBytes(        BigInteger    r)    {        byte[]    tmp = r.toByteArray();                if (tmp[0] == 0)        {            byte[]    ntmp = new byte[tmp.length - 1];                        System.arraycopy(tmp, 1, ntmp, 0, ntmp.length);            return ntmp;        }                return tmp;    }        protected Key engineDoPhase(        Key     key,        boolean lastPhase)         throws InvalidKeyException, IllegalStateException    {        if (x == null)        {            throw new IllegalStateException("Diffie-Hellman not initialised.");        }        if (!(key instanceof DHPublicKey))        {            throw new InvalidKeyException("DHKeyAgreement doPhase requires DHPublicKey");        }        DHPublicKey pubKey = (DHPublicKey)key;        if (!pubKey.getParams().getG().equals(g) || !pubKey.getParams().getP().equals(p))        {            throw new InvalidKeyException("DHPublicKey not for this KeyAgreement!");        }        if (lastPhase)        {            result = ((DHPublicKey)key).getY().modPow(x, p);            return null;        }        else        {            result = ((DHPublicKey)key).getY().modPow(x, p);        }        return new JCEDHPublicKey(result, pubKey.getParams());    }    protected byte[] engineGenerateSecret()         throws IllegalStateException    {        if (x == null)        {            throw new IllegalStateException("Diffie-Hellman not initialised.");        }        return bigIntToBytes(result);    }    protected int engineGenerateSecret(        byte[]  sharedSecret,        int     offset)         throws IllegalStateException, ShortBufferException    {        if (x == null)        {            throw new IllegalStateException("Diffie-Hellman not initialised.");        }        byte[]  secret = bigIntToBytes(result);        if (sharedSecret.length - offset < secret.length)        {            throw new ShortBufferException("DHKeyAgreement - buffer too short");        }        System.arraycopy(secret, 0, sharedSecret, offset, secret.length);        return secret.length;    }    protected SecretKey engineGenerateSecret(        String algorithm)     {        if (x == null)        {            throw new IllegalStateException("Diffie-Hellman not initialised.");        }        String algKey = Strings.toUpperCase(algorithm);        byte[] res = bigIntToBytes(result);        if (algorithms.containsKey(algKey))        {            Integer length = (Integer)algorithms.get(algKey);            byte[] key = new byte[length.intValue() / 8];            System.arraycopy(res, 0, key, 0, key.length);            if (algKey.startsWith("DES"))            {                DESParameters.setOddParity(key);            }                        return new SecretKeySpec(key, algorithm);        }        return new SecretKeySpec(res, algorithm);    }    protected void engineInit(        Key                     key,        AlgorithmParameterSpec  params,        SecureRandom            random)         throws InvalidKeyException, InvalidAlgorithmParameterException    {        if (!(key instanceof DHPrivateKey))        {            throw new InvalidKeyException("DHKeyAgreement requires DHPrivateKey for initialisation");        }        DHPrivateKey    privKey = (DHPrivateKey)key;        this.random = random;        if (params != null)        {            if (!(params instanceof DHParameterSpec))            {                throw new InvalidAlgorithmParameterException("DHKeyAgreement only accepts DHParameterSpec");            }            DHParameterSpec p = (DHParameterSpec)params;            this.p = p.getP();            this.g = p.getG();        }        else        {            this.p = privKey.getParams().getP();            this.g = privKey.getParams().getG();        }        this.x = this.result = privKey.getX();    }    protected void engineInit(        Key             key,        SecureRandom    random)         throws InvalidKeyException    {        if (!(key instanceof DHPrivateKey))        {            throw new InvalidKeyException("DHKeyAgreement requires DHPrivateKey");        }        DHPrivateKey    privKey = (DHPrivateKey)key;        this.random = random;        this.p = privKey.getParams().getP();        this.g = privKey.getParams().getG();        this.x = this.result = privKey.getX();    }}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -