jceblockcipher.java

来自「kmlnjlkj nlkjlkjkljl okopokipoipo oipipi」· Java 代码 · 共 1,312 行 · 第 1/3 页

JAVA
1,312
字号
package org.bouncycastle.jce.provider;import org.bouncycastle.crypto.BlockCipher;import org.bouncycastle.crypto.BufferedBlockCipher;import org.bouncycastle.crypto.CipherParameters;import org.bouncycastle.crypto.DataLengthException;import org.bouncycastle.crypto.InvalidCipherTextException;import org.bouncycastle.crypto.engines.AESFastEngine;import org.bouncycastle.crypto.engines.BlowfishEngine;import org.bouncycastle.crypto.engines.CAST5Engine;import org.bouncycastle.crypto.engines.CAST6Engine;import org.bouncycastle.crypto.engines.DESEngine;import org.bouncycastle.crypto.engines.DESedeEngine;import org.bouncycastle.crypto.engines.GOST28147Engine;import org.bouncycastle.crypto.engines.RC2Engine;import org.bouncycastle.crypto.engines.RC532Engine;import org.bouncycastle.crypto.engines.RC564Engine;import org.bouncycastle.crypto.engines.RC6Engine;import org.bouncycastle.crypto.engines.RijndaelEngine;import org.bouncycastle.crypto.engines.SEEDEngine;import org.bouncycastle.crypto.engines.SerpentEngine;import org.bouncycastle.crypto.engines.SkipjackEngine;import org.bouncycastle.crypto.engines.TEAEngine;import org.bouncycastle.crypto.engines.TwofishEngine;import org.bouncycastle.crypto.engines.XTEAEngine;import org.bouncycastle.crypto.modes.AEADBlockCipher;import org.bouncycastle.crypto.modes.CBCBlockCipher;import org.bouncycastle.crypto.modes.CCMBlockCipher;import org.bouncycastle.crypto.modes.CFBBlockCipher;import org.bouncycastle.crypto.modes.CTSBlockCipher;import org.bouncycastle.crypto.modes.EAXBlockCipher;import org.bouncycastle.crypto.modes.GCMBlockCipher;import org.bouncycastle.crypto.modes.GOFBBlockCipher;import org.bouncycastle.crypto.modes.OFBBlockCipher;import org.bouncycastle.crypto.modes.OpenPGPCFBBlockCipher;import org.bouncycastle.crypto.modes.PGPCFBBlockCipher;import org.bouncycastle.crypto.modes.SICBlockCipher;import org.bouncycastle.crypto.paddings.BlockCipherPadding;import org.bouncycastle.crypto.paddings.ISO10126d2Padding;import org.bouncycastle.crypto.paddings.ISO7816d4Padding;import org.bouncycastle.crypto.paddings.PaddedBufferedBlockCipher;import org.bouncycastle.crypto.paddings.TBCPadding;import org.bouncycastle.crypto.paddings.X923Padding;import org.bouncycastle.crypto.paddings.ZeroBytePadding;import org.bouncycastle.crypto.params.KeyParameter;import org.bouncycastle.crypto.params.ParametersWithIV;import org.bouncycastle.crypto.params.ParametersWithRandom;import org.bouncycastle.crypto.params.ParametersWithSBox;import org.bouncycastle.crypto.params.RC2Parameters;import org.bouncycastle.crypto.params.RC5Parameters;import org.bouncycastle.jce.spec.GOST28147ParameterSpec;import org.bouncycastle.util.Strings;import javax.crypto.BadPaddingException;import javax.crypto.Cipher;import javax.crypto.IllegalBlockSizeException;import javax.crypto.NoSuchPaddingException;import javax.crypto.SecretKey;import javax.crypto.ShortBufferException;import javax.crypto.spec.IvParameterSpec;import javax.crypto.spec.PBEParameterSpec;import javax.crypto.spec.RC2ParameterSpec;import javax.crypto.spec.RC5ParameterSpec;import java.security.AlgorithmParameters;import java.security.InvalidAlgorithmParameterException;import java.security.InvalidKeyException;import java.security.InvalidParameterException;import java.security.Key;import java.security.NoSuchAlgorithmException;import java.security.SecureRandom;import java.security.spec.AlgorithmParameterSpec;public class JCEBlockCipher extends WrapCipherSpi    implements PBE{    //    // specs we can handle.    //    private Class[]                 availableSpecs =                                    {                                        RC2ParameterSpec.class,                                        RC5ParameterSpec.class,                                        IvParameterSpec.class,                                        PBEParameterSpec.class,                                        GOST28147ParameterSpec.class                                    };     private BlockCipher             baseEngine;    private GenericBlockCipher      cipher;    private ParametersWithIV        ivParam;    private int                     ivLength = 0;    private boolean                 padded = true;        private PBEParameterSpec        pbeSpec = null;    private String                  pbeAlgorithm = null;        private String                  modeName = null;    protected JCEBlockCipher(        BlockCipher engine)    {        baseEngine = engine;        cipher = new BufferedGenericBlockCipher(engine);    }            protected JCEBlockCipher(        BlockCipher engine,        int         ivLength)    {        baseEngine = engine;        this.cipher = new BufferedGenericBlockCipher(engine);        this.ivLength = ivLength / 8;    }    protected int engineGetBlockSize()     {        return baseEngine.getBlockSize();    }    protected byte[] engineGetIV()     {        return (ivParam != null) ? ivParam.getIV() : null;    }    protected int engineGetKeySize(        Key     key)     {        return key.getEncoded().length * 8;    }    protected int engineGetOutputSize(        int     inputLen)     {        return cipher.getOutputSize(inputLen);    }    protected AlgorithmParameters engineGetParameters()     {        if (engineParams == null)        {            if (pbeSpec != null)            {                try                {                    engineParams = AlgorithmParameters.getInstance(pbeAlgorithm, "BC");                    engineParams.init(pbeSpec);                }                catch (Exception e)                {                    return null;                }            }            else if (ivParam != null)            {                String  name = cipher.getUnderlyingCipher().getAlgorithmName();                if (name.indexOf('/') >= 0)                {                    name = name.substring(0, name.indexOf('/'));                }                try                {                    engineParams = AlgorithmParameters.getInstance(name, "BC");                    engineParams.init(ivParam.getIV());                }                catch (Exception e)                {                    throw new RuntimeException(e.toString());                }            }        }        return engineParams;    }    protected void engineSetMode(        String  mode)        throws NoSuchAlgorithmException    {        modeName = Strings.toUpperCase(mode);        if (modeName.equals("ECB"))        {            ivLength = 0;            cipher = new BufferedGenericBlockCipher(baseEngine);        }        else if (modeName.equals("CBC"))        {            ivLength = baseEngine.getBlockSize();            cipher = new BufferedGenericBlockCipher(                            new CBCBlockCipher(baseEngine));        }        else if (modeName.startsWith("OFB"))        {            ivLength = baseEngine.getBlockSize();            if (modeName.length() != 3)            {                int wordSize = Integer.parseInt(modeName.substring(3));                cipher = new BufferedGenericBlockCipher(                                new OFBBlockCipher(baseEngine, wordSize));            }            else            {                cipher = new BufferedGenericBlockCipher(                        new OFBBlockCipher(baseEngine, 8 * baseEngine.getBlockSize()));            }        }        else if (modeName.startsWith("CFB"))        {            ivLength = baseEngine.getBlockSize();            if (modeName.length() != 3)            {                int wordSize = Integer.parseInt(modeName.substring(3));                cipher = new BufferedGenericBlockCipher(                                new CFBBlockCipher(baseEngine, wordSize));            }            else            {                cipher = new BufferedGenericBlockCipher(                        new CFBBlockCipher(baseEngine, 8 * baseEngine.getBlockSize()));            }        }        else if (modeName.startsWith("PGP"))        {            boolean inlineIV = modeName.equalsIgnoreCase("PGPCFBwithIV");            ivLength = baseEngine.getBlockSize();            cipher = new BufferedGenericBlockCipher(                new PGPCFBBlockCipher(baseEngine, inlineIV));        }        else if (modeName.equalsIgnoreCase("OpenPGPCFB"))        {            ivLength = 0;            cipher = new BufferedGenericBlockCipher(                new OpenPGPCFBBlockCipher(baseEngine));        }        else if (modeName.startsWith("SIC"))        {            ivLength = baseEngine.getBlockSize();            if (ivLength < 16)            {                throw new IllegalArgumentException("Warning: SIC-Mode can become a twotime-pad if the blocksize of the cipher is too small. Use a cipher with a block size of at least 128 bits (e.g. AES)");            }            cipher = new BufferedGenericBlockCipher(new BufferedBlockCipher(                        new SICBlockCipher(baseEngine)));        }        else if (modeName.startsWith("CTR"))        {            ivLength = baseEngine.getBlockSize();            cipher = new BufferedGenericBlockCipher(new BufferedBlockCipher(                        new SICBlockCipher(baseEngine)));        }        else if (modeName.startsWith("GOFB"))        {            ivLength = baseEngine.getBlockSize();            cipher = new BufferedGenericBlockCipher(new BufferedBlockCipher(                        new GOFBBlockCipher(baseEngine)));        }        else if (modeName.startsWith("CTS"))        {            ivLength = baseEngine.getBlockSize();            cipher = new BufferedGenericBlockCipher(new CTSBlockCipher(new CBCBlockCipher(baseEngine)));        }        else if (modeName.startsWith("CCM"))        {            ivLength = baseEngine.getBlockSize();            cipher = new AEADGenericBlockCipher(new CCMBlockCipher(baseEngine));        }        else if (modeName.startsWith("EAX"))        {            ivLength = baseEngine.getBlockSize();            cipher = new AEADGenericBlockCipher(new EAXBlockCipher(baseEngine));        }        else if (modeName.startsWith("GCM"))        {            ivLength = baseEngine.getBlockSize();            cipher = new AEADGenericBlockCipher(new GCMBlockCipher(baseEngine));        }        else        {            throw new NoSuchAlgorithmException("can't support mode " + mode);        }    }    protected void engineSetPadding(        String  padding)     throws NoSuchPaddingException    {        String  paddingName = Strings.toUpperCase(padding);        if (paddingName.equals("NOPADDING"))        {            padded = false;                        if (cipher.wrapOnNoPadding())            {                cipher = new BufferedGenericBlockCipher(new BufferedBlockCipher(cipher.getUnderlyingCipher()));            }        }        else if (isAEADModeName(modeName))        {            throw new NoSuchPaddingException("Only NoPadding can be used with AEAD modes.");        }        else if (paddingName.equals("PKCS5PADDING") || paddingName.equals("PKCS7PADDING"))        {            cipher = new BufferedGenericBlockCipher(cipher.getUnderlyingCipher());        }        else if (paddingName.equals("ZEROBYTEPADDING"))        {            cipher = new BufferedGenericBlockCipher(cipher.getUnderlyingCipher(), new ZeroBytePadding());        }        else if (paddingName.equals("ISO10126PADDING") || paddingName.equals("ISO10126-2PADDING"))        {            cipher = new BufferedGenericBlockCipher(cipher.getUnderlyingCipher(), new ISO10126d2Padding());        }        else if (paddingName.equals("X9.23PADDING") || paddingName.equals("X923PADDING"))        {            cipher = new BufferedGenericBlockCipher(cipher.getUnderlyingCipher(), new X923Padding());        }        else if (paddingName.equals("ISO7816-4PADDING") || paddingName.equals("ISO9797-1PADDING"))        {            cipher = new BufferedGenericBlockCipher(cipher.getUnderlyingCipher(), new ISO7816d4Padding());        }        else if (paddingName.equals("TBCPADDING"))        {            cipher = new BufferedGenericBlockCipher(cipher.getUnderlyingCipher(), new TBCPadding());        }        else if (paddingName.equals("WITHCTS"))        {            padded = false;            cipher = new BufferedGenericBlockCipher(new CTSBlockCipher(cipher.getUnderlyingCipher()));        }        else        {            throw new NoSuchPaddingException("Padding " + padding + " unknown.");        }    }    protected void engineInit(        int                     opmode,        Key                     key,        AlgorithmParameterSpec  params,        SecureRandom            random)         throws InvalidKeyException, InvalidAlgorithmParameterException    {        CipherParameters        param;                this.pbeSpec = null;        this.pbeAlgorithm = null;        this.engineParams = null;                //        // basic key check        //        if (!(key instanceof SecretKey))        {            throw new InvalidKeyException("Key for algorithm " + key.getAlgorithm() + " not suitable for symmetric enryption.");        }                //        // for RC5-64 we must have some default parameters        //        if (params == null && baseEngine.getAlgorithmName().startsWith("RC5-64"))        {            throw new InvalidAlgorithmParameterException("RC5 requires an RC5ParametersSpec to be passed in.");        }        //        // a note on iv's - if ivLength is zero the IV gets ignored (we don't use it).        //        if (key instanceof JCEPBEKey)        {            JCEPBEKey   k = (JCEPBEKey)key;                        if (k.getOID() != null)            {                pbeAlgorithm = k.getOID().getId();            }            else            {                pbeAlgorithm = k.getAlgorithm();            }                        if (k.getParam() != null)            {                param = k.getParam();                pbeSpec = new PBEParameterSpec(k.getSalt(), k.getIterationCount());            }            else if (params instanceof PBEParameterSpec)            {                pbeSpec = (PBEParameterSpec)params;                param = PBE.Util.makePBEParameters(k, params, cipher.getUnderlyingCipher().getAlgorithmName());            }            else            {                throw new InvalidAlgorithmParameterException("PBE requires PBE parameters to be set.");            }            if (param instanceof ParametersWithIV)            {                ivParam = (ParametersWithIV)param;            }        }        else if (params == null)        {            param = new KeyParameter(key.getEncoded());        }        else if (params instanceof IvParameterSpec)        {            if (ivLength != 0)            {                IvParameterSpec p = (IvParameterSpec)params;                if (p.getIV().length != ivLength && !isAEADModeName(modeName))                {                    throw new InvalidAlgorithmParameterException("IV must be " + ivLength + " bytes long.");                }                param = new ParametersWithIV(new KeyParameter(key.getEncoded()), p.getIV());                ivParam = (ParametersWithIV)param;            }            else            {                if (modeName != null && modeName.equals("ECB"))                {                    throw new InvalidAlgorithmParameterException("ECB mode does not use an IV");                }                                param = new KeyParameter(key.getEncoded());            }        }

⌨️ 快捷键说明

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