亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频

? 歡迎來到蟲蟲下載站! | ?? 資源下載 ?? 資源專輯 ?? 關于我們
? 蟲蟲下載站

?? diffie-hellman.txt

?? 設計一個加密系統里面含Diffie-Hellman代碼 DES_Tool2(直接生成密文和加密明文) DSATool.v1.3軟件和一個das源代碼
?? TXT
字號:


在http://en.wikipedia.org/wiki/Diffie-Hellman上面給出了這個密鑰交換協議的歷史,原理,重要文獻的鏈接,以及演示代碼。它的數學基礎就是離散對數這個數學難題。用它進行密鑰交換的過程簡述如下: 
選取兩個大數p和g并公開,其中p是一個素數,g是p的一個模p本原單位根(primitive root module p),所謂本原單位根就是指在模p乘法運算下,g的1次方,2次方……(p-1)次方這p-1個數互不相同,并且取遍1到p-1; 
對于Alice(其中的一個通信者),隨機產生一個整數a,a對外保密,計算Ka = g^a mod p,將Ka發送給Bob; 
對于Bob(另一個通信者),隨機產生一個整數b,b對外保密,計算Kb = g^b mod p,將Kb發送給Alice; 
在Alice方面,收到Bob送來的Kb后,計算出密鑰為:key = Kb^a mod p=(g^b)^a=g^(b*a) mod p; 
對于Bob,收到Alice送來的Ka后,計算出密鑰為:key = Ka ^ b mod p=(g^a)^b=g^(a*b) mod p。 
攻擊者知道p和g,并且截獲了Ka和Kb,但是當它們都是非常大的數的時候,依靠這四個數來計算a和b非常困難,這就是離散對數數學難題。 
要實現Diffie-Hellman密鑰交換協議,需要能夠快速計算大數模冪,在模冪算法中,仍需計算大數的乘法和模運算,所以整個過程需要三個算法:高精度乘法,高精度除法(用來同時求出一個大數除以另一個大數的商和余數),快速模冪算法。 
高精度的乘法和除法可以程序模擬手算。快速模冪算法也是從手算中總結出規律來,例如: 
5^8 = (5^2)^4 = (25)^4 = (25^2)^2 = (625)^2,這樣,原來計算5^8需要做8次乘法,而現在則只需要三次乘法,分別是:5^2, 25^2, 625^2。這就是快速模冪算法的基礎。將算法描述出來,那就是: 
算法M:輸入整數a,b,p,計算a^b mod p: 
M1.初始化c = 1 
M2.如果b為0, 則c就是所要計算的結果。返回c的值。算法結束。 
M3.如果b為奇數,則令c = c *a mod p, 令b = b-1,轉到M2。 
M4.如果b為偶數,則令a = a * a mod p, 令b = b / 2,轉到M2。 
高精度試除法原理簡單,但是代碼實現起來需要仔細考慮一些細節。 
我的演示代碼如下: 
高精度運算類: 
class SuperNumber { 
public: 
    SuperNumber() { 
        memset(data, 0, MAX_SIZE); 
        high = 0; 
    } 
    // 一般整型到SuperNumber的轉換,該版本中不支持負數 
    SuperNumber(unsigned long l) { 
        memset(data, 0, MAX_SIZE); 
        high = 0; 
        while(l) { 
            data[++high] = l % 10; 
            l /= 10; 
        } 
    } 
    // str為字符串形式表示的十進制數 
    SuperNumber(const char* str) { 
        assert(str != NULL); 
        high = strlen(str); 
        for(int i = high, j = 0; i >= 1; i--, j++) { 
            data[i] = str[j] - '0'; 
        } 
    } 
    SuperNumber(const SuperNumber& s) { 
        memcpy(data, s.data, MAX_SIZE); 
        high = s.high; 
    } 
    operator const char*() const { 
        return toString(10); 
    } 
    SuperNumber& operator=(const SuperNumber& s) { 
        if(this != &s) { 
            memcpy(data, s.data, MAX_SIZE); 
            high = s.high; 
        } 
        return *this; 
    } 

