国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

【安全多方計(jì)算】百萬富翁問題

這篇具有很好參考價(jià)值的文章主要介紹了【安全多方計(jì)算】百萬富翁問題。希望對(duì)大家有所幫助。如果存在錯(cuò)誤或未考慮完全的地方,請(qǐng)大家不吝賜教,您也可以點(diǎn)擊"舉報(bào)違法"按鈕提交疑問。

【安全多方計(jì)算】百萬富翁問題

【問題描述】

? 百萬富翁問題是姚期智先生在1982年提出的第一個(gè)安全雙方計(jì)算問題,兩個(gè)百萬富翁街頭邂逅,他們都想炫一下富,比比誰更有錢,但是出于隱私,都不想讓對(duì)方知道自己到底擁有多少財(cái)富,所以要在不借助第三方的情況下,知道他們之間誰更有錢。

【問題分析】

①這里假設(shè)Alice和Bob就是這兩個(gè)百萬富翁,Alice擁有財(cái)富i百萬,Bob擁有財(cái)富j百萬,假設(shè)他們兩的財(cái)富都沒有超過N百萬,即1 ≤ i , j ≤ N,如下圖所示:

【安全多方計(jì)算】百萬富翁問題

②Alice隨機(jī)選擇一個(gè)大隨機(jī)數(shù)x,用Bob的公鑰加密后得到x的密文c,如下圖所示:

【安全多方計(jì)算】百萬富翁問題

③Alice將c-i發(fā)送給Bob(減去i是為了破壞密文c),如下圖所示:

【安全多方計(jì)算】百萬富翁問題

④Bob首先計(jì)算N個(gè)數(shù):yu=DSKB(c-i+u), 其中u=1,2…N(這里加上u是為了能在yu的數(shù)列里面還原出被破壞的密文),然后隨機(jī)選擇一個(gè)大素?cái)?shù)p,再計(jì)算N個(gè)數(shù):zu=yu mod p, 其中u=1,2…N,如下圖所示:

【安全多方計(jì)算】百萬富翁問題

⑤接著Bob對(duì)于所有的0≤a≠b≤N,是否都滿足|za-zb|≥2(如果小于2的話,就可能導(dǎo)致第⑥步里面的數(shù)串,zj+1+1,zj+2+1,…,zN+1和zj+1相等),若不滿足,則重新選擇大素?cái)?shù)p并重新驗(yàn)證。如下圖所示:

【安全多方計(jì)算】百萬富翁問題

⑥如果滿足,Bob將以下的N個(gè)數(shù)串和p:(z1,z2,…,zj,zj+1+1,zj+2+1,…,zN+1,p)一起發(fā)給Alice(這里從zj+1開始每一項(xiàng)+1是為了在第⑦步Alice驗(yàn)證的時(shí)候能得出正確的結(jié)論,而且也保護(hù)了Bob的隱私,不能泄露j的值),如下圖所示:

【安全多方計(jì)算】百萬富翁問題

⑦假設(shè)Alice收到這N+1個(gè)數(shù)的第i個(gè)數(shù)滿足Zi=x(mod p),則結(jié)論是i≤j,否則i>j(對(duì)應(yīng)第④步中的zu=yu mod p)。如下圖所示:【安全多方計(jì)算】百萬富翁問題

【代碼實(shí)現(xiàn)】

這部分的算法思想?yún)⒖剂薱sdn上Bertramoon的博客,只不過這里換成java實(shí)現(xiàn)。

【前導(dǎo)模塊】

1.判斷素?cái)?shù)
public static boolean is_prime(int x) throws Exception {//判斷素?cái)?shù)
        if (x <= 1) {
            throw new Exception("0和1既不是素?cái)?shù)也不是合數(shù),x應(yīng)為大于1的正整數(shù)");
        }
        for(int i = 2; i < (int) (Math.sqrt(x) + 1); i++) {
            if(x % i == 0) {
                return false;
            }
        }
        return true;
    }
