(1)Alice选取盲因子 k 然后计算 m

$$$t=mk^{e} \pmod n$$$

(2)Bob对 t 签名

$$$t^{d}=(mk^{e})^{d} \pmod n$$$

(3)Alice通过计算揭开 $$$t^{d}$$$

$$$s=t^{d}/k \pmod n$$$

(4)结果为:

$$$s=m^{d} \pmod n$$$

证明:

$$$t^{d}≡(mk^{e})^{d}≡m^{d}k \pmod n$$$


$$$t^{d}\times{}k^{−1}=m^{d}\times{}k\times{}k^{−1}≡m^{d} \pmod n$$$


Java Sample:

public class BlindSign {

    public static void main(String[] args) {
        BigInteger e = new BigInteger("65537");
        BigInteger d = new BigInteger("60530511629930072241945671200867889027539295362393257858025617298274206834041");
        BigInteger n = new BigInteger("99418278299100976004220175767913358809660152882550697543248103911741071816073");
        BigInteger factor = new BigInteger("10879736607308378083");
        BigInteger m = new BigInteger("1234567890");

        BigInteger blindMsg = blindHideMsg(m, factor, e, n);
        BigInteger blindSig = blindSignature(blindMsg, d, n);
        BigInteger sig = blindRetriveSig(blindSig, factor, n);
        BigInteger realSig = m.modPow(d, n);
        System.out.println("Message            = " + m);
        System.out.println("Blind Hide Message = " + blindMsg);
        System.out.println("Blind Sign         = " + blindSig);
        System.out.println("Blind Retrive Sign = " + sig);
        System.out.println("Sign               = " + realSig);
    }

    public static BigInteger blindHideMsg(BigInteger msg, BigInteger factor, BigInteger e, BigInteger n) {
        BigInteger hideMsg = msg.multiply(factor.modPow(e, n)).mod(n);
        return hideMsg;
    }

    public static BigInteger blindSignature(BigInteger blindMsg, BigInteger d, BigInteger n) {
        BigInteger blindSig = blindMsg.modPow(d, n);
        return blindSig;
    }

    public static BigInteger blindRetriveSig(BigInteger blindSig, BigInteger factor, BigInteger n) {
        BigInteger signature = blindSig.multiply(factor.modInverse(n)).mod(n);
        return signature;
    }
}

Outputs:

Message            = 1234567890
Blind Hide Message = 15770710624832124090310228670897217355377164232670135463798104068560510146688
Blind Sign         = 6139941993099585616261360618307345010100687512790350833813455369950720416299
Blind Retrive Sign = 73713217373639814035571155058840977138482078089410370766097424658230579955022
Sign               = 73713217373639814035571155058840977138482078089410370766097424658230579955022