mirror of
https://github.com/PurpleI2P/i2pd.git
synced 2025-01-22 08:14:15 +00:00
ElGamalEncryptor added
This commit is contained in:
parent
345be142ae
commit
b14cdc8052
82
ElGamal.h
82
ElGamal.h
@ -12,6 +12,70 @@ namespace i2p
|
|||||||
{
|
{
|
||||||
namespace crypto
|
namespace crypto
|
||||||
{
|
{
|
||||||
|
|
||||||
|
class ElGamalEncryptor
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
|
||||||
|
ElGamalEncryptor (const uint8_t * key, bool zeroPadding = false):
|
||||||
|
y (key, 256), k (rnd, CryptoPP::Integer::One(), elgp-1),
|
||||||
|
a (a_exp_b_mod_c (elgg, k, elgp)), b1 (a_exp_b_mod_c (y, k, elgp)),
|
||||||
|
m_ZeroPadding (zeroPadding)
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
void Encrypt (const uint8_t * data, int len, uint8_t * encrypted)
|
||||||
|
{
|
||||||
|
// calculate b = b1*m mod p
|
||||||
|
uint8_t m[255];
|
||||||
|
m[0] = 0xFF;
|
||||||
|
memcpy (m+33, data, len);
|
||||||
|
CryptoPP::SHA256().CalculateDigest(m+1, m+33, 222);
|
||||||
|
CryptoPP::Integer b (a_times_b_mod_c (b1, CryptoPP::Integer (m, 255), elgp));
|
||||||
|
|
||||||
|
// copy a and b
|
||||||
|
if (m_ZeroPadding)
|
||||||
|
{
|
||||||
|
encrypted[0] = 0;
|
||||||
|
a.Encode (encrypted + 1, 256);
|
||||||
|
encrypted[257] = 0;
|
||||||
|
b.Encode (encrypted + 258, 256);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
a.Encode (encrypted, 256);
|
||||||
|
b.Encode (encrypted + 256, 256);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private:
|
||||||
|
|
||||||
|
CryptoPP::AutoSeededRandomPool rnd;
|
||||||
|
CryptoPP::Integer y, k, a, b1;
|
||||||
|
bool m_ZeroPadding;
|
||||||
|
};
|
||||||
|
|
||||||
|
inline bool ElGamalDecrypt (const uint8_t * key, const uint8_t * encrypted,
|
||||||
|
uint8_t * data, bool zeroPadding = false)
|
||||||
|
{
|
||||||
|
CryptoPP::Integer x(key, 256), a(zeroPadding? encrypted +1 : encrypted, 256),
|
||||||
|
b(zeroPadding? encrypted + 258 :encrypted + 256, 256);
|
||||||
|
uint8_t m[255], hash[32];
|
||||||
|
a_times_b_mod_c (b, a_exp_b_mod_c (a, elgp - x - 1, elgp), elgp).Encode (m, 255);
|
||||||
|
CryptoPP::SHA256().CalculateDigest(hash, m+33, 222);
|
||||||
|
for (int i = 0; i < 32; i++)
|
||||||
|
if (hash[i] != m[i+1])
|
||||||
|
{
|
||||||
|
LogPrint ("ElGamal decrypt hash doesn't match");
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
memcpy (data, m + 33, 222);
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
// deprecated
|
||||||
|
|
||||||
inline void ElGamalEncrypt (const uint8_t * key, const uint8_t * data, int len,
|
inline void ElGamalEncrypt (const uint8_t * key, const uint8_t * data, int len,
|
||||||
uint8_t * encrypted, bool zeroPadding = false) // 514 with padding and 512 without
|
uint8_t * encrypted, bool zeroPadding = false) // 514 with padding and 512 without
|
||||||
{
|
{
|
||||||
@ -31,24 +95,6 @@ namespace crypto
|
|||||||
a_times_b_mod_c (a_exp_b_mod_c (y, k, elgp),
|
a_times_b_mod_c (a_exp_b_mod_c (y, k, elgp),
|
||||||
CryptoPP::Integer (m, 255), elgp).Encode (zeroPadding ? encrypted + 258 : encrypted + 256, 256);
|
CryptoPP::Integer (m, 255), elgp).Encode (zeroPadding ? encrypted + 258 : encrypted + 256, 256);
|
||||||
}
|
}
|
||||||
|
|
||||||
inline bool ElGamalDecrypt (const uint8_t * key, const uint8_t * encrypted,
|
|
||||||
uint8_t * data, bool zeroPadding = false)
|
|
||||||
{
|
|
||||||
CryptoPP::Integer x(key, 256), a(zeroPadding? encrypted +1 : encrypted, 256),
|
|
||||||
b(zeroPadding? encrypted + 258 :encrypted + 256, 256);
|
|
||||||
uint8_t m[255], hash[32];
|
|
||||||
a_times_b_mod_c (b, a_exp_b_mod_c (a, elgp - x - 1, elgp), elgp).Encode (m, 255);
|
|
||||||
CryptoPP::SHA256().CalculateDigest(hash, m+33, 222);
|
|
||||||
for (int i = 0; i < 32; i++)
|
|
||||||
if (hash[i] != m[i+1])
|
|
||||||
{
|
|
||||||
LogPrint ("ElGamal decrypt hash doesn't match");
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
memcpy (data, m + 33, 222);
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user