2.求最大公約數(shù)
public static int gcd(int a,int b) {//求最大公約數(shù)
        if (b == 0) {
            return a;
        } else {
            return gcd(b, a % b);
        }
3.求乘法逆元

? 首先,數(shù)學(xué)上的乘法逆元就是指直觀的倒數(shù),即 a 的逆元是 1/a,也即與 a 相乘得 1 的數(shù)。ax=1,則x是a的乘法逆元。

? 這里我們討論關(guān)于取模運(yùn)算的乘法逆元,即對(duì)于整數(shù) a,與 a 互質(zhì)的數(shù) b 作為模數(shù),當(dāng)整數(shù) x 滿足 ax mod b≡1 時(shí),稱 x 為 a 關(guān)于模 b 的逆元,代碼表示就是a*x % b == 1

【安全多方計(jì)算】百萬富翁問題

這部分的實(shí)現(xiàn)代碼如下:

    public static int[] get_inverse(int a, int b){
//        a*x = 1 mod b
//        b*y = 1 mod a
//        已知a、b,返回x, y
        if (b == 0) {
            int [] l = {1, 0};
            return l;
        } else {
            int [] r = get_inverse(b, a % b);
            int x1, x2, y1, y2;
            x2 = r[0];
            y2 = r[1];
            x1 = y2;
            y1 = x2 - ((int)a / b) * y2;
            int [] r2 = {x1, y1};
            return r2;
        }
    }
4.生成公鑰和私鑰
  1. 隨機(jī)生成兩個(gè)大素?cái)?shù)p 、 q ( p ! = q ) ;

  2. n = p ? q , s = ( p ? 1 ) ? ( q ? 1 ) ;

  3. 隨機(jī)取一個(gè)大整數(shù)e ,使得2 ≤ e ≤ s ? 1且 g c d ( e , s ) = 1;

  4. 用擴(kuò)展歐幾里得算法求e 的乘法逆元 d ( e ? d = 1 m o d s , d > 0 ) ;

  5. 公鑰為( n , e ),私鑰為( n , d );

public static int [][] create_key() throws Exception {
//        創(chuàng)建公鑰和私鑰
        int p, q, n, s;
        while (true) {
            p = new Random().nextInt(90) + 10;
            if (is_prime(p)) {
                break;
            }
        }
        while (true) {
            q = new Random().nextInt(90) + 10;
            if (is_prime(q) && q != p) {
                break;
            }
        }
        n = p * q;
        s = (p - 1)*(q - 1);
        int d,e;
        System.out.println("n="+String.valueOf(n)+",s="+String.valueOf(s));
        while (true) {
            e = new Random().nextInt(s - 3) + 2;
            if (gcd(e, s) == 1){
                d = get_inverse(e,s)[0];
                if (d>0){
                    break;
                }
            }
        }
        int [][] r = {{n,e},{n,d}};
        return r;
    }

【總體實(shí)現(xiàn)】

import java.math.BigInteger;
import java.util.Random;
import java.util.Scanner;

public class millionaire{

    public static void main(String[] args) throws Exception {

//        Alice的財(cái)富為i,Bob的財(cái)富為j,取值為0~10
//        Alice選擇一個(gè)隨機(jī)大整數(shù)x
//        Alice和Bob約定使用RSA算法
//        Bob用RSA算法生成公鑰和私鑰,將公鑰發(fā)給Alice
//        Alice使用Bob的公鑰加密x得C=E(x),并發(fā)送C-i給Bob
//        Bob使用私鑰計(jì)算Y(u) = D(C-i+u) (1<=u<=10)
//        Bob隨機(jī)取一個(gè)小于x的大整數(shù)p,將Y(u) mod p得到Z(u),驗(yàn)證對(duì)所有Z(u)都滿足0<Z(u)<p-1。若不滿足則更換p重新計(jì)算
//        再將Z(u)從第j-1位開始向右均+1得到K(u),然后將K(u)和p發(fā)給Alice
//        Alice將K[i-1]與(x mod p)進(jìn)行比較,如果相等,則說明i<j,即Alice不如Bob富有;若不相等,則說明i>=j,說明Alice比BOb富有或者和Bob一樣富有
        Scanner input = new Scanner(System.in);
        System.out.print("Alice:");
        int i = input.nextInt();
        System.out.print("Bob:");
        int j = input.nextInt();
        int x;
        while (true) {
            x = new Random().nextInt(90) + 10;
            if (is_prime(x)){
                break;
            }
        }
        System.out.println("隨機(jī)整數(shù)x="+String.valueOf(x));
        int [] pbk, pvk;
        int [][] r = create_key();
        pbk = r[0];
        pvk = r[1];
        System.out.println("公鑰(n,e)=("+String.valueOf(pbk[0])+","+String.valueOf(pbk[1])+")\n"+
                "私鑰(n,d)=("+String.valueOf(pvk[0])+","+String.valueOf(pvk[1])+")");
        int C = encrypt(x, pbk);
        System.out.println("Alice發(fā)送C-i="+String.valueOf(C - i)+"給Bob");
        int [] Y = new int[10];
        for(int u = 1; u<11;u++){
            Y[u - 1] = decrypt(C-i+u,pvk);
        }
        System.out.println("Y="+toS(Y).toString());
        int p = new Random().nextInt(x - 11) + 10;
        int [] Z = new int[10];
        while (true) {
            for(int u = 0; u<10;u++){
                Z[u] = Y[u] % p;
            }
            if(max(Z) < p -1 &&min(Z)>0){
                break;
            }
            p = new Random().nextInt(x - 11) + 10;
        }
        System.out.println("p="+String.valueOf(p)+"\nZ="+toS(Z).toString());
        for(int u=0;u<10;u++){
            if(u>=j+1){
                Z[u] = Z[u] + 1;
            }
        }
        System.out.println("k="+toS(Z).toString());
        if(Z[i-1] == x % p){
            if (i<j){
                System.out.println("Bob更富有");
            }else {
                System.out.println("驗(yàn)證錯(cuò)誤,i應(yīng)該大于j,Alice可能更富有,也可能和Bob一樣富有");
            }
        }else {
            if (i >= j){
                System.out.println("Alice可能更富有,也可能和Bob一樣富有");
            }else {
                System.out.println("驗(yàn)證錯(cuò)誤,j應(yīng)該大于i,Bob更富有才對(duì)");
            }
        }
    }

