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

📄 cbc.cpp

📁 含有多种公开密钥算法、多种块加密、多种数据流加密、多种HASH函数、多种CheckSum校验、多种MAC校验等几十种加密算法的程序
💻 CPP
字号:
/************************************************** CBC Mode Source File                           ** (C) 1999-2002 The Botan Project                **************************************************/#include <botan/cbc.h>#include <botan/lookup.h>namespace Botan {/************************************************** CBC Encryption Constructor                     **************************************************/CBC_Encryption::CBC_Encryption(const std::string& cipher_name,                               const std::string& padding_name,                               const SymmetricKey& key,                               const BlockCipherModeIV& iv) :   BlockCipherMode(cipher_name, "CBC_Encryption", key, iv),   padder(get_bc_pad(padding_name))   {   if(!valid_iv_length(iv.length()))      throw Invalid_IV_Length(name(), iv.length());   if(!padder->valid_blocksize(BLOCK_SIZE))      throw Invalid_Block_Size(name(), padder->name());   }/************************************************** Encrypt in CBC mode                            **************************************************/void CBC_Encryption::write(const byte input[], u32bit length)   {   while(length)      {      u32bit xored = std::min(BLOCK_SIZE - position, length);      xor_buf(state + position, input, xored);      input += xored;      length -= xored;      position += xored;      if(position == BLOCK_SIZE)         {         cipher->encrypt(state);         send(state, BLOCK_SIZE);         position = 0;         }      }   }/************************************************** Finish encrypting in CBC mode                  **************************************************/void CBC_Encryption::end_msg()   {   SecureVector<byte> padding(BLOCK_SIZE);   padder->pad(padding, padding.size(), position);   write(padding, padder->pad_bytes(padding.size(), position));   if(position != 0)      throw Exception(name() + ": Did not pad to full blocksize");   }/************************************************** CBC Decryption Constructor                     **************************************************/CBC_Decryption::CBC_Decryption(const std::string& cipher_name,                               const std::string& padding_name,                               const SymmetricKey& key,                               const BlockCipherModeIV& iv) :   BlockCipherMode(cipher_name, "CBC_Decryption", key, iv),   padder(get_bc_pad(padding_name))   {   if(!valid_iv_length(iv.length()))      throw Invalid_IV_Length(name(), iv.length());   if(!padder->valid_blocksize(BLOCK_SIZE))      throw Invalid_Block_Size(name(), padder->name());   temp.create(BLOCK_SIZE);   }/************************************************** Decrypt in CBC mode                            **************************************************/void CBC_Decryption::write(const byte input[], u32bit length)   {   while(length)      {      if(position == BLOCK_SIZE)         {         cipher->decrypt(buffer, temp);         xor_buf(temp, state, BLOCK_SIZE);         send(temp, BLOCK_SIZE);         state = buffer;         position = 0;         }      u32bit added = std::min(BLOCK_SIZE - position, length);      buffer.copy(position, input, added);      input += added;      length -= added;      position += added;      }   }/************************************************** Finish decrypting in CBC mode                  **************************************************/void CBC_Decryption::end_msg()   {   if(position != BLOCK_SIZE)      throw Decoding_Error(name());   cipher->decrypt(buffer, temp);   xor_buf(temp, state, BLOCK_SIZE);   send(temp, padder->unpad(temp, BLOCK_SIZE));   state = buffer;   position = 0;   }}

⌨️ 快捷键说明

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