首页 > 编程语言 >pailler算法加密后如何进行密文计算-java

pailler算法加密后如何进行密文计算-java

时间:2022-11-13 20:47:24浏览次数:48  
标签:BigInteger pailler cc MyFraction fson return 密文 java public

1. 背景

工作中需要用到密文计算,涉及密文求和sum、平均avg以及加权平均wavg 。特此分享,供参考。

2. 代码

2.1 分数类MyFraction

涉及小数运算,但是密文目前只能存整数,所以考虑用分数来处理。用分数对象来存储分子和分母,分子是密文,分母是明文,通分时正好可以利用密文的标量乘。

public class MyFraction {
    // cipher son
    private BigInteger fson = new BigInteger("0");
    // mon
    private BigInteger fmon = new BigInteger("1");
    // 密文计算器
    private CipherCompute cc = null;

    //
    public MyFraction(BigInteger fson, BigInteger fmon, CipherCompute cc) {
        this.fson = fson;
        this.fmon = fmon;
        this.cc = cc;
    }

    public MyFraction(BigInteger fson, CipherCompute cc) {
        this.fson = fson;
        this.cc = cc;
    }

    public MyFraction(BigInteger fson) {
        this.fson = fson;
    }

    public MyFraction() {
    }

    // 通分后加
    public MyFraction add(MyFraction mf) {
        if (null == mf) return new MyFraction();

        // 求分母最小公倍数
        BigInteger lcm = fmon.multiply(mf.getFmon()).divide(fmon.gcd(mf.getFmon()));
        // 分别要乘的系数
        BigInteger son_m = lcm.divide(fmon);
        BigInteger son_n = lcm.divide(mf.getFmon());

        // 计算分子,分母
        BigInteger mid1 = cc.cipher_multiply(fson, son_m);
        BigInteger mid2 = cc.cipher_multiply(mf.getFson(), son_n);
        BigInteger res_son = cc.cipher_add(mid1, mid2);
        BigInteger res_mon = lcm;
        MyFraction res = new MyFraction(res_son, res_mon, cc);
        return res;

    }

    // 对数组中每一个MyFraction累加
    public MyFraction sum(MyFraction[] mfarr) {
        if (null == mfarr) return new MyFraction(BigInteger.ZERO, BigInteger.ONE, cc);

        int len = mfarr.length;
        if (0 == len) return new MyFraction(BigInteger.ZERO, BigInteger.ONE, cc);
        if (1 == len) return mfarr[0];

        MyFraction res = mfarr[0];
        for (int i=1; i < len; i++) {
            res = res.add(mfarr[i]);
        }
        return res;
    }

    // 只能标量乘,注意先后顺序,否则解密有问题、
    // 也就是只能乘明文
    public MyFraction multiply(MyFraction mf) {
        BigInteger res_son = cc.cipher_multiply(fson, mf.getFson());
        BigInteger res_mon = fmon.multiply(mf.getFmon());
        MyFraction res = new MyFraction(res_son, res_mon, cc);
        return res;
    }

    // 取平均
    public MyFraction avg(MyFraction[] mfarr) {
        int len = mfarr.length;
        if (0 == len) return new MyFraction();

        BigInteger blen = new BigInteger(String.valueOf(len));
        MyFraction[] brr = new MyFraction[len];
        for (int i =0; i < len; i++) {
            brr[i] = new MyFraction(mfarr[i].getFson(), mfarr[i].getFmon().multiply(blen), cc);
        }
        return sum(brr);
    }

    // 加权计算,注意这里mfa2数组,权重分数都是明文,不支持密文。
    public MyFraction wavg(MyFraction[] mfa1, MyFraction[] mfa2) {
        if (mfa1.length != mfa2.length) {
            System.out.println("param error, the length of two arrays not equal.");
            return new MyFraction();
        }
        MyFraction[] mfa3 = new MyFraction[mfa1.length];
        for (int i=0; i < mfa1.length; i++) {
            mfa3[i] = mfa1[i].multiply(mfa2[i]);
        }
        return sum(mfa3);
    }