    // 將數據置為0 
    void reset() { 
        memset(data, 0, MAX_SIZE); 
        high = 0; 
    } 

    // str為字符串形式表示的十進制數 
    void setToStr(const char* str) { 
        assert(str != NULL); 
        high = strlen(str); 
        for(int i = high, j = 0; i >= 1; i--, j++) { 
            data[i] = str[j] - '0'; 
        } 
    } 
    // 將數據轉換成以base指定的進制的字符串形式,默認為十進制 
    const char* toString(int base = 10) const { 
        static char buf[MAX_SIZE]; 
        const char table[] = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ"; 

        if(high == 0) return "0"; 

        assert(base >= 2);      // 指定的進制應該不小于2 

        // 進制轉換 
        buf[MAX_SIZE-1] = '\0'; 
        int begin = MAX_SIZE-1; 
        char temp[MAX_SIZE]; 
        memcpy(temp, data, MAX_SIZE); 
        while(1) { 
            // 找最高位的起始位置 
            int h = high; 
            while(temp[h] == 0 && h >= 1) h--; 
            if(h == 0) break; 

            // 除基取余 
            int t = 0; 
            while(h >= 1) { 
                t = t * 10 + temp[h]; 
                temp[h] = t / base; 
                t = t % base; 
                h--; 
            } 
            buf[--begin] = table[t]; 
        } 

        return buf+begin; 
    } 

    // 乘法 
    SuperNumber operator*(const SuperNumber& s) const { 
        SuperNumber result;     // default set to 0 
        int i, j; 
         
        // 相乘 
        for(i = 1; i <= high; i++) { 
            for(j = 1; j <= s.high; j++) { 
                int k = data[i] * s.data[j] + result.data[i+j-1]; 
                result.data[i+j-1] = k % 10; 
                result.data[i+j] += k / 10; 
            } 
        } 
        // 進位 
        for(i = 1; i < MAX_SIZE - 1; i++) { 
            if(result.data[i] >= 10) { 
                result.data[i+1] += result.data[i] / 10; 
                result.data[i] %= 10; 
            } 
        } 
        // 確定最高位 
        for(i = MAX_SIZE-1; i >= 1 && result.data[i] == 0; i--); 
        result.high = i; 

        return result; 
    } 

    // 除法,內部調用doDivide來實現 
    SuperNumber operator/(const SuperNumber& s) const { 
        SuperNumber q, r; 
        doDivide(s, q, r); 
        return q; 
    } 
    // 模運算,內部調用doDivide來實現 
    SuperNumber operator%(const SuperNumber& s) const { 
        SuperNumber q, r; 
        doDivide(s, q, r); 
        return r; 
    } 

    // 除法運算,一次除法運算中同時得到商和余數,運算符/和%的重載 
    // 內部會調用這個函數,dest為除數,Q為商,R為余數,算法使用試除法 
    void doDivide(const SuperNumber& dest, SuperNumber& Q, SuperNumber& R) const { 
        int i, j, t; 

        Q.reset(); 
        Q.high = high - dest.high + 1; // 商的初始位數 
        R = *this;                     // 余數初始實為被除數 
        t = dest.high; 
        // 判斷除法是否結束 
        while(R >= dest) { 
            // 循環相減進行試除 
            while(dest >= R.sub(1, t)) { 
                Q.data[Q.high--] = 0; 
                ++t; 
            } 
            while(R.sub(1, t) >= dest) { 
                // i為相減時被除數最低下標,j為除數最低下標 
                for(i=R.high-t+1,j=1; j<=dest.high; i++,j++) { 
                    R.data[i] -= dest.data[j]; 
                    if(R.data[i] < 0) { 
                        R.data[i] += 10; 
                        R.data[i+1] -= 1; 
                    } 
                } 
                while(R.data[i] < 0 && i <= R.high) { 
                    R.data[i] += 10; 
                    R.data[i+1] -= 1; 
                    ++i; 
                } 
                Q.data[Q.high] += 1; 
            } 
            // 一次試除結束,更新商的最高位下標 
            Q.high -= 1; 
            // 更新被除數的最高位下標 
            while(R.data[R.high] == 0) { 
                R.high--; 
                t--; 
            } 
            t+=1;               // 下一位被除數 
        } 

        Q.high = high - dest.high + 1;  
        while(Q.data[Q.high] == 0) Q.high -= 1; 
        R.high = high; 
        while(R.data[R.high] == 0) R.high -= 1; 
    } 

