/********EXTERNAL OBJECT PUBLIC METHODS - END ********/ /// <summary> /// Gets the BufferedBlockCipher loaded with Padding, Mode and Engine to Encrypt with a Symmetric Block Algorithm /// </summary> /// <param name="algorithm">string SymmetricBlockAlgorithm enum, symmetric block algorithm name</param> /// <param name="mode">string SymmetricBlockModes enum, symmetric block mode name</param> /// <param name="padding">string SymmetricBlockPadding enum, symmetric block padding name</param> /// <returns>BufferedBlockCipher loaded with Padding, Mode and Engine to Encrypt with a Symmetric Block Algorithm</returns> private BufferedBlockCipher getCipher(SymmetricBlockAlgorithm algorithm, SymmetricBlockMode mode, SymmetricBlockPadding padding) { IBlockCipher engine = getCipherEngine(algorithm); IBlockCipherPadding paddingCipher = getPadding(padding); IBlockCipher bc; if (mode != SymmetricBlockMode.ECB) { bc = getCipherMode(engine, mode); } else { bc = engine; } // si el padding es WITHCTS el paddingCipher es null if (usesCTS(mode, padding)) { return(new CtsBlockCipher(bc)); // no usa el paddingCipher que es el null } if (padding == SymmetricBlockPadding.NOPADDING) { return(new BufferedBlockCipher(bc)); } else { return(new PaddedBufferedBlockCipher(bc, paddingCipher)); } }
/// <summary> /// Mapping between SymmetricBlockPadding enum representation and string name /// </summary> /// <param name="symmetricBlockPadding">SymmetricBlockPadding enum, padding name</param> /// <param name="error">Error type for error management</param> /// <returns>string name value of SymmetricBlockPadding</returns> public static string valueOf(SymmetricBlockPadding symmetricBlockPadding, Error error) { switch (symmetricBlockPadding) { case SymmetricBlockPadding.NOPADDING: return("NOPADDING"); case SymmetricBlockPadding.PKCS7PADDING: return("PKCS7PADDING"); case SymmetricBlockPadding.ISO10126D2PADDING: return("ISO10126D2PADDING"); case SymmetricBlockPadding.X923PADDING: return("X923PADDING"); case SymmetricBlockPadding.ISO7816D4PADDING: return("ISO7816D4PADDING"); case SymmetricBlockPadding.ZEROBYTEPADDING: return("ZEROBYTEPADDING"); case SymmetricBlockPadding.WITHCTS: return("WITHCTS"); default: error.setError("SB009", "Unrecognized SymmetricBlockPadding"); return("Unrecognized block padding"); } }
/// <summary> /// Builds an IBlockCipherPadding /// </summary> /// <param name="padding">SymmetricBlockPadding enum, padding name</param> /// <returns>IBlockCipherPadding with loaded padding type, if padding is WITHCTS returns null</returns> private IBlockCipherPadding getPadding(SymmetricBlockPadding padding) { IBlockCipherPadding paddingCipher = null; switch (padding) { case SymmetricBlockPadding.NOPADDING: paddingCipher = null; break; case SymmetricBlockPadding.ISO7816D4PADDING: paddingCipher = new ISO7816d4Padding(); break; case SymmetricBlockPadding.ISO10126D2PADDING: paddingCipher = new ISO10126d2Padding(); break; case SymmetricBlockPadding.PKCS7PADDING: paddingCipher = new Pkcs7Padding(); break; case SymmetricBlockPadding.WITHCTS: break; case SymmetricBlockPadding.X923PADDING: paddingCipher = new X923Padding(); break; case SymmetricBlockPadding.ZEROBYTEPADDING: paddingCipher = new ZeroBytePadding(); break; default: this.error.setError("SB018", "Cipher " + padding + " not recognised."); break; } return(paddingCipher); }
/// <summary> /// True if it uses CTS /// </summary> /// <param name="mode">string SymmetricBlockModes enum, symmetric block mode name</param> /// <param name="padding">string SymmetricBlockPadding enum, symmetric block padding name</param> /// <returns>boolean true if it uses CTS</returns> private bool usesCTS(SymmetricBlockMode mode, SymmetricBlockPadding padding) { return(mode == SymmetricBlockMode.CTS || padding == SymmetricBlockPadding.WITHCTS); }
public string DoDecrypt(string symmetricBlockAlgorithm, string symmetricBlockMode, string symmetricBlockPadding, string key, string IV, string encryptedInput) { this.error.cleanError(); SymmetricBlockAlgorithm algorithm = SymmetricBlockAlgorithmUtils.getSymmetricBlockAlgorithm(symmetricBlockAlgorithm, this.error); SymmetricBlockMode mode = SymmetricBlockModeUtils.getSymmetricBlockMode(symmetricBlockMode, this.error); SymmetricBlockPadding padding = SymmetricBlockPaddingUtils.getSymmetricBlockPadding(symmetricBlockPadding, this.error); if (this.error.existsError()) { return(""); } BufferedBlockCipher bbc = getCipher(algorithm, mode, padding); if (this.error.existsError() && !(string.Compare(this.error.Code, "SB016", true) == 0)) { return(""); } byte[] bytesKey = SecurityUtils.GetHexa(key, "SB023", this.error); byte[] bytesIV = SecurityUtils.GetHexa(IV, "SB023", this.error); if (this.HasError()) { return(""); } KeyParameter keyParam = new KeyParameter(bytesKey); if (SymmetricBlockMode.ECB != mode && SymmetricBlockMode.OPENPGPCFB != mode) { ParametersWithIV keyParamWithIV = new ParametersWithIV(keyParam, bytesIV); try { bbc.Init(false, keyParamWithIV); }catch (Exception e) { this.error.setError("SB027", e.Message); return(""); } } else { try { bbc.Init(false, keyParam); }catch (Exception e) { this.error.setError("SB028", e.Message); return(""); } } byte[] out2 = Base64.Decode(encryptedInput); byte[] comparisonBytes = new byte[bbc.GetOutputSize(out2.Length)]; int length = bbc.ProcessBytes(out2, 0, out2.Length, comparisonBytes, 0); try { bbc.DoFinal(comparisonBytes, length); } catch (Exception) { this.error.setError("SB015", "Block decryption exception"); return(""); } this.error.cleanError(); EncodingUtil eu = new EncodingUtil(); this.error = eu.GetError(); return(eu.getString(comparisonBytes)); }
public string DoEncrypt(string symmetricBlockAlgorithm, string symmetricBlockMode, string symmetricBlockPadding, string key, string IV, string plainText) { this.error.cleanError(); SymmetricBlockAlgorithm algorithm = SymmetricBlockAlgorithmUtils.getSymmetricBlockAlgorithm(symmetricBlockAlgorithm, this.error); SymmetricBlockMode mode = SymmetricBlockModeUtils.getSymmetricBlockMode(symmetricBlockMode, this.error); SymmetricBlockPadding padding = SymmetricBlockPaddingUtils.getSymmetricBlockPadding(symmetricBlockPadding, this.error); if (this.error.existsError()) { return(""); } BufferedBlockCipher bbc = getCipher(algorithm, mode, padding); if (this.error.existsError() && !(string.Compare(this.error.Code, "SB016", true) == 0)) { return(""); } byte[] byteIV = SecurityUtils.GetHexa(IV, "SB022", this.error); byte[] byteKey = SecurityUtils.GetHexa(key, "SB022", this.error); if (this.HasError()) { return(""); } KeyParameter keyParam = new KeyParameter(byteKey); if (SymmetricBlockMode.ECB != mode && SymmetricBlockMode.OPENPGPCFB != mode) { ParametersWithIV keyParamWithIV = new ParametersWithIV(keyParam, byteIV); try{ bbc.Init(true, keyParamWithIV); }catch (Exception e) { this.error.setError("SB025", e.Message); return(""); } } else { try { bbc.Init(true, keyParam); }catch (Exception e) { this.error.setError("SB026", e.Message); return(""); } } EncodingUtil eu = new EncodingUtil(); byte[] inputBytes = eu.getBytes(plainText); if (eu.GetError().existsError()) { this.error = eu.GetError(); return(""); } byte[] outputBytes = new byte[bbc.GetOutputSize(inputBytes.Length)]; int length = bbc.ProcessBytes(inputBytes, 0, inputBytes.Length, outputBytes, 0); try { bbc.DoFinal(outputBytes, length); } catch (Exception) { this.error.setError("SB013", "Block encryption exception"); return(""); } string result = Base64.ToBase64String(outputBytes); if (result == null || result.Length == 0) { this.error.setError("SB014", "Error encoding base64"); return(""); } this.error.cleanError(); return(result); }