    public static StringBuffer toS(int []d){
        StringBuffer stringBuffer = new StringBuffer();
        stringBuffer.append("[ ");
        for (int i=0;i<d.length;i++){
            stringBuffer.append(d[i]);
            stringBuffer.append(" ");
        }
        stringBuffer.append(" ]");
        return stringBuffer;
    }

    public static int gcd(int n, int m){
        int z = 0;
        while (m%n != 0){
            z = m%n;
            m = n;
            n = z;
        }
        return n;
    }

    public static int max(int []d){
        int m = d[0];
        for (int i = 1; i<d.length;i++){
            if(m<d[i]){
                m = d[i];
            }
        }
        return m;
    }

    public static int min(int []d){
        int m = d[0];
        for (int i = 1; i<d.length;i++){
            if(m>d[i]){
                m = d[i];
            }
        }
        return m;
    }

    public static boolean is_prime(int x) throws Exception {
        if (x <= 1) {
            throw new Exception("0和1既不是素?cái)?shù)也不是合數(shù),x應(yīng)為大于1的正整數(shù)");
        }
        for(int i = 2; i < (int) (Math.sqrt(x) + 1); i++) {
            if(x % i == 0) {
                return false;
            }
        }
        return true;
    }

    public static int[] get_inverse(int a, int b){
//        a*x = 1 mod b
//        b*y = 1 mod a
//        已知a、b,返回x, y
        if (b == 0) {
            int [] l = {1, 0};
            return l;
        } else {
            int [] r = get_inverse(b, a % b);
            int x1, x2, y1, y2;
            x2 = r[0];
            y2 = r[1];
            x1 = y2;
            y1 = x2 - ((int)a / b) * y2;
            int [] r2 = {x1, y1};
            return r2;
        }
    }

    public static int [][] create_key() throws Exception {
//        創(chuàng)建公鑰和私鑰
        int p, q, n, s;
        while (true) {
            p = new Random().nextInt(90) + 10;
            if (is_prime(p)) {
                break;
            }
        }
        while (true) {
            q = new Random().nextInt(90) + 10;
            if (is_prime(q) && q != p) {
                break;
            }
        }
        n = p * q;
        s = (p - 1)*(q - 1);
        int d,e;
        System.out.println("n="+String.valueOf(n)+",s="+String.valueOf(s));
        while (true) {
            e = new Random().nextInt(s - 3) + 2;
            if (gcd(e, s) == 1){
                d = get_inverse(e,s)[0];
                if (d>0){
                    break;
                }
            }
        }
        int [][] r = {{n,e},{n,d}};
        return r;
    }

    public static int encrypt(int content, int [] pbkey){
        BigInteger c = new BigInteger(String.valueOf(content));
        BigInteger p0 = new BigInteger(String.valueOf(pbkey[0]));
        int r = (c.pow(pbkey[1]).mod(p0)).intValue();
        return r;
//        return (int)Math.pow(content, pbkey[1]) % pbkey[0];
    }

