Crypto++

- Main Page
- Namespaces
- Classes
- Files

- File List
- File Members

blumshub.h

    00001 #ifndef CRYPTOPP_BLUMSHUB_H
    00002 #define CRYPTOPP_BLUMSHUB_H
    00003
    00004 #include "modarith.h"
    00005
    00006 NAMESPACE_BEGIN(CryptoPP)
    00007
    00008 class BlumGoldwasserPublicKey;
    00009 class BlumGoldwasserPrivateKey;
    00010
    00011 //! BlumBlumShub without factorization of the modulus
    00012 class PublicBlumBlumShub : public RandomNumberGenerator,
    00013                            public StreamTransformation
    00014 {
    00015 public:
    00016     PublicBlumBlumShub(const Integer &n, const Integer &seed);
    00017
    00018     unsigned int GenerateBit();
    00019     byte GenerateByte();
    00020     void GenerateBlock(byte *output, size_t size);
    00021     void ProcessData(byte *outString, const byte *inString, size_t length);
    00022
    00023     bool IsSelfInverting() const {return true;}
    00024     bool IsForwardTransformation() const {return true;}
    00025
    00026 protected:
    00027     ModularArithmetic modn;
    00028     word maxBits, bitsLeft;
    00029     Integer current;
    00030
    00031     friend class BlumGoldwasserPublicKey;
    00032     friend class BlumGoldwasserPrivateKey;
    00033 };
    00034
    00035 //! BlumBlumShub with factorization of the modulus
    00036 class BlumBlumShub : public PublicBlumBlumShub
    00037 {
    00038 public:
    00039     // Make sure p and q are both primes congruent to 3 mod 4 and at least 512 bits long,
    00040     // seed is the secret key and should be about as big as p*q
    00041     BlumBlumShub(const Integer &p, const Integer &q, const Integer &seed);
    00042
    00043     bool IsRandomAccess() const {return true;}
    00044     void Seek(lword index);
    00045
    00046 protected:
    00047     const Integer p, q;
    00048     const Integer x0;
    00049 };
    00050
    00051 NAMESPACE_END
    00052
    00053 #endif