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 + -
显示快捷键?