    // String数组转 MyFraction数组
    public MyFraction[] parseStringArray(String[] srr) {
        int len = srr.length;
        if (0 == len) return new MyFraction[0];
        MyFraction[] mfarr = new MyFraction[len];
        for (int i=0; i < len; i++ ) {
            mfarr[i] = new MyFraction(new BigInteger(srr[i]), BigInteger.ONE, cc);
        }
        return mfarr;
    }

    @Override
    public String toString() {
        return "MyFraction{" +
                "fson=" + fson +
                ", fmon=" + fmon +
                ", cc=" + cc +
                '}';
    }

    public BigInteger getFson() {
        return fson;
    }

    public void setFson(BigInteger fson) {
        this.fson = fson;
    }

    public BigInteger getFmon() {
        return fmon;
    }

    public void setFmon(BigInteger fmon) {
        this.fmon = fmon;
    }

    public CipherCompute getCc() {
        return cc;
    }

    public void setCc(CipherCompute cc) {
        this.cc = cc;
    }
}

2.2 密文计算类CipherCompute

public class CipherCompute {

private BigInteger nsquare;

public CipherCompute(BigInteger nsquare) {
    this.nsquare = nsquare;
}

public BigInteger cipher_add(BigInteger em1, BigInteger em2) {
    return em1.multiply(em2).mod(nsquare);
}

public BigInteger cipher_multiply(BigInteger em1, BigInteger m2) {
    return em1.modPow(m2, nsquare);
}

}

3. 欢迎讨论

标签:BigInteger,pailler,cc,MyFraction,fson,return,密文,java,public
From: https://www.cnblogs.com/route/p/16886861.html

相关文章

  • 【博学谷学习记录】超强总结,用心分享 。java基础知识。
    Java基础知识1.面向对象的特征封装:就是把对象的属性和行为结合为一个独立的整体,并尽可能隐藏对象的内部实现细节,就是把不想告诉或者不该告诉别人的东西......
  • Java比较器
    一、Comparable接口类直接实现Comparable接口,并实现compareTo方法packagecn.lxx.test;publicclassUserimplementsComparable<User>{//该类实现Comparable接......
  • Java 使用JavaMail通过Gmail发送电子邮件
    JavaMail提供给开发者处理电子邮件相关的编程接口。它是Sun发布的用来处理email的API可以方便地执行一些常用的邮件传输。可以基于JavaMail开发出类似于MicrosoftOutlook......
  • Java安全之Mojarra JSF反序列化
    Java安全之MojarraJSF反序列化AboutJSFJavaServerFaces,新一代的JavaWeb应用技术标准,吸收了很多JavaServlet以及其他的Web应用框架的特性。JSF为Web应用开发定义了一......
  • 学习Java前的快捷键和软件配置
    目标熟练掌握java每天编写一篇笔记java和python都要学习每天最少要学习4个视频电脑的快捷键ctrl+c复制ctrl+v粘贴ctrl+a全选ctrl+x剪切ctrl+z......
  • java集合
    Java集合分类数据结构一:集合框架的概述1.集合、数组都是对多个数据进行存储的结构简称java容器说明:此时的存储,主要还是内存层面的存储,不涉及持久化存储(数据库、硬......
  • Java数组工具类Arrays
    Arrays所在的包是Java.util.*,Arrays提供的全部是static方法。1.转字符串1.1一维数组--publicstaticStringtoString(int[]a)参数即可以是基础类型数组,也可以是包装......
  • idea将java项目打成jar包并使用
    1.首先编写一个工具类2.进行打包操作)3.Build之后在项目的out包下面就出现了一个jar包在新建一个项目新建lib文件夹将jar包放进去4.最后即可调用......
  • Java自学,要有技巧的学
    学习Java是有一定技巧和方法的,钻牛角尖的去学习它,只能让你感觉到费神费力,最终陷入到无穷无尽的细枝末节之中。然后渐渐的消磨掉你的耐心,直到你放弃。  学习的过程都是......
  • JavaScriptの类型
    前言此篇小结来源与《你不知道的JavaScript》和《JavaScript高级程序设计》的结合??或许是的,龟速总结中...七种内置类型nullundefinedbooleannumberstringobjectsy......