import { Group, PublicKey, PrivateKey, Field } from 'o1js';
export { ElGamalECC, ElGamalFF, Cipher };
/**
 * ElGamal over an elliptic curve.
 */
declare class ElGamalECC {
    private static G;
    static encrypt(msg: Group, y: PublicKey): {
        c: import("o1js/dist/node/lib/group.js").Group;
        d: import("o1js/dist/node/lib/group.js").Group;
    };
    static decrypt({ c, d }: {
        c: Group;
        d: Group;
    }, priv: PrivateKey): import("o1js/dist/node/lib/group.js").Group;
}
declare const Cipher_base: (new (value: {
    c1: import("o1js/dist/node/lib/field.js").Field;
    c2: import("o1js/dist/node/lib/field.js").Field;
}) => {
    c1: import("o1js/dist/node/lib/field.js").Field;
    c2: import("o1js/dist/node/lib/field.js").Field;
}) & {
    _isStruct: true;
} & import("o1js/dist/node/snarky.js").ProvablePure<{
    c1: import("o1js/dist/node/lib/field.js").Field;
    c2: import("o1js/dist/node/lib/field.js").Field;
}> & {
    toInput: (x: {
        c1: import("o1js/dist/node/lib/field.js").Field;
        c2: import("o1js/dist/node/lib/field.js").Field;
    }) => {
        fields?: import("o1js/dist/node/lib/field.js").Field[] | undefined;
        packed?: [import("o1js/dist/node/lib/field.js").Field, number][] | undefined;
    };
    toJSON: (x: {
        c1: import("o1js/dist/node/lib/field.js").Field;
        c2: import("o1js/dist/node/lib/field.js").Field;
    }) => {
        c1: string;
        c2: string;
    };
    fromJSON: (x: {
        c1: string;
        c2: string;
    }) => {
        c1: import("o1js/dist/node/lib/field.js").Field;
        c2: import("o1js/dist/node/lib/field.js").Field;
    };
};
declare class Cipher extends Cipher_base {
    mul(c2: Cipher): Cipher;
}
/**
 * ElGamal over a finite field.
 */
declare class ElGamalFF {
    static G: import("o1js/dist/node/lib/field.js").Field;
    /**
     * Generate a key pair used for encrypting and decrypting.
     */
    static generateKeys(): {
        pk: Field;
        sk: Field;
    };
    /**
     * Encrypts a Field element, with a public key `h`.
     * @param m Message
     * @param h Public key
     */
    static encrypt(m: Field, h: Field): Cipher;
    /**
     * Decrypts a cipher text, with a private key `x`.
     * @param m Message
     * @param h Public key
     */
    static decrypt({ c1, c2 }: Cipher, x: Field): import("o1js/dist/node/lib/field.js").Field;
}
