Crypto++
|
00001 #ifndef CRYPTOPP_RC2_H 00002 #define CRYPTOPP_RC2_H 00003 00004 /** \file 00005 */ 00006 00007 #include "seckey.h" 00008 #include "secblock.h" 00009 #include "algparam.h" 00010 00011 NAMESPACE_BEGIN(CryptoPP) 00012 00013 //! _ 00014 struct RC2_Info : public FixedBlockSize<8>, public VariableKeyLength<16, 1, 128> 00015 { 00016 CRYPTOPP_CONSTANT(DEFAULT_EFFECTIVE_KEYLENGTH = 1024) 00017 CRYPTOPP_CONSTANT(MAX_EFFECTIVE_KEYLENGTH = 1024) 00018 static const char *StaticAlgorithmName() {return "RC2";} 00019 }; 00020 00021 /// <a href="http://www.weidai.com/scan-mirror/cs.html#RC2">RC2</a> 00022 class RC2 : public RC2_Info, public BlockCipherDocumentation 00023 { 00024 class CRYPTOPP_NO_VTABLE Base : public BlockCipherImpl<RC2_Info> 00025 { 00026 public: 00027 void UncheckedSetKey(const byte *userKey, unsigned int length, const NameValuePairs ¶ms); 00028 unsigned int OptimalDataAlignment() const {return GetAlignmentOf<word16>();} 00029 00030 protected: 00031 FixedSizeSecBlock<word16, 64> K; // expanded key table 00032 }; 00033 00034 class CRYPTOPP_NO_VTABLE Enc : public Base 00035 { 00036 public: 00037 void ProcessAndXorBlock(const byte *inBlock, const byte *xorBlock, byte *outBlock) const; 00038 }; 00039 00040 class CRYPTOPP_NO_VTABLE Dec : public Base 00041 { 00042 public: 00043 void ProcessAndXorBlock(const byte *inBlock, const byte *xorBlock, byte *outBlock) const; 00044 }; 00045 00046 public: 00047 class Encryption : public BlockCipherFinal<ENCRYPTION, Enc> 00048 { 00049 public: 00050 Encryption() {} 00051 Encryption(const byte *key, size_t keyLen=DEFAULT_KEYLENGTH) 00052 {SetKey(key, keyLen);} 00053 Encryption(const byte *key, size_t keyLen, int effectiveKeyLen) 00054 {SetKey(key, keyLen, MakeParameters("EffectiveKeyLength", effectiveKeyLen));} 00055 }; 00056 00057 class Decryption : public BlockCipherFinal<DECRYPTION, Dec> 00058 { 00059 public: 00060 Decryption() {} 00061 Decryption(const byte *key, size_t keyLen=DEFAULT_KEYLENGTH) 00062 {SetKey(key, keyLen);} 00063 Decryption(const byte *key, size_t keyLen, int effectiveKeyLen) 00064 {SetKey(key, keyLen, MakeParameters("EffectiveKeyLength", effectiveKeyLen));} 00065 }; 00066 }; 00067 00068 typedef RC2::Encryption RC2Encryption; 00069 typedef RC2::Decryption RC2Decryption; 00070 00071 NAMESPACE_END 00072 00073 #endif