此压缩包内有cast、blowfish、simple、des、cryptlib、rsa、mqueue、xtrcrypt、gf256、base32,base64、modexppc、network等一些的

源代码在线查看: default.cpp

软件大小: 8220 K
上传用户: sky8997991
关键词: base blowfish cryptlib modexppc
下载地址: 免注册下载 普通下载 VIP

相关代码

				// default.cpp - written and placed in the public domain by Wei Dai
				
				#include "pch.h"
				#include "default.h"
				#include "queue.h"
				#include 
				#include 
				
				NAMESPACE_BEGIN(CryptoPP)
				
				static const unsigned int MASH_ITERATIONS = 200;
				static const unsigned int SALTLENGTH = 8;
				static const unsigned int BLOCKSIZE = Default_BlockCipher::Encryption::BLOCKSIZE;
				static const unsigned int KEYLENGTH = Default_BlockCipher::Encryption::DEFAULT_KEYLENGTH;
				
				// The purpose of this function Mash() is to take an arbitrary length input
				// string and *deterministicly* produce an arbitrary length output string such
				// that (1) it looks random, (2) no information about the input is
				// deducible from it, and (3) it contains as much entropy as it can hold, or
				// the amount of entropy in the input string, whichever is smaller.
				
				static void Mash(const byte *in, size_t inLen, byte *out, size_t outLen, int iterations)
				{
					if (BytePrecision(outLen) > 2)
						throw InvalidArgument("Mash: output legnth too large");
				
					size_t bufSize = RoundUpToMultipleOf(outLen, (size_t)DefaultHashModule::DIGESTSIZE);
					byte b[2];
					SecByteBlock buf(bufSize);
					SecByteBlock outBuf(bufSize);
					DefaultHashModule hash;
				
					unsigned int i;
					for(i=0; i					{
						b[0] = (byte) (i >> 8);
						b[1] = (byte) i;
						hash.Update(b, 2);
						hash.Update(in, inLen);
						hash.Final(outBuf+i);
					}
				
					while (iterations-- > 1)
					{
						memcpy(buf, outBuf, bufSize);
						for (i=0; i						{
							b[0] = (byte) (i >> 8);
							b[1] = (byte) i;
							hash.Update(b, 2);
							hash.Update(buf, bufSize);
							hash.Final(outBuf+i);
						}
					}
				
					memcpy(out, outBuf, outLen);
				}
				
				static void GenerateKeyIV(const byte *passphrase, size_t passphraseLength, const byte *salt, size_t saltLength, byte *key, byte *IV)
				{
					SecByteBlock temp(passphraseLength+saltLength);
					memcpy(temp, passphrase, passphraseLength);
					memcpy(temp+passphraseLength, salt, saltLength);
					SecByteBlock keyIV(KEYLENGTH+BLOCKSIZE);
					Mash(temp, passphraseLength + saltLength, keyIV, KEYLENGTH+BLOCKSIZE, MASH_ITERATIONS);
					memcpy(key, keyIV, KEYLENGTH);
					memcpy(IV, keyIV+KEYLENGTH, BLOCKSIZE);
				}
				
				// ********************************************************
				
				DefaultEncryptor::DefaultEncryptor(const char *passphrase, BufferedTransformation *attachment)
					: ProxyFilter(NULL, 0, 0, attachment), m_passphrase((const byte *)passphrase, strlen(passphrase))
				{
				}
				
				DefaultEncryptor::DefaultEncryptor(const byte *passphrase, size_t passphraseLength, BufferedTransformation *attachment)
					: ProxyFilter(NULL, 0, 0, attachment), m_passphrase(passphrase, passphraseLength)
				{
				}
				
				
				void DefaultEncryptor::FirstPut(const byte *)
				{
					// VC60 workaround: __LINE__ expansion bug
					CRYPTOPP_COMPILE_ASSERT_INSTANCE(SALTLENGTH 					CRYPTOPP_COMPILE_ASSERT_INSTANCE(BLOCKSIZE 				
					SecByteBlock salt(DefaultHashModule::DIGESTSIZE), keyCheck(DefaultHashModule::DIGESTSIZE);
					DefaultHashModule hash;
				
					// use hash(passphrase | time | clock) as salt
					hash.Update(m_passphrase, m_passphrase.size());
					time_t t=time(0);
					hash.Update((byte *)&t, sizeof(t));
					clock_t c=clock();
					hash.Update((byte *)&c, sizeof(c));
					hash.Final(salt);
				
					// use hash(passphrase | salt) as key check
					hash.Update(m_passphrase, m_passphrase.size());
					hash.Update(salt, SALTLENGTH);
					hash.Final(keyCheck);
				
					AttachedTransformation()->Put(salt, SALTLENGTH);
				
					// mash passphrase and salt together into key and IV
					SecByteBlock key(KEYLENGTH);
					SecByteBlock IV(BLOCKSIZE);
					GenerateKeyIV(m_passphrase, m_passphrase.size(), salt, SALTLENGTH, key, IV);
				
					m_cipher.SetKeyWithIV(key, key.size(), IV);
					SetFilter(new StreamTransformationFilter(m_cipher));
				
					m_filter->Put(keyCheck, BLOCKSIZE);
				}
				
				void DefaultEncryptor::LastPut(const byte *inString, size_t length)
				{
					m_filter->MessageEnd();
				}
				
				// ********************************************************
				
				DefaultDecryptor::DefaultDecryptor(const char *p, BufferedTransformation *attachment, bool throwException)
					: ProxyFilter(NULL, SALTLENGTH+BLOCKSIZE, 0, attachment)
					, m_state(WAITING_FOR_KEYCHECK)
					, m_passphrase((const byte *)p, strlen(p))
					, m_throwException(throwException)
				{
				}
				
				DefaultDecryptor::DefaultDecryptor(const byte *passphrase, size_t passphraseLength, BufferedTransformation *attachment, bool throwException)
					: ProxyFilter(NULL, SALTLENGTH+BLOCKSIZE, 0, attachment)
					, m_state(WAITING_FOR_KEYCHECK)
					, m_passphrase(passphrase, passphraseLength)
					, m_throwException(throwException)
				{
				}
				
				void DefaultDecryptor::FirstPut(const byte *inString)
				{
					CheckKey(inString, inString+SALTLENGTH);
				}
				
				void DefaultDecryptor::LastPut(const byte *inString, size_t length)
				{
					if (m_filter.get() == NULL)
					{
						m_state = KEY_BAD;
						if (m_throwException)
							throw KeyBadErr();
					}
					else
					{
						m_filter->MessageEnd();
						m_state = WAITING_FOR_KEYCHECK;
					}
				}
				
				void DefaultDecryptor::CheckKey(const byte *salt, const byte *keyCheck)
				{
					SecByteBlock check(STDMAX((unsigned int)2*BLOCKSIZE, (unsigned int)DefaultHashModule::DIGESTSIZE));
				
					DefaultHashModule hash;
					hash.Update(m_passphrase, m_passphrase.size());
					hash.Update(salt, SALTLENGTH);
					hash.Final(check);
				
					SecByteBlock key(KEYLENGTH);
					SecByteBlock IV(BLOCKSIZE);
					GenerateKeyIV(m_passphrase, m_passphrase.size(), salt, SALTLENGTH, key, IV);
				
					m_cipher.SetKeyWithIV(key, key.size(), IV);
					std::auto_ptr decryptor(new StreamTransformationFilter(m_cipher));
				
					decryptor->Put(keyCheck, BLOCKSIZE);
					decryptor->ForceNextPut();
					decryptor->Get(check+BLOCKSIZE, BLOCKSIZE);
				
					SetFilter(decryptor.release());
				
					if (memcmp(check, check+BLOCKSIZE, BLOCKSIZE))
					{
						m_state = KEY_BAD;
						if (m_throwException)
							throw KeyBadErr();
					}
					else
						m_state = KEY_GOOD;
				}
				
				// ********************************************************
				
				static DefaultMAC * NewDefaultEncryptorMAC(const byte *passphrase, size_t passphraseLength)
				{
					size_t macKeyLength = DefaultMAC::StaticGetValidKeyLength(16);
					SecByteBlock macKey(macKeyLength);
					// since the MAC is encrypted there is no reason to mash the passphrase for many iterations
					Mash(passphrase, passphraseLength, macKey, macKeyLength, 1);
					return new DefaultMAC(macKey, macKeyLength);
				}
				
				DefaultEncryptorWithMAC::DefaultEncryptorWithMAC(const char *passphrase, BufferedTransformation *attachment)
					: ProxyFilter(NULL, 0, 0, attachment)
					, m_mac(NewDefaultEncryptorMAC((const byte *)passphrase, strlen(passphrase)))
				{
					SetFilter(new HashFilter(*m_mac, new DefaultEncryptor(passphrase), true));
				}
				
				DefaultEncryptorWithMAC::DefaultEncryptorWithMAC(const byte *passphrase, size_t passphraseLength, BufferedTransformation *attachment)
					: ProxyFilter(NULL, 0, 0, attachment)
					, m_mac(NewDefaultEncryptorMAC(passphrase, passphraseLength))
				{
					SetFilter(new HashFilter(*m_mac, new DefaultEncryptor(passphrase, passphraseLength), true));
				}
				
				void DefaultEncryptorWithMAC::LastPut(const byte *inString, size_t length)
				{
					m_filter->MessageEnd();
				}
				
				// ********************************************************
				
				DefaultDecryptorWithMAC::DefaultDecryptorWithMAC(const char *passphrase, BufferedTransformation *attachment, bool throwException)
					: ProxyFilter(NULL, 0, 0, attachment)
					, m_mac(NewDefaultEncryptorMAC((const byte *)passphrase, strlen(passphrase)))
					, m_throwException(throwException)
				{
					SetFilter(new DefaultDecryptor(passphrase, m_hashVerifier=new HashVerifier(*m_mac, NULL, HashVerifier::PUT_MESSAGE), throwException));
				}
				
				DefaultDecryptorWithMAC::DefaultDecryptorWithMAC(const byte *passphrase, size_t passphraseLength, BufferedTransformation *attachment, bool throwException)
					: ProxyFilter(NULL, 0, 0, attachment)
					, m_mac(NewDefaultEncryptorMAC(passphrase, passphraseLength))
					, m_throwException(throwException)
				{
					SetFilter(new DefaultDecryptor(passphrase, passphraseLength, m_hashVerifier=new HashVerifier(*m_mac, NULL, HashVerifier::PUT_MESSAGE), throwException));
				}
				
				DefaultDecryptor::State DefaultDecryptorWithMAC::CurrentState() const
				{
					return static_cast(m_filter.get())->CurrentState();
				}
				
				bool DefaultDecryptorWithMAC::CheckLastMAC() const
				{
					return m_hashVerifier->GetLastResult();
				}
				
				void DefaultDecryptorWithMAC::LastPut(const byte *inString, size_t length)
				{
					m_filter->MessageEnd();
					if (m_throwException && !CheckLastMAC())
						throw MACBadErr();
				}
				
				NAMESPACE_END
							

相关资源