pianod2
multisource multiuser scriptable networked music player
blowfish.h
Go to the documentation of this file.
1 
8 #include <string>
9 
10 #include <stdint.h>
11 
12 class BlowFish {
13 public:
14  using size_type = uint32_t;
15 
16 private:
17  static constexpr int NumberOfPasses = 16; // SBox passes; must be even
18  static constexpr int MaximumKeyBytes = 56; // 448 bits max
19 
20  using PArray = uint32_t [NumberOfPasses + 2];
21  using SBoxes = uint32_t [4][256];
22  enum class Action { Encrypt, Decrypt };
23 
24  static const PArray InitialPArray;
25  static const SBoxes InitialSBoxes;
26 
29  uint32_t fFunction (uint32_t in) const;
30  void encipher (uint32_t *left_32, uint32_t *right_32) const;
31  void decipher (uint32_t *left_32, uint32_t *right_32) const;
32 
33  void encrypt_or_decrypt (Action action,
34  const uint8_t *input,
35  size_type input_length,
36  uint8_t *output,
37  size_type output_size) const;
38 
39 public:
40  BlowFish (const uint8_t *key, size_type key_length);
41  BlowFish (const std::string &key);
42 
46  static constexpr inline size_type getOutputLength (size_type length) {
47  size_type r = length % 8;
48  return (r ? (length + (8 - r)) : length);
49  }
50 
59  inline void encrypt (const uint8_t *input, size_type input_length, uint8_t *output, size_type output_size) const {
60  encrypt_or_decrypt (Action::Encrypt, input, input_length, output, output_size);
61  }
62 
72  inline void decrypt (const uint8_t *input, size_type input_length, uint8_t *output, size_type output_size) const {
73  encrypt_or_decrypt (Action::Decrypt, input, input_length, output, output_size);
74  }
75 
76  std::string encrypt (const std::string &input) const;
77  std::string decrypt (const std::string &input) const;
78 
79  static std::string to_hex (const uint8_t *bytes, size_type length);
81  static inline std::string to_hex (const std::string &input) {
82  return to_hex (reinterpret_cast <const uint8_t *> (input.c_str()), input.length());
83  }
84  static std::string from_hex (const std::string &digits);
85 
86  std::string encryptToHex (const std::string &input) const;
87  std::string decryptFromHex (const std::string &input, bool trim_nulls = true) const;
88 };
Definition: blowfish.h:12
std::string encryptToHex(const std::string &input) const
Encrypt a string and return it has hex digits.
Definition: blowfish.cpp:353
void encipher(uint32_t *left_32, uint32_t *right_32) const
Encipher a 64-bit block.
Definition: blowfish.cpp:196
uint32_t[4][256] SBoxes
Definition: blowfish.h:21
static std::string to_hex(const std::string &input)
Convert a string to its hexadecimal representation.
Definition: blowfish.h:81
BlowFish(const uint8_t *key, size_type key_length)
Initialize BlowFish cipher.
Definition: blowfish.cpp:145
static std::string to_hex(const uint8_t *bytes, size_type length)
Translate some bytes into their hexadecimal representation.
Definition: blowfish.cpp:311
Action
Definition: blowfish.h:22
static const SBoxes InitialSBoxes
Definition: blowfish.h:25
uint32_t size_type
Definition: blowfish.h:14
void encrypt_or_decrypt(Action action, const uint8_t *input, size_type input_length, uint8_t *output, size_type output_size) const
Encipher or decipher a series of bytes.
Definition: blowfish.cpp:237
static std::string from_hex(const std::string &digits)
Translate hexadecimal into a string.
Definition: blowfish.cpp:328
void decipher(uint32_t *left_32, uint32_t *right_32) const
Decipher a 64-bit block.
Definition: blowfish.cpp:212
static constexpr int NumberOfPasses
Definition: blowfish.h:17
uint32_t fFunction(uint32_t in) const
The cipher's "F function", used by ciphering/deciphering.
Definition: blowfish.cpp:187
static const PArray InitialPArray
Definition: blowfish.h:24
PArray parray
Definition: blowfish.h:27
static constexpr size_type getOutputLength(size_type length)
Get length of required output buffer.
Definition: blowfish.h:46
uint32_t[NumberOfPasses+2] PArray
Definition: blowfish.h:20
std::string decryptFromHex(const std::string &input, bool trim_nulls=true) const
Decrypt hex-encoded ciphertext and return it, optionally removing null padding that was added.
Definition: blowfish.cpp:371
static constexpr int MaximumKeyBytes
Definition: blowfish.h:18
void decrypt(const uint8_t *input, size_type input_length, uint8_t *output, size_type output_size) const
Decipher a BlowFish ECD message.
Definition: blowfish.h:72
SBoxes sboxes
Definition: blowfish.h:28
void encrypt(const uint8_t *input, size_type input_length, uint8_t *output, size_type output_size) const
Encipher a BlowFish ECD message.
Definition: blowfish.h:59
unsigned char bytes[4]
Definition: audiooutput.cpp:67