    public static int decrypt(int encrypt_content, int [] pvkey){
        BigInteger c = new BigInteger(String.valueOf(encrypt_content));
        BigInteger p0 = new BigInteger(String.valueOf(pvkey[0]));
        int r = (c.pow(pvkey[1]).mod(p0)).intValue();
        return r;
//        return (int)Math.pow(encrypt_content, pvkey[1]) % pvkey[0];
    }

}

【測(cè)試結(jié)果】

【安全多方計(jì)算】百萬富翁問題

【安全多方計(jì)算】百萬富翁問題

ps:本人也是這方面知識(shí)的初學(xué)者,如果有什么認(rèn)識(shí)不到位或者錯(cuò)誤的地方懇請(qǐng)批評(píng)指正。文章來源地址http://www.zghlxwxcb.cn/news/detail-448742.html

到了這里,關(guān)于【安全多方計(jì)算】百萬富翁問題的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來自互聯(lián)網(wǎng)用戶投稿,該文觀點(diǎn)僅代表作者本人,不代表本站立場(chǎng)。本站僅提供信息存儲(chǔ)空間服務(wù),不擁有所有權(quán),不承擔(dān)相關(guān)法律責(zé)任。如若轉(zhuǎn)載,請(qǐng)注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實(shí)不符,請(qǐng)點(diǎn)擊違法舉報(bào)進(jìn)行投訴反饋,一經(jīng)查實(shí),立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費(fèi)用