    // 大數模冪算法,很簡單的自然算法,即將指數分解為二進制,換句 
    // 更簡單的話來說,就是不斷地找平方模冪,而不是全部乘方后再 
    // 做一次最終的模運算 
    // a.power_mod(p, n)計算a^p mod n 
    SuperNumber power_mod(int power, SuperNumber n) const { 
        SuperNumber c("1"), t(*this); 

        while(power) { 
            if(power % 2) { 
                c = c * t % n; 
                power -= 1; 
            } else { 
                t = t * t % n; 
                power /= 2; 
            } 
        } 

        return c%n; 
    } 

    bool operator>=(const SuperNumber& s) const { 
        if(high == s.high) { 
            int k = high; 
            while(data[k] == s.data[k] && k >= 1)k--; 
            if(k < 1) return true; // equal 
            return data[k] > s.data[k]; 
        } else if(high > s.high) return true; 
        return false;         
    } 

    bool operator<(const SuperNumber& s) const { 
        return !(*this >= s); 
    } 

    // 從十進制表示的最高位開始數起,數到第i位,從第i位開始截取連續 
    // 的c位數字出來組成一個新的數。例如:數據是12345678925698,則 
    // sub(3, 5)返回數字34567,如果數字不夠取,例如在34567上運行 
    // sub(3, 5),因為34567從高位數起第3個數字是5,剩下的數字是567, 
    // 最多只有三個,不夠取要求的5個,這個時候返回567,不報錯。 
    SuperNumber sub(int i, int c) const { 
        SuperNumber ret; 
        assert(high >= i);   // 保證可截取 

        i = high - i + 1;    // 從高位數起的第i個數位的下標 
        if(i >= c) { 
            ret.high = c; 
            while(c >= 1) ret.data[c--] = data[i--]; 
        } else { 
            ret.high = i; 
            while(i >= 1) { 
                ret.data[i] = data[i]; 
                i--; 
            } 
        }  
        // 過濾前導0 
        while(ret.data[ret.high] == 0) ret.high--; 
        return ret; 
    } 

    // I/O 
    friend istream& operator>>(istream& in, SuperNumber& s) { 
        char t[256]; 
        in >> t; 
        s.setToStr(t); 
        return in; 
    } 
    friend ostream& operator<<(ostream& out, const SuperNumber& s) { 
        return out << s.toString(10); 
    } 
private: 
    enum {MAX_SIZE=256};        // 最大十進制位數 
    // 須注意,使用data[0]存儲最高位所在下標是自己的一點小聰明,后來在 
    // 調試的時候發現這是一個極大的錯誤,不過對于此題目來說可以應付 
    char data[MAX_SIZE];        // 數據的內部表示,字符串形式的十進制 
                                // 其中data[0]存儲最高位所在下標,data[1] 
                                // 存儲數據的最低位,也就是個位 
    int high; 
};

