void EncryptorTemplate<P,F>::Encrypt(RandomNumberGenerator &rng, const byte *plainText, unsigned int plainTextLength, byte *cipherText) { assert(plainTextLength <= MaxPlainTextLength()); SecByteBlock paddedBlock(PaddedBlockByteLength()); pad.Pad(rng, plainText, plainTextLength, paddedBlock, PaddedBlockBitLength()); f.ApplyFunction(Integer(paddedBlock, paddedBlock.size)).Encode(cipherText, CipherTextLength()); }
unsigned int ElGamalDecryptor::Decrypt(const byte *cipherText, byte *plainText) { Integer a(cipherText, modulusLen); Integer b(cipherText+modulusLen, modulusLen); Integer m; RawDecrypt(a, b, m); m.Encode(plainText, 1); unsigned int plainTextLength = plainText[0]; if (plainTextLength > MaxPlainTextLength()) return 0; m >>= 8; m.Encode(plainText, plainTextLength); return plainTextLength; }
void ElGamalEncryptor::Encrypt(RandomNumberGenerator &rng, const byte *plainText, unsigned int plainTextLength, byte *cipherText) { assert(plainTextLength <= MaxPlainTextLength()); SecByteBlock block(modulusLen-1); rng.GetBlock(block, modulusLen-2-plainTextLength); memcpy(block+modulusLen-2-plainTextLength, plainText, plainTextLength); block[modulusLen-2] = plainTextLength; Integer m(block, modulusLen-1); Integer a,b; RawEncrypt(Integer(rng, ExponentBitLength()), m, a, b); a.Encode(cipherText, modulusLen); b.Encode(cipherText+modulusLen, modulusLen); }