相關(guān)文章

  • 安全多方計(jì)算簡(jiǎn)介

    安全多方計(jì)算簡(jiǎn)介

    安全多方計(jì)算(Secure Multi-Party Computation,SMPC)用于解決一組互不信任的參與方各自持有秘密數(shù)據(jù),協(xié)同計(jì)算一個(gè)既定函數(shù)的問題。安全多方計(jì)算在保證參與方獲得正確計(jì)算結(jié)果的同時(shí),無法獲得計(jì)算結(jié)果之外的任何信息。在整個(gè)計(jì)算過程中,參與方對(duì)其所擁有的數(shù)據(jù)始終擁有絕

    2024年02月07日
    瀏覽(29)
  • 聯(lián)邦學(xué)習(xí)與安全多方計(jì)算

    聯(lián)邦學(xué)習(xí)(FL,F(xiàn)ederated Learning)是谷歌于2016年提出的一種分布式機(jī)器學(xué)習(xí)框架,可以 在保護(hù)個(gè)人數(shù)據(jù)隱私的前提下,聯(lián)合多方用戶的數(shù)據(jù)實(shí)現(xiàn)模型訓(xùn)練 。 聯(lián)邦學(xué)習(xí)用于解決“數(shù)據(jù)孤島”問題,核心思想是“ 數(shù)據(jù)不動(dòng)模型動(dòng),數(shù)據(jù)可用不可見 ”。 傳統(tǒng)機(jī)器學(xué)習(xí)中,數(shù)據(jù)需集

    2023年04月15日
    瀏覽(28)
  • 第162篇 筆記-安全多方計(jì)算

    一、主要概念 安全多方計(jì)算 (Secure Multi-Party Computation):指多個(gè)參與者在不泄露各自隱私數(shù)據(jù)情況下,利用隱私數(shù)據(jù)參與保密計(jì)算,共同完成某項(xiàng)計(jì)算任務(wù)。 該技術(shù)能夠滿足人們利用隱私數(shù)據(jù)進(jìn)行保密計(jì)算的需求,有效解決數(shù)據(jù)的“保密性”和“共享性”之間的矛盾。多方

    2024年02月03日
    瀏覽(17)
  • 隱私計(jì)算論文合集「多方安全計(jì)算系列」第一期

    隱私計(jì)算論文合集「多方安全計(jì)算系列」第一期

    當(dāng)前,隱私計(jì)算領(lǐng)域正處于快速發(fā)展的階段,涌現(xiàn)出了許多前沿的 SOTA算法 和備受關(guān)注的 頂會(huì)論文 。為了方便社區(qū)小伙伴學(xué)習(xí)最新算法、了解隱私計(jì)算行業(yè)最新進(jìn)展和應(yīng)用,隱語開源社區(qū)在GitHub創(chuàng)建了Paper推薦項(xiàng)目awesome-PETs(PETs即Privacy-Enhancing Technologies , 隱私增強(qiáng)技術(shù) )

    2024年02月09日
    瀏覽(19)
  • 華為安全專家?guī)闳腴T安全多方計(jì)算

    華為安全專家?guī)闳腴T安全多方計(jì)算

    6月8日(本周四) 19:00—21:00 ,華為安全專家?guī)闳腴T安全多方計(jì)算,歡迎參加! 考慮以下應(yīng)用場(chǎng)景: Alice認(rèn)為她可能患有某種遺傳病,Bob有一個(gè)包含DNA模式與各類疾病的數(shù)據(jù)庫。Alice可將她的DNA序列交給Bob得到診斷結(jié)果。然而,Alice不想泄露自己的DNA序列,也不想Bob及其他人

    2024年02月08日
    瀏覽(21)
  • 聯(lián)邦學(xué)習(xí)中的安全多方計(jì)算

    聯(lián)邦學(xué)習(xí)中的安全多方計(jì)算

    Secure Multi-party Computation in Federated Learning 安全多方計(jì)算就是許多參與方需要共同工作完成一個(gè)計(jì)算任務(wù)或者執(zhí)行一個(gè)數(shù)學(xué)函數(shù),每個(gè)參與方針對(duì)這個(gè)執(zhí)行構(gòu)建自己的數(shù)據(jù)或份額,但不想泄露自己的數(shù)據(jù)給其他參與方。 在安全多方計(jì)算中的定義包括以下幾個(gè)方面: 一組有私有輸

    2024年02月11日
    瀏覽(17)
  • 多方安全計(jì)算破解企業(yè)數(shù)據(jù)互信難題

    多方安全計(jì)算破解企業(yè)數(shù)據(jù)互信難題

    所謂 多方安全計(jì)算 ,最初是為解決一組互不信任的參與方之間在保護(hù)隱私信息以及沒有可信第三方的前提下協(xié)同計(jì)算問題而提出的理論框架。 當(dāng)企業(yè)之間進(jìn)行數(shù)據(jù)相關(guān)的合作時(shí),隨之而來就涉及到數(shù)據(jù)泄露的問題。因此,如何兼顧“數(shù)據(jù)價(jià)值共享”和“隱私保護(hù)”,成為當(dāng)

    2023年04月16日
    瀏覽(19)
  • 安全多方計(jì)算之七:門限密碼系統(tǒng)

    門限密碼系統(tǒng)由分布式密鑰生成算法、加密算法、門限解密算法三部分構(gòu)成,定義如下: (1)分布式密鑰生成 :這是一個(gè)由參與者共同生成公鑰 y y y 的協(xié)議,協(xié)議運(yùn)行結(jié)束后,每個(gè)參與者將獲得一個(gè)關(guān)于私鑰 x x x 的碎片、對(duì)應(yīng)于該碎片的公鑰密鑰 y i y_i y i ? ,以及與私鑰

    2024年01月19日
    瀏覽(14)
  • 安全多方計(jì)算之九:不經(jīng)意傳輸

    考慮這樣的場(chǎng)景:A意欲出售許多個(gè)問題的答案,B打算購買其中一個(gè)問題的答案,但又不想讓A知道他買的哪個(gè)問題的答案。即B不愿意泄露給A他究竟掌握哪個(gè)問題的秘密,此類場(chǎng)景可通過不經(jīng)意傳輸協(xié)議實(shí)現(xiàn)。 不經(jīng)意傳輸(OT,Oblivious Transfer)又稱健忘傳輸或茫然傳輸,由Rabin于

    2023年04月16日
    瀏覽(21)
  • 【多方安全計(jì)算】差分隱私(Differential Privacy)解讀

    【多方安全計(jì)算】差分隱私(Differential Privacy)解讀

    差分隱私(Differential privacy)最早于2008年由Dwork 提出,通過嚴(yán)格的數(shù)學(xué)證明,使用隨機(jī)應(yīng)答(Randomized Response)方法確保數(shù)據(jù)集在輸出信息時(shí)受單條記錄的影響始終低于某個(gè)閾值,從而使第三方無法根據(jù)輸出的變化判斷單條記錄的更改或增刪,被認(rèn)為是目前基于擾動(dòng)的隱私保護(hù)

    2024年02月06日
    瀏覽(16)

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請(qǐng)作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包