public static void Encrypt(BufRef dest, BufLen data, I2PPublicKey key, bool zeropad) { if (data == null || data.Length > ClearTextLength) { throw new InvalidParameterException($"ElGamal data must be {ClearTextLength} bytes or less!"); } var k = new BigInteger(I2PConstants.ElGamalFullExponentBits, Rnd); var a = I2PConstants.ElGamalG.ModPow(k, I2PConstants.ElGamalP); var b1 = key.ToBigInteger().ModPow(k, I2PConstants.ElGamalP); var start = new BufLen(new byte[EGBlockLength]); var writer = new BufRefLen(start, 1); start[0] = 0xFF; writer.Write(I2PHashSHA256.GetHash(data)); writer.Write(data); var egblock = new BufLen(start, 0, writer - start); var egint = egblock.ToBigInteger(); var b = b1.Multiply(egint).Mod(I2PConstants.ElGamalP); var targetlen = zeropad ? EncryptedPaddedLength / 2 : EncryptedShortLength / 2; WriteToDest(dest, a, targetlen); WriteToDest(dest, b, targetlen); }
public void Encrypt(BufRef dest, BufLen data, bool zeropad) { if (data == null || data.Length > 222) { throw new InvalidParameterException("ElGamal data length can max be 222 bytes!"); } var hashbuf = new BufRefLen(new byte[255]); hashbuf.Write8(0xFF); hashbuf.Write(I2PHashSHA256.GetHash(data)); hashbuf.Write(data); hashbuf.Reset(); var b = b1.Multiply(new BigInteger(1, hashbuf.ToByteArray())).Mod(I2PConstants.ElGamalP); if (zeropad) { dest.Write8(0); dest.Write(a.ToByteArray(256)); dest.Write8(0); dest.Write(b.ToByteArray(256)); } else { dest.Write(a.ToByteArray(256)); dest.Write(b.ToByteArray(256)); } }