主函數: 
int main(int argc, char **argv) { 
    freopen("in.txt", "r", stdin); 

    SuperNumberTest st; 

//    st.run(); 

    // g和n都是超過2^127的素數。它們在DH算法中公開 
    SuperNumber g, n; 
    int a, b; 
    SuperNumber ka, kb, key; 

    srand(time(0)); 

    cin >> g >> n; 

    cout << "g = " << g << endl 
         << "n = " << n << endl; 

    cout << "\nThis is Alice:\n"; 
    a = rand(); 
    cout << "Alice get a random integer a = " << a << endl; 
    cout << "Alice computer g^a mod n:\n"; 
    ka = g.power_mod(a, n); 
    cout << "Alice compute out ka = " << ka << endl; 

    cout << "\nThis is Bob:\n"; 
    b = rand(); 
    cout << "Bob get a random integer b = " << b << endl; 
    cout << "Bob compute g^b mod n:\n"; 
    kb = g.power_mod(b, n); 
    cout << "Bob compute out kb = " << kb << endl; 

    cout << "\nAlice get kb from Bob, she compute out key is:\n"; 
    cout << kb.power_mod(a, n) << endl; 

    cout << "\nBob get ka from Alice, he compute out key is:\n"; 
    cout << ka.power_mod(b, n) << endl; 


    return 0; 
} 





?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
欧美激情中文字幕| 中文字幕免费在线观看视频一区| 亚洲精品成a人| 在线观看免费一区| 亚洲18影院在线观看| 精品美女一区二区| fc2成人免费人成在线观看播放| 亚洲欧洲成人精品av97| 欧美亚洲自拍偷拍| 另类小说欧美激情| 国产欧美一区二区精品性色超碰| 成人av网站在线观看免费| 亚洲男人电影天堂| 日韩女同互慰一区二区| 国产麻豆日韩欧美久久| 亚洲色图.com| 日韩亚洲欧美在线| 不卡一区二区中文字幕| 香港成人在线视频| 久久先锋影音av鲁色资源网| 99久久精品国产毛片| 强制捆绑调教一区二区| 日本一区二区三区电影| 欧美日韩精品一区二区在线播放| 国产最新精品免费| 亚洲午夜精品网| 久久久久久久久久久久久夜| 日本久久电影网| 激情小说亚洲一区| 亚洲一区二区三区激情| 国产欧美一区二区精品性色超碰| 欧美色大人视频| 国产精品77777| 亚洲一二三级电影| 日本一区二区三区免费乱视频 | 国产伦精品一区二区三区免费| 国产精品午夜春色av| 91精品国产综合久久香蕉的特点| 成人av片在线观看| 激情图区综合网| 亚洲成a人v欧美综合天堂| 国产欧美日韩精品一区| 日韩欧美激情一区| 欧美三级三级三级爽爽爽| 成人黄色在线视频| 激情综合五月天| 丝袜亚洲精品中文字幕一区| 亚洲国产精品成人久久综合一区| 欧美一级高清大全免费观看| 91麻豆精东视频| 成人黄色a**站在线观看| 久久www免费人成看片高清| 婷婷开心久久网| 一区二区三区在线播| 国产精品视频麻豆| 国产丝袜美腿一区二区三区| 日韩无一区二区| 欧美亚洲高清一区二区三区不卡| yourporn久久国产精品| 国产一区二区三区视频在线播放| 免费日韩伦理电影| 日韩高清不卡一区| 亚洲国产成人精品视频| 夜夜亚洲天天久久| 有码一区二区三区| 一区二区三区在线免费视频| 日韩伦理免费电影| 成人免费在线视频| 中文字幕一区二区三区在线播放| 久久嫩草精品久久久精品一| 欧美成人激情免费网| 精品少妇一区二区三区日产乱码 | 色就色 综合激情| av电影在线观看一区| 99国内精品久久| 91香蕉视频污| 91福利精品第一导航| 欧美在线制服丝袜| 欧美久久免费观看| 91.com在线观看| 精品国产人成亚洲区| 2017欧美狠狠色| 国产女同互慰高潮91漫画| 国产精品污www在线观看| 国产精品久久三区| 中文字幕字幕中文在线中不卡视频| 中文字幕一区二区三区视频| 亚洲欧美日韩在线不卡| 亚洲一区二区在线播放相泽| 天天做天天摸天天爽国产一区| 五月天精品一区二区三区| 日韩福利视频导航| 国产精品一区二区免费不卡| 国产91高潮流白浆在线麻豆 | 日韩精品午夜视频| 久久91精品久久久久久秒播| 国产成人免费在线观看| 成人黄色电影在线| 欧美日韩视频第一区| 日韩精品自拍偷拍| 中文字幕av不卡| 国产精品综合视频| 成人av高清在线| 欧美日韩在线三级| 日韩一级大片在线| 国产精品三级av| 婷婷夜色潮精品综合在线| 寂寞少妇一区二区三区| 色综合久久99| 91精品国产高清一区二区三区蜜臀 | 日韩视频免费直播| 亚洲国产精品精华液2区45| 一区二区三区波多野结衣在线观看| 亚洲成av人片在线观看无码| 紧缚捆绑精品一区二区| 91精彩视频在线| 久久综合久久久久88| 亚洲夂夂婷婷色拍ww47| 久久成人免费电影| 91精彩视频在线观看| 国产网站一区二区| 亚洲成人手机在线| a在线播放不卡| 日韩午夜av电影| 一区二区三区在线视频免费观看| 精品一区二区综合| 在线观看区一区二| 欧美国产一区视频在线观看| 午夜在线成人av| 99久久国产综合色|国产精品| 日韩免费看的电影| 亚洲高清免费视频| 久久综合色天天久久综合图片| 中文字幕一区二区三区av| 开心九九激情九九欧美日韩精美视频电影| 成人av在线影院| 久久嫩草精品久久久精品一| 天堂午夜影视日韩欧美一区二区| 成人h动漫精品| 久久久精品影视| 免费久久99精品国产| 欧美日韩综合在线免费观看| 国产精品国产三级国产普通话99| 国产一区激情在线| 欧美大片在线观看一区二区| 亚洲成人av电影在线| 色94色欧美sute亚洲线路一久 | 首页国产欧美久久| 欧洲另类一二三四区| 亚洲欧洲另类国产综合| 国产成人鲁色资源国产91色综| 欧美日韩黄色一区二区| 亚洲综合小说图片| 色婷婷精品大视频在线蜜桃视频| 国产日韩成人精品| 国产成人综合亚洲91猫咪| 欧美r级在线观看| 热久久久久久久| 日韩亚洲欧美在线观看| 日本伊人色综合网| 日韩视频一区二区三区在线播放| 午夜一区二区三区视频| 欧美性猛交一区二区三区精品| 亚洲三级在线播放| 97se狠狠狠综合亚洲狠狠| 中文字幕一区在线| 色综合久久中文字幕综合网| 亚洲男帅同性gay1069| 91九色02白丝porn| 一区二区三区精品在线| 欧美日韩免费在线视频| 日韩国产精品91| 日韩一区二区视频在线观看| 美女脱光内衣内裤视频久久影院| 日韩丝袜美女视频| 国产精一区二区三区| 欧美国产精品一区二区三区| 成人午夜激情在线| 国产精品久久久久久久浪潮网站| zzijzzij亚洲日本少妇熟睡| 一区二区三区在线观看视频| 欧美色爱综合网| 久久精品国产久精国产| 久久久不卡影院| 91香蕉视频mp4| 日韩av中文在线观看| 久久人人97超碰com| a在线播放不卡| 午夜欧美在线一二页| 精品国产一区a| 97超碰欧美中文字幕| 午夜影院在线观看欧美| 久久伊99综合婷婷久久伊| 国产成人综合在线观看| 亚洲女同一区二区| 日韩精品一区二区三区视频| 成人性生交大片免费看在线播放| 亚洲黄色小说网站| 日韩一区二区免费高清| 成人午夜免费电影|