应用密码学-1

来源:互联网 发布:淘宝拒收退款流程 编辑:程序博客网 时间:2024/06/05 23:40

扩展欧几里得–根据应用密码学书

//euclidean .h#pragma once#include<iostream>#include<string>using namespace std;class Gcd {public:int gcd(int x, int y);//返回1是没有最大最大公约数int e_gcd(int x, int y);int extern_gcd(int x, int y);public:string Euclidean_a;public:bool flag = 0;       //有最大公约数就为1;public:    int gcd_niyuan=0;    int gcd_gongyue=0;};
//euclidean.cpp#include<iostream>#include<string>#include"Euclidean_Algorithm.h"using namespace std;int Gcd::gcd(int x, int y){    /*if (x < y) {        int change;        change = x;        x = y;        y = x;    }*/    int r;    r = x %y;    cout << r << endl;    if (r == 0)    {        if (y == 1)Euclidean_a="无最大公约数:";        else { Euclidean_a = "有最大公约数:"; flag = 1; };        return y;    }    if (r != 0)gcd(y, r);}int Gcd::e_gcd(int y, int x){    //yxint e_x1 = 1, e_x2 = 0, e_x3;    int e_y1 = 0, e_y2 = 1, e_y3;    e_x3 = x; e_y3 = y;    while(1)    {     int t1, t2, t3;    if (e_x3%e_y3 == 1)    {        Euclidean_a = "有逆元:";        gcd_niyuan = e_x2 - e_x3 / e_y3*e_y2;        return gcd_niyuan;    }    if (e_x3%e_y3 == 0)    {        Euclidean_a = "有最大公约数";        flag = 1;        gcd_gongyue = e_y3;        return e_y3;    }    int q;    q = e_x3 / e_y3;    t1 = e_x1 - q*e_y1;    t2 = e_x2 - q*e_y2;    t3 = e_x3 - q*e_y3;    e_x1 = e_y1; e_x2 = e_y2; e_x3 = e_y3;    e_y1 = t1; e_y2 = t2; e_y3 = t3;    }}int Gcd::extern_gcd(int x, int y)//简易欧几里得算法{    int qi, r1 = x, r2 = y, x1 = 0, x2 = 1;    int rt, xt;//temp    if (r1%r2 == 1)    {        Euclidean_a = "有逆元";        return x1 - r1/r2*x2;    }    if (r1%r2 == 0)    {        flag = 1;        Euclidean_a = "有最大公约数";        return r2;    }    while (true)    {        qi = r1 / r2;        rt = r1%r2; xt = x1 - qi*x2;        r1 = r2; x1 = x2;        r2 = rt; x2 = xt;        if (r2 == 1)        {            Euclidean_a = "有逆元";            return x2;        }        if (r1%r2 == 0)        {            flag = 1;            Euclidean_a = "有最大公约数";            return r2;        }        cout << x2<<endl;    }}

DES:

//des.cpp#include"des.h"//①bear 关于S盒的选择/*密码函数f,接收32位数据和48位子密钥,产生一个32位的输出*/bitset<32> Des::f(bitset<32>R, bitset<48>k) {    bitset<48> expandR;    // 第一步:扩展置换,32 -> 48    for (int i = 0; i<48; ++i)        expandR[47 - i] = R[32 - E[i]];    // 第二步:异或    expandR = expandR ^ k;    // 第三步:查找S_BOX置换表    bitset<32> output;    int x = 0;    for (int i = 0; i<48; i = i + 6)///bear 48位2进制    {        int row = expandR[47 - i] * 2 + expandR[47 - i - 5];         //bear 获取横坐标,个位,和十位,以二进制来显示出来,导致可以获得类似十进制的数据。横坐标        int col = expandR[47 - i - 1] * 8 + expandR[47 - i - 2] * 4 + expandR[47 - i - 3] * 2            + expandR[47 - i - 4];//  bear 类似横坐标,是获取坐标        int num = S_BOX[i / 6][row][col];// bear  使用s盒获取s盒的数据        bitset<4> binary(num);  //bear 把获取的数据赋值给定义的binary        output[31 - x] = binary[3]; //把值赋给输出        output[31 - x - 1] = binary[2];        output[31 - x - 2] = binary[1];        output[31 - x - 3] = binary[0];        x += 4;    }    // 第四步:P-置换,32 -> 32    bitset<32> tmp = output;    for (int i = 0; i<32; ++i)        output[31 - i] = tmp[32 - P[i]];    return output;}//②关于移位操作/***  对56位密钥的前后部分进行左移*/bitset<28> Des::leftShift(bitset<28> k, int shift) // bear  shift是存放的移几位,k是移的那个数字{    bitset<28> tmp = k;    for (int i = 27; i >= 0; --i)    {        if (i - shift<0)            k[i] = tmp[i - shift + 28];//bear  在移位的个数之后的数据前移shift位,在之后的获取前面的shift位        else            k[i] = tmp[i - shift];    }    return k;}//bear  ③/***  生成16个48位的子密钥*/void Des::generateKeys(){    bitset<56> realKey;    bitset<28> left;    bitset<28> right;    bitset<48> compressKey;    // 去掉奇偶标记位,将64位密钥变成56位    for (int i = 0; i<56; ++i)        realKey[55 - i] = key[64 - PC_1[i]];    // 生成子密钥,保存在 subKeys[16] 中    for (int round = 0; round<16; ++round)    {        // 前28位与后28位        for (int i = 28; i<56; ++i)            left[i - 28] = realKey[i];        for (int i = 0; i<28; ++i)            right[i] = realKey[i];        // 左移        left = leftShift(left, shiftBits[round]);//每一轮        right = leftShift(right, shiftBits[round]);        // 压缩置换,由56位得到48位子密钥        for (int i = 28; i<56; ++i)            realKey[i] = left[i - 28];        for (int i = 0; i<28; ++i)            realKey[i] = right[i];        for (int i = 0; i<48; ++i)            compressKey[47 - i] = realKey[56 - PC_2[i]];        subKey[round] = compressKey;    }}/***  工具函数:将char字符数组转为二进制*/bitset<64> Des::charToBitset(const char s[8]){    bitset<64> bits;    for (int i = 0; i<8; ++i)        for (int j = 0; j<8; ++j)            bits[i * 8 + j] = ((s[i] >> j) & 1);    return bits;}/***  DES加密*/bitset<64> Des::encrypt(bitset<64>& plain){    bitset<64> cipher;    bitset<64> currentBits;    bitset<32> left;    bitset<32> right;    bitset<32> newLeft;    zhuan32(plain, 1);    // 第一步:初始置换IP    for (int i = 0; i<64; ++i)        currentBits[63 - i] = plain[64 - IP[i]];    // 第二步:获取 Li 和 Ri    for (int i = 32; i<64; ++i)        left[i - 32] = currentBits[i];    for (int i = 0; i<32; ++i)        right[i] = currentBits[i];    // 第三步:共16轮迭代    L_cipher.push_back(left); R_cipher.push_back(right);    for (int round = 0; round<16; ++round)    {        newLeft = right;if(round<15) L_cipher.push_back(right);        right = left ^ f(right, subKey[round]);        left = newLeft; if(round<15)R_cipher.push_back(right);    }    // 第四步:合并L16和R16,注意合并为 R16L16    R_cipher.push_back(left);    L_cipher.push_back(right);    for (int i = 0; i<32; ++i)        cipher[i] = left[i];    for (int i = 32; i<64; ++i)        cipher[i] = right[i - 32];    // 第五步:结尾置换IP-1    currentBits = cipher;    for (int i = 0; i<64; ++i)        cipher[63 - i] = currentBits[64 - IP_1[i]];    // 返回密文    return cipher;}/***  DES解密*/bitset<64> Des::decrypt(bitset<64>& cipher){    bitset<64> plain;    bitset<64> currentBits;    bitset<32> left;    bitset<32> right;    bitset<32> newLeft;    zhuan32(cipher,2);    // 第一步:初始置换IP    for (int i = 0; i<64; ++i)        currentBits[63 - i] = cipher[64 - IP[i]];    // 第二步:获取 Li 和 Ri    for (int i = 32; i<64; ++i)        left[i - 32] = currentBits[i];    for (int i = 0; i<32; ++i)        right[i] = currentBits[i];    // 第三步:共16轮迭代(子密钥逆序应用)    L_plain.push_back(left); R_plain.push_back(right);    for (int round = 0; round<16; ++round)    {        newLeft = right; if (round<15) L_plain.push_back(right);        right = left ^ f(right, subKey[15 - round]);        left = newLeft; if (round<15)R_plain.push_back(right);    }    // 第四步:合并L16和R16,注意合并为 R16L16    R_plain.push_back(left);    L_plain.push_back(right);    for (int i = 0; i<32; ++i)        plain[i] = left[i];    for (int i = 32; i<64; ++i)        plain[i] = right[i - 32];    // 第五步:结尾置换IP-1    currentBits = plain;    for (int i = 0; i<64; ++i)        plain[63 - i] = currentBits[64 - IP_1[i]];    // 返回明文    return plain;}void Des::use(const char s1[], const char s2[8]){    list<bitset<64>>::iterator ListIterator;//list迭代器    //初始化现有的链表,避免重复使用    forList();    char s[8];    strcpy_s(s, s2);//复制s2给s    key = charToBitset(s);    generateKeys();//生成16个子密钥 存放subkey[16]    //存放明文    int k = strlen(s1); //获取有几个8位字符,一个字符8个字节。以8个字符为一组    if (k % 8 == 0)        stringN = k / 8;    else        stringN = k / 8 + 1;    for (int i=0; i < stringN; i++)//have number    {        for (int j = 0; j < 8; j++)        {            s[j] = s1[i * 8 + j];//分组        }        plain.push_back(charToBitset(s));//明文,存放二进制明文在list<bitset<64>>的链表中    }    //加密,存放密文    for(ListIterator=plain.begin();ListIterator!=plain.end();++ListIterator)    {        cipher.push_back(encrypt(*ListIterator));    }    //解密,存放解密的文    for (ListIterator = cipher.begin(); ListIterator != cipher.end(); ++ListIterator)    {        c_plain.push_back(decrypt(*ListIterator));    }    //三个存放明文和存放密文 因为在一个函数表现出来,所以不需要我进行改成加密或者解密。加密和解密都是生成bitset    //如果想达到生成的一个密文的解析,需要把密文转换为bitset<64>的数组,然后对数组进行解密。    //需要一个专门的解密函数,可以提取解密bitset的函数出去,然后进行生成明文,提取出去的话,关于key部分也需要提取出来    bitsetToString();//把最后得到的解密的全部提取出来,放在str_plain中    tocipher();    //show(plainLeft);}void Des::forList(){    Str_plain.clear();    plainLeft.clear();    plainRight.clear();    cipherLeft.clear();    cipherRight.clear();    c_plain.clear();//解密的明文    plain.clear();//链表的密文 64进制    cipher.clear();//链表的明文    L_cipher.clear();//加密左    R_cipher.clear();//加密右}string Des::bitsetToString(){    list<bitset<64>>::iterator ListIterator;     char c[8]; bitset<64> A; bitset<8>a;    for (ListIterator = c_plain.begin();ListIterator != c_plain.end(); ListIterator++)    {           A = *ListIterator;        //show(A);//测试        for (int i = 0; i < 8; i++)        {            for (int j = 0; j < 8; j++)                a[j] = A[i * 8 + j];            int i1 = a.to_ullong();            if('a'<i1<'Z')            c[i] = i1;//转字符            else            {                c[i] = '\0';                break;            }        }        string temp;        for (int i = 0; i < 8; i++)        {            if (c[i] != '\0')                temp = temp + c[i];            else                break;        }        Str_plain = Str_plain + temp;//存在变量里面        //cout << Str_plain <<"str"<< endl;     }    return Str_plain;}void Des::tocipher(){    list<bitset<64>>::iterator ListIterator;    bitset<64>a;    for (ListIterator = cipher.begin(); ListIterator != cipher.end(); ++ListIterator)    {        a = *ListIterator;        Str_cipher = Str_cipher + a.to_string();//二进制密文        //cout << "二进制密文"<<a << endl;    }}void Des::show(bitset<64> a){    cout << "show:" << endl;    bitset<8> b; char c[8];    for (int i = 0; i < 8; i++)    {        for (int j = 0; j < 8; j++)        {            b[j] = a[i * 8 + j];        }        int num=1;        num = b.to_ulong();        cout << num;            c[i] = num;            if ('a' < num< 'Z')                cout << c[i] << endl;            else break;    }    //system("pause");}void Des::zhuan32(bitset<64> a, int b){    bitset<32> R, L;    switch (b)    {    case 1:        for (int i = 0; i < 64; i++)        {            if (i < 32)R[i] = a[i];            else            {                L[i - 32] = a[i];            }        }        plainLeft.push_back(L);        plainRight.push_back(R);        //show(L);//        break;    case 2:        for (int i = 0; i < 64; i++)        {            if (i < 32)R[i] = a[i];            else            {                L[i - 32] = a[i];            }        }        cipherLeft.push_back(L);        cipherRight.push_back(R);        break;    default:        break;    }}void Des::show(bitset<48> a){    cout << "48位:"<<a << endl;}void Des::show(bitset<32> a){    cout << "32位:" << a << endl;}void Des::show(bitset<28> a){    cout << "28位:" << a << endl;}void Des::show(list < bitset<32>>a){    list<bitset<32>>::iterator i;    for (i = a.begin(); i != a.end(); i++)    {        cout << *i << endl;    }}void Des::show(list < bitset<64>>a){    list<bitset<64>>::iterator i;    for (i = a.begin(); i != a.end(); i++)    {        cout << *i << endl;    }}
#pragma once//des.h#include<iostream>#include<bitset>#include<string>#include<list>using namespace std;class Des{public:string title = "DES:";public:    int stringN;    list<bitset<32>>plainLeft;    list<bitset<32>>plainRight;    void zhuan32(bitset<64> a,int b);    list<bitset<32>>cipherLeft;    list<bitset<32>>cipherRight;public:    list<bitset<64>> c_plain;//解密的明文public:    list<bitset<64>> plain;//链表的密文 64进制    list < bitset<64>>cipher;//链表的明文    bitset<64>key;//64位密钥    bitset<48> subKey[16];//存放16轮子密钥public:    list < bitset<32>>L_plain;//jiemi    list<bitset<32>>R_plain;    list<bitset<32>>L_cipher;//加密左    list<bitset<32>>R_cipher;//加密右public:string Str_plain; //存放解密的文       string Str_cipher;//二进制密文,全部为字符串显示private:        //置换函数    //初始置换表        int IP[64] = {        58, 50, 42, 34, 26, 18, 10, 2,        60, 52, 44, 36, 28, 20, 12, 4,        62, 54, 46, 38, 30, 22, 14, 6,        64, 56, 48, 40, 32, 24, 16, 8,        57, 49, 41, 33, 25, 17, 9,  1,        59, 51, 43, 35, 27, 19, 11, 3,        61, 53, 45, 37, 29, 21, 13, 5,        63, 55, 47, 39, 31, 23, 15, 7         };        // 结尾置换表        int IP_1[64] = {            40, 8, 48, 16, 56, 24, 64, 32,            39, 7, 47, 15, 55, 23, 63, 31,            38, 6, 46, 14, 54, 22, 62, 30,            37, 5, 45, 13, 53, 21, 61, 29,            36, 4, 44, 12, 52, 20, 60, 28,            35, 3, 43, 11, 51, 19, 59, 27,            34, 2, 42, 10, 50, 18, 58, 26,            33, 1, 41,  9, 49, 17, 57, 25         };        // 密钥置换表,将64位密钥变成56位        int PC_1[64] = {            57, 49, 41, 33, 25, 17, 9,            1, 58, 50, 42, 34, 26, 18,            10,  2, 59, 51, 43, 35, 27,            19, 11,  3, 60, 52, 44, 36,            63, 55, 47, 39, 31, 23, 15,            7, 62, 54, 46, 38, 30, 22,            14,  6, 61, 53, 45, 37, 29,            21, 13,  5, 28, 20, 12,  4 };        // 压缩置换,将56位密钥压缩成48位子密钥        int PC_2[64] = {            14, 17, 11, 24,  1,  5,            3, 28, 15,  6, 21, 10,            23, 19, 12,  4, 26,  8,            16,  7, 27, 20, 13,  2,            41, 52, 31, 37, 47, 55,            30, 40, 51, 45, 33, 48,            44, 49, 39, 56, 34, 53,            46, 42, 50, 36, 29, 32 };        // 每轮左移的位数        int shiftBits[16] = { 1, 1, 2, 2, 2, 2, 2, 2, 1, 2, 2, 2, 2, 2, 2, 1 };        /*------------------下面是密码函数 f 所用表-----------------*/        // 扩展置换表,将 32位 扩展至 48位        int E[48] = {            32,  1,  2,  3,  4,  5,            4,  5,  6,  7,  8,  9,            8,  9, 10, 11, 12, 13,            12, 13, 14, 15, 16, 17,            16, 17, 18, 19, 20, 21,            20, 21, 22, 23, 24, 25,            24, 25, 26, 27, 28, 29,            28, 29, 30, 31, 32,  1 };        // S盒,每个S盒是4x16的置换表,6位 -> 4位        int S_BOX[8][4][16] = {            {                { 14,4,13,1,2,15,11,8,3,10,6,12,5,9,0,7 },                { 0,15,7,4,14,2,13,1,10,6,12,11,9,5,3,8 },                { 4,1,14,8,13,6,2,11,15,12,9,7,3,10,5,0 },                { 15,12,8,2,4,9,1,7,5,11,3,14,10,0,6,13 }            },            {                { 15,1,8,14,6,11,3,4,9,7,2,13,12,0,5,10 },                { 3,13,4,7,15,2,8,14,12,0,1,10,6,9,11,5 },                { 0,14,7,11,10,4,13,1,5,8,12,6,9,3,2,15 },                { 13,8,10,1,3,15,4,2,11,6,7,12,0,5,14,9 }            },            {                { 10,0,9,14,6,3,15,5,1,13,12,7,11,4,2,8 },                { 13,7,0,9,3,4,6,10,2,8,5,14,12,11,15,1 },                { 13,6,4,9,8,15,3,0,11,1,2,12,5,10,14,7 },                { 1,10,13,0,6,9,8,7,4,15,14,3,11,5,2,12 }            },            {                { 7,13,14,3,0,6,9,10,1,2,8,5,11,12,4,15 },                { 13,8,11,5,6,15,0,3,4,7,2,12,1,10,14,9 },                { 10,6,9,0,12,11,7,13,15,1,3,14,5,2,8,4 },                { 3,15,0,6,10,1,13,8,9,4,5,11,12,7,2,14 }            },            {                { 2,12,4,1,7,10,11,6,8,5,3,15,13,0,14,9 },                { 14,11,2,12,4,7,13,1,5,0,15,10,3,9,8,6 },                { 4,2,1,11,10,13,7,8,15,9,12,5,6,3,0,14 },                { 11,8,12,7,1,14,2,13,6,15,0,9,10,4,5,3 }            },            {                { 12,1,10,15,9,2,6,8,0,13,3,4,14,7,5,11 },                { 10,15,4,2,7,12,9,5,6,1,13,14,0,11,3,8 },                { 9,14,15,5,2,8,12,3,7,0,4,10,1,13,11,6 },                { 4,3,2,12,9,5,15,10,11,14,1,7,6,0,8,13 }            },            {                { 4,11,2,14,15,0,8,13,3,12,9,7,5,10,6,1 },                { 13,0,11,7,4,9,1,10,14,3,5,12,2,15,8,6 },                { 1,4,11,13,12,3,7,14,10,15,6,8,0,5,9,2 },                { 6,11,13,8,1,4,10,7,9,5,0,15,14,2,3,12 }            },            {                { 13,2,8,4,6,15,11,1,10,9,3,14,5,0,12,7 },                { 1,15,13,8,10,3,7,4,12,5,6,11,0,14,9,2 },                { 7,11,4,1,9,12,14,2,0,6,10,13,15,3,5,8 },                { 2,1,14,7,4,10,8,13,15,12,9,0,3,5,6,11 }            }        };        // P置换,32位 -> 32位        int P[32] = {            16,  7, 20, 21,            29, 12, 28, 17,            1,  15, 23, 26,            5,  18, 31, 10,            2,   8, 24, 14,            32, 27,  3,  9,            19, 13, 30,  6,            22, 11,  4, 25 };private:    bitset<32>f(bitset<32>R, bitset<48>k);//密码函数f,接收32位数据和48位子密钥,产生一个32位的输出    bitset<28> leftShift(bitset<28> k, int shift);//对56位密钥的前后部分进行左移    void generateKeys();//生成16个48位的子密钥private://转换函数    bitset<64> charToBitset(const char s[8]);   //  把字符转换为64位二进制    string bitsetToString();    void tocipher();private://解密    bitset<64> encrypt(bitset<64>& plain);  //进行加密    bitset<64> decrypt(bitset<64>& cipher); //进行解密public:    /*使用,明文没有做要求,可以多输入,然后输出。    *密钥定了数量,最长8位    *结果在字符串里面    */    void use(const char s1[], const char s2[8]);///入口private:    void forList();private://test 控制台窗口可见        void show(bitset<64>a);//测试,展示链表中某个64为二进制的值 已经转换为了64进制        void show(bitset<48>a);//测试,展示链表中某个48为二进制的值        void show(bitset<32>a);//测试,展示链表中某个32为二进制的值        void show(bitset<28>a);//测试,展示链表中某个28为二进制的值        void show(list < bitset<32>>a);        void show(list<bitset<64>>a);};class conver{};

sha-1

//sha_1.h#pragma once#include<iostream>#include<bitset>#include<string>#include<cmath>using namespace std;class sha{public:    void sha_1_pad(bitset<64> x);     bitset<64> charToBitset(const char s[8]);    bitset<512> M;    int L;//长度    bitset<64> bitL;    bool c = 0;//判断是字符串public:    bitset<32> A = 0x67452301;    bitset<32>B = 0xefcdab89;    bitset<32>C = 0x98badcfe;    bitset<32>D = 0x10325476;    bitset<32>E = 0xc3d2e1f0;public:    bitset<32>k[80];    bitset<32>w[80];    void tow();    void for_k();    unsigned _int64 f1234(int t, bitset<32> B, bitset<32>C, bitset<32>D);public:    void use(const char s[8]);    void hash();    bitset<32> shift(bitset<32> a);public:    void showw();    void sABCDE();    //string str_plain;    string str_hash;        string title = "SHA-1:";        //string str_hash16;        //void hash16();};
#include"sha_1.h"void sha::sha_1_pad(bitset<64> x){    M.reset();    for(int i=0;i<64;i++)    {        M[i] = x[i];    }    int length;    if (c)    {        length = 8 * L;        //M=M << 8 * (8 - L);//字符串    }    else {        length = L;        M=M << L;//数据    }    M=M << 448;//把x放在前64位    bitL = length;    for (int i = 0; i < 64; i++)    {        M[i] = bitL[i];    }    M[511 - length] = 1;}bitset<64> sha::charToBitset(const char s[8]){    bitset<64> bits; c = 1;    /*for (int i = 0; i < 8; i++)        cout << s[i] << " ";    cout << endl;*/    L = strlen(s);//多少位,对于字符串的使用    for (int i = 0; i<8; ++i)        for (int j = 0; j<8; ++j)            bits[i * 8 + j] = ((s[7-i] >> j) & 1);    //cout << "bits:"<<bits << endl;    return bits;}void sha::for_k(){    for (int i = 0; i < 80; i++)    {        if (i / 20 == 0)k[i] = 0x5a827999;        else if (i / 20 == 1)k[i] = 0x6ed9eba1;        else if (i / 20 == 2)k[i] = 0x8f1bbcdc;        else k[i] = 0xca62c1d6;    }}void sha::tow(){    for (int i = 15; i>=0; i--)    {        for (int j = 0; j < 32; j++)            w[i][j] = M[j+32*(15-i)];    }    for (int i = 16; i < 80; i++)    {        w[i] = shift((w[i - 16] ^ w[i - 14] ^ w[i - 8] ^ w[i - 3]));    }}void sha::use(const char s[8]){    sha_1_pad(charToBitset(s));    for_k();    tow();    hash();    //printf("%x %x %x %x %x \n", A, B, C, D, E);    //showw();/////    str_hash = A.to_string() + B.to_string() + C.to_string() + D.to_string() + E.to_string();}void sha::hash(){    //sABCDE();    // system("pause");    bitset<32>H[5]; H[0] = A; H[1] = B; H[2] = C; H[3] = D; H[4] = E;    bitset<32>temp;    for (int i = 0; i < 80; i++)    {        unsigned _int64 e, s5a, wt, kt, f1;        bitset<32>tp_a = A;        for (int j = 0; j < 5; j++)        tp_a = shift(tp_a);        e = E.to_ullong();        f1 = f1234(i, B, C, D);        s5a = tp_a.to_ullong();        wt = w[i].to_ullong();        kt = k[i].to_ullong();        unsigned _int64 q = pow(2, 32);        temp = (e + f1 + s5a + wt + kt) % q;        //cout << "tp_a" << tp_a << " e" << e << " f1:" << f1 << " s5a" << s5a << " kt" << kt << " q" << q << " temp" << temp << endl;        //cout << "A" << A << "\nB" << B << "\nC" << C << "\nD" << D << "\nE" << E << endl;        E = D;        D = C;        for (int j = 0; j < 30; j++)            B = shift(B);        C = B;        B = A;        A = temp;        //bitset<64>v1 = 0x40000000;        //bitset<64>v2 = 0x7bf36ae2;        //cout << v1 << endl;        //cout << v2 << endl;        //sABCDE();        //system("pause");    }    unsigned _int64 x1, x2;    x1 = A.to_ullong(), x2 = H[0].to_ullong();    A = x1 + x2;    x1 = B.to_ullong(), x2 = H[1].to_ullong();    B = x1 + x2;    x1 = C.to_ullong(); x2 = H[2].to_ullong();    C = x1 + x2;    x1 = D.to_ullong(); x2 = H[3].to_ullong();    D = x1 + x2;    x1 = E.to_ullong(); x2 = H[4].to_ullong();    E = x1 + x2;}unsigned _int64 sha::f1234(int t, bitset<32> B, bitset<32>C, bitset<32>D){    unsigned _int64 a; bitset<32>A;    int w = t / 20;    switch (w)    {    case 0:        A = (B&C) | ((~B)&D);        break;    case 1:        A = B^C^D;        break;    case 2:        A = (B&C) | (B&D) | (C&D);        break;    case 3:        A = B^C^D;        break;    default:        break;    }    a = A.to_ullong();    return a;}void sha::showw(){    cout <<"L长度"<< L << endl;    for (int i = 0; i < 80; i++)        cout << w[i] << "  ";    cout << endl;    for (int i = 0; i < 80; i++)        cout << k[i] << "  ";}void sha::sABCDE(){    printf("%x %x %x %x %x \n", A, B, C, D, E);}bitset<32> sha::shift(bitset<32> a){    bool b;    b = a[31]; int i;    for ( i = 31; i>0; i--)    {        a[i] = a[i -1];    }    //a[i] = 0;    a[i] = b;    //cout << a << endl;    //system("pause");    return a;}//void sha::hash16()//{//  //str_hash16;//}

RSA 可利用的是快速取模

//rsa.h#pragma once#include<iostream>#include<bitset>#include<string>#include<list>#include<time.h>#include<cmath>#include<random>using namespace std;/*打算做到的一个事情,是对64位2进制进行加密,可以对DES的64位二进制进行同样的加密。*但对于大素数,暂时没有找到一个好的办法,第一版本,使用小数代替,实现算法实现*若有机会,可以去实现大素数的判断*先想过使用大素数,但是有点麻烦*/class Rsa{public:    int n;    int e=3;private:    int d;    int p;    int q;public:    /*find prime    *p q e n d     **/    void FindPrime();//大数素数创造,未写--2    /*素数测试    *整除测试    */    int Prime_test(int x);    /*如果使用大数的witness算法    *概率测试,未写---2    */    //int WITNESS(int a,int n);private:    //明文和密文public:string Str_plain; //存放解密的文--字符串       string Str_cipher;       string title = "RSA:";    list<int> c_plain;//解密的明文private:    list<int> plain;//链表的明文    list < int>cipher;//链表的密文public:    int encrypt(int & plain);   //进行加密    int decrypt(int & cipher);  //进行解密public:    /*工具函数*/    //bitset<64>charToBitset(const char s[8]);//无论是 什么类型都转换未char型    void inttostring();    int kuai(int a, int n, int m);    void use(const char s1[]);    void show();};
//rsa.cpp#include"rsa.h"#include"Euclidean_Algorithm.h"int Rsa::Prime_test(int n){    int r = 2;    while (r<sqrt(n))    {        if (n%r == 0)            return 0;//不是素数        r++;    }    return n;}void Rsa::FindPrime(){    /*随机生成100-1000的素数    *赋值为p,q e    */    srand(time(NULL)); p = 2; q = 3; int f = 1;one:    while (true)    {        p = rand() % 100 + 25;        if (Prime_test(p))break;    }    while (true)    {        q = rand() % 100 + 25;        if (Prime_test(q))break;    }    if (p == q)goto one;    //cout << p << "+q+" << q << endl;    n = p*q;    while ((p - 1)*(q - 1) % e == 0)e = e + 2;    Gcd a;    d = -1;    while (d<0)    {        d = a.e_gcd(e, (p-1)*(q-1));        if (d > 0)break;        e = e + 2;        while (1)        {            if ((p - 1)*(q - 1) % e != 0)break;            e = e + 2;        }    }    int f1 = a.e_gcd(d, (p - 1)*(q - 1));    //cout <<"p"<<p<<"q"<<q<<" " <<d<<"dd" << f1 << "d" <<e<< endl;}void Rsa::use(const char s1[]){    list<int>::iterator ListIterator;       FindPrime();    int k = strlen(s1);    //cout << k << "K" << endl;    for (int i = 0; i < k ; i++)//have number    {        plain.push_back(s1[i]);//明文    }    //加密,存放密文    for (ListIterator = plain.begin(); ListIterator != plain.end(); ++ListIterator)    {        cipher.push_back(encrypt(*ListIterator));    }    //解密,存放解密的文    for (ListIterator = cipher.begin(); ListIterator != cipher.end(); ++ListIterator)    {        c_plain.push_back(decrypt(*ListIterator));    }    //三个存放明文和存放密文 因为在一个函数表现出来,所以不需要我进行改成加密或者解密。加密和解密都是生成bitset    //如果想达到生成的一个密文的解析,需要把密文转换为bitset<64>的数组,然后对数组进行解密。    //需要一个专门的解密函数,可以提取解密bitset的函数出去,然后进行生成明文,提取出去的话,关于key部分也需要提取出来    inttostring();    //show();}int Rsa::encrypt(int &plain)//进行加密{    int cipher=0;    cipher=kuai(plain, e, n);    return cipher;}int Rsa::decrypt(int &cipher)   //进行解密{    int plain ;    plain = kuai(cipher, d, n);    return plain;}int Rsa::kuai(int a,int m,int n){    int c = 1,flag=1; int d1 = 1;    bitset<64> bit_m = m;    int k = 0;    for (int i = 0; i < 64; i++)    {        if (bit_m[63 - i] == 1)        {            k = i;            break;        }    }    k = 63 - k;    for (int i = k; i >= 0; i--)    {        if (flag) { flag = 0; }        else        c = 2 * c;        d1 = (d1*d1) % n;        if (bit_m[i] == 1)        {            c = c + 1;            d1 = (d1*a) % n;        }    }    return d1;}void Rsa::inttostring(){    list<int>::iterator ListIterator;    for (ListIterator = c_plain.begin(); ListIterator != c_plain.end(); ++ListIterator)    {        char c = *ListIterator;        Str_plain = Str_plain + c;    }    //cout << "str_plain:"<<Str_plain << endl;    for (ListIterator = cipher.begin(); ListIterator != cipher.end(); ++ListIterator)    {        char c = *ListIterator;        Str_cipher = Str_cipher + c;    }}void Rsa::show(){    cout << "p\tq\tn\te\td\t(p-1)*(q-1)" << endl;    cout << p << "\t" << q << "\t" << n << "\t" << e << "\t" << d <<"\t"<<(p-1)*(q-1)<< endl;    list<int>::iterator ListIterator;    for (ListIterator = plain.begin(); ListIterator != plain.end(); ++ListIterator)    {        cout << *ListIterator << " ";    }    cout << endl;    for (ListIterator = cipher.begin(); ListIterator != cipher.end(); ++ListIterator)    {        cout << *ListIterator << " ";    }    cout << endl;    for (ListIterator = c_plain.begin(); ListIterator != c_plain.end(); ++ListIterator)    {        cout << *ListIterator << " ";    }    cout << endl;}

RC4:

#pragma once#include<stdio.h>#include<iostream>#include<string>using namespace std;typedef unsigned long ULONG;class rc42{public:    void rc4_init(unsigned char *s, unsigned char *key, unsigned long Len);    void rc4_crypt(unsigned char *s, unsigned char *Data, unsigned long Len);    void use(const char a[]);public:    string str_plain;    string title = "RC42:";    string str_cipher;};
#include"rc42.h"void rc42::rc4_init(unsigned char *s, unsigned char *key, unsigned long Len) //初始化函数{    int i = 0, j = 0;        char k[256] = { 0 };    unsigned char tmp = 0;    for (i = 0; i<256; i++)    {        s[i] = i;        k[i] = key[i%Len];    }    for (i = 0; i<256; i++)    {        j = (j + s[i] + k[i]) % 256;        tmp = s[i];        s[i] = s[j]; //交换s[i]和s[j]        s[j] = tmp;    }}void rc42::rc4_crypt(unsigned char *s, unsigned char *Data, unsigned long Len) //加解密{    int i = 0, j = 0, t = 0;    unsigned long k = 0;    unsigned char tmp;    for (k = 0; k<Len; k++)    {        i = (i + 1) % 256;        j = (j + s[i]) % 256;        tmp = s[i];        s[i] = s[j]; //交换s[x]和s[y]        s[j] = tmp;        t = (s[i] + s[j]) % 256;        Data[k] ^= s[t];    }}void rc42::use(const char a[]){    unsigned char s[256] = { 0 }, s2[256] = { 0 };    //S-box    char key[256] = { "just for test" };//定义key    int k = strlen(a);    char pData[512];    for (int i = 0; i < k; i++)        pData[i] = a[i];    //char pData[512] = "这是一个用来加密的数据Data";    ULONG len = strlen(pData);    //printf("pData = %s\n", pData);    //printf("key = %s, length = %d\n\n", key, strlen(key));    rc4_init(s, (unsigned char *)key, strlen(key));   //已经完成了初始化    //printf("完成对S[i]的初始化,如下:\n\n");    //for (int i = 0; i<256; i++)    //{    //  printf("%-3d ", s[i]);    //}    //printf("\n\n");    for (int i = 0; i<256; i++)//用s2[i]暂时保留经过初始化的s[i],很重要的!!!    {        s2[i] = s[i];    }    //printf("已经初始化,现在加密:\n\n");    rc4_crypt(s, (unsigned char *)pData, len);//加密    //printf("pData = %s\n\n", pData);    //printf("已经加密,现在解密:\n\n");    rc4_init(s, (unsigned char *)key, strlen(key));   //初始化密钥    rc4_crypt(s2, (unsigned char *)pData, len);//解密    //printf("pData = %s\n\n", pData);    pData[k] = '\0';    cout << pData <<"  "<< endl;    str_plain = pData;}

ECC:

#pragma once//ecc.h#include<iostream>#include<list>#include<string>#include<cmath>#include<bitset>#include<time.h>#include<random>using namespace std;struct GF{    bitset<4>x;    int xn;    bitset<4>y;    int yn;};struct Data{    bitset<4>x1, y1,x2,y2;};class Ecc{public:    //Ecc() {    //}    //~Ecc(){}public:    /*定义曲线    *对椭圆曲线满足的最基本的条件    *y^2+axy+by=x^3+c^2+dx+e;    *为了简便,使用默认值,并以应用密码学第二版-胡向东P143,6-9作为例题计算    */    int ellipse_a=1;    int ellipse_b=0;    int ellipse_c=3;    int ellipse_d=0;    int ellipse_e=1;public:    /*定义多项式    *根据简便和题设置为f(x)=x^4+x+1    *所以为GF(2^4)    *理论上可是有的是GF(2^m);m=160为可靠的    *在这里为4和对应2^4=16;    */    /*如果不像下,需要重载*,如果要使用到椭圆曲线,就需要重载*    *实现俩个功能,1,g[16]好算,2.实现方程相乘    */    bitset<4> g[17] = {    1,2,4,8,    3,6,12,11,    5,10,7,14,    15,13,9,1,    0};    int find(bitset<4> num);public:     list<GF> G;    int n;//阶,为G中的个数    list<bitset<8>>m;//存放bitset的消息    list<bitset<8>>sec;//    list < bitset<8>>c_m;//    string str_plain;    string str_cipher;public:    bitset<8> charToBitset(const char s);   //  把字符转换为64位二进制    string bitsetToString();    GF db(GF A);//倍点规则    GF ad(GF A,GF B);//相加规则 A+B    void calu(GF a);///开始计算    GF calu(GF a, int k);    bitset<8> encrypt(bitset<8> &plain);    //进行加密    bitset<8> decrypt(bitset<8>&cipher);    //进行解密public:    void use(const char message[]);    void show(GF a);    void showList(list<bitset<8>> L);    //void creat_ellipse();    string title = "ECC:";private:    int d;//私钥    GF Q;//公钥    Data cipher1;    Data plain1;};
#include"ecc.h"void Ecc::calu(GF a)///开始计算{    int il = 1;    G.push_back(a);    GF Gnext;    Gnext=db(a);    G.push_back(Gnext);    for (int i = 0; Gnext.xn != a.xn; i++)    {        Gnext = ad(a,Gnext);        G.push_back(Gnext);    }}GF Ecc::calu(GF a, int k){    if (k == 1)return a;    GF Gnext;    Gnext = db(a);    //cout << "2"; show(Gnext);    if (k == 2)return Gnext;int i1 = 3;    for (int i = 0; Gnext.xn != a.xn&&i1<=k; i++)    {        Gnext = ad(a, Gnext);        //cout << i1 ; show(Gnext);        i1++;    }    return Gnext;}bitset<8> Ecc::encrypt(bitset<8> &plain){    //cout << "encrypt"<<plain[0]<<" "<<plain << endl;    bitset<4>p1,p2; bitset<8>cipher;     for (int i = 0; i < 8; i++)    {        if (i < 4)        p2[i] = plain[i];        else        {             p1[i - 4] = plain[i];        }    }    bitset<4>c1, c2;    c1 = g[(find(p1) + find(cipher1.x2)) % 15];    c2 = g[(find(p2) + find(cipher1.x2)) % 15];    for (int i = 0; i < 4; i++)        cipher[4+ i] = c1[i];    for (int i = 0; i < 4; i++)    {        cipher[ i] = c2[i];    }    //cout << "cipher:"<<cipher << endl;    return cipher;}bitset<8> Ecc::decrypt(bitset<8>&cipher){    //cout << "decrypt" << endl;    bitset<8>plain;    bitset<4>p1, p2;     for (int i = 0; i < 8; i++)    {        if (i < 4)            p2[i] = cipher[i];        else        {            p1[i - 4] = cipher[i];        }    }    bitset<4>c1, c2;    //cout << "p1" << p1 << "p2" << " " << p2<<endl;    if (find(p1) > find(plain1.x2))    {        c1 = g[find(p1) - find(plain1.x2)];    }    else    {        c1 = g[15+(find(p1) - find(plain1.x2))];    }    if (find(p2) > find(plain1.x2))    {        c2 = g[find(p2) - find(plain1.x2)];    }    else    {        c2 = g[15+(find(p2) - find(plain1.x2))];    }    for (int i = 0; i < 4; i++)        plain[4 + i] = c1[i];    for (int i = 0; i < 4; i++)    {        plain[i] = c2[i];    }    return plain;}GF Ecc::db(GF a){    GF next;    bitset<4> langDa; bitset<4> a1 = ellipse_c;    bitset<4>x2, y2;    /*找到langda的值    */    int p, q; int langda;    p = (a.xn * 2)%15-a.xn;    if (p < 0)p = 15 + p;    q = a.yn - a.xn;    if (q < 0)q = 15 + q;    langDa = g[p] ^ g[q];    langda = find(langDa);    x2 = g[(langda * 2) % 15] ^ g[langda] ^ a1;    next.x = x2;    next.xn = find(x2);    y2 = g[(a.xn * 2) % 15] ^ g[(langda + next.xn) % 15] ^ g[next.xn];    next.y = y2;    next.yn = find(y2);    return next;}GF Ecc::ad(GF A, GF B) {    GF next;    bitset<4> langDa; bitset<4> a1 = ellipse_c;    bitset<4>x3, y3; bitset<4>tempx, tempy;    int p, q; int langda;    tempy = A.y^B.y; p = find(tempy);    tempx = A.x^B.x; q = find(tempx);    int w = p - q;    if (w < 0)w = 15 + w;    langDa = g[w]; langda = w;    x3 = g[(langda * 2) % 15] ^ g[langda] ^ g[A.xn] ^ g[B.xn] ^ a1;    next.x = x3;    next.xn = find(x3);    if (next.xn == 16)    {        y3 = g[(langda + A.xn) % 15] ^ g[A.yn];        next.y = y3;        next.yn = find(y3);    }    else    {        y3 = g[(langda + A.xn) % 15] ^ g[(langda + next.xn) % 15] ^ g[next.xn] ^ g[A.yn];        next.y = y3;        next.yn = find(y3);    }    return next;}int Ecc::find(bitset<4> num ){     int i;    for (i = 0; i < 16; i++)    {        if(num==g[i])        {            //cout << "cout" << num << " " << g[i] << " " << i << endl;            return i;        }    }    return i;}void Ecc::use(const char message[]){    int mg_n = strlen(message);     for (int i = 0; i < mg_n; i++)    {        charToBitset(message[i]);    }    //showList(m);    GF FT;    list<GF>::iterator ListIterator;    FT.x = 6;FT.xn = 5;    FT.y = 14; FT.yn = 11;    calu(FT);    //cout << G.size() << endl;    n= G.size();    srand(time(NULL));//随机获取    d = rand() % n + 1;    //d = 5;    int i = 0;    //cout << "d" << d;    for (ListIterator = G.begin(), i; ListIterator != G.end()&i < d; ListIterator++, i++)    {        Q = *ListIterator;    }    //cout <<"Q.xn:" <<Q.xn<<" "<<Q.yn << endl;    //以上的已经成功调试    //system("pause");    int k = rand() % n + 1;    //int k = 3;    GF dot;    i = 0;    for (ListIterator = G.begin(), i; ListIterator != G.end()&i < k; ListIterator++, i++)    {        dot = *ListIterator;        //cout << "dot:" << dot.x << " " << dot.y << endl;    }    cipher1.x1 = dot.x;    cipher1.y1 = dot.y;    dot = calu(Q, k);    cipher1.x2 = dot.x;    cipher1.y2 = dot.y;    //#cout << "cipher1 " << cipher1.x1 <<" " << cipher1.y1 <<" "<< cipher1.x2<<" " << cipher1.y2 << endl;    plain1.x1 = cipher1.x1;    plain1.y1 = cipher1.y1;    GF W;    W.x = plain1.x1; W.y = plain1.y1;    W.xn = find(W.x); W.yn = find(W.y);    //#cout << "show w"; show(W);    dot = calu(W, d);    plain1.x2 = dot.x;    plain1.y2 = dot.y;    //cout << "plain1 " << plain1.x1 << " " << plain1.y1 << " " << plain1.x2 << " " << plain1.y2 << endl;    //system("pause");    list<bitset<8>>::iterator ListIterator2;    for (ListIterator2 = m.begin(); ListIterator2 != m.end(); ListIterator2++)        sec.push_back(encrypt(*ListIterator2));    //cout << "sec" ; showList(sec);    for (ListIterator2 = sec.begin(); ListIterator2 != sec.end(); ListIterator2++)        c_m.push_back(decrypt(*ListIterator2));    //cout << "c_m"; showList(c_m);    bitsetToString();    //cout << str_plain;}void Ecc::show(GF a){    cout<< " " << a.xn << " " << a.yn << " " << a.x << " " << a.y << endl;//}bitset<8> Ecc::charToBitset(const char s){    bitset<8> bits;    for (int i = 0; i<8; ++i)            bits[i] = ((s >> i) & 1);    m.push_back(bits);    return bits;}void Ecc::showList(list<bitset<8>> L){    list<bitset<8>>::iterator ListIterator2;    for (ListIterator2 = L.begin(); ListIterator2 != L.end(); ListIterator2++)        cout << *ListIterator2 << " ";    cout << endl;}string Ecc::bitsetToString(){    list<bitset<8>>::iterator ListIterator2;    for (ListIterator2 = c_m.begin(); ListIterator2 != c_m.end(); ListIterator2++)    {        char a;        bitset<8>a1 = *ListIterator2;        int a2 = a1.to_ulong();        a = a2;        str_plain = str_plain + a;    }    //for (ListIterator2 = sec.begin(); ListIterator2 != sec.end(); ListIterator2++)    return str_plain;}
//main.cpp#include"Euclidean_Algorithm.h"#include"des.h"#include"rsa.h"#include"ecc.h"#include"sha_1.h"#include"dss.h"#include"rc4.h"#include"rc42.h"int main(){    //Gcd a;    //cout<<"1欧几里得:"<<a.gcd(1970, 1066)<<endl;    //cout << "2扩展求欧几里得+逆元:"; cout << a.Euclidean_a << a.e_gcd(1970, 1066);cout<< "+" << a.Euclidean_a << a.e_gcd(550, 1769) << endl;    //cout << "3扩展求逆元,并欧几里得:" <<a.Euclidean_a<<a.extern_gcd(1769,550)<< endl;    //Des des_xiong;    //cout << des_xiong.title << endl;    string s = "computer123"; string  k = "1234";    //des_xiong.use(s.c_str(), k.c_str());    //cout << des_xiong.Str_plain << endl;    //list<bitset<32>>::iterator a; bitset<32>q;    //list<bitset<64>>::iterator ListIterator;    //bitset<64>a1;    //for (ListIterator = des_xiong.cipher.begin(); ListIterator != des_xiong.cipher.end(); ++ListIterator)    //{    //  a1 = *ListIterator;    //  //des_xiong.Str_cipher = des_xiong.Str_cipher + a1.to_string();//二进制密文    //  cout << "二进制密文" << a1 << endl;    //  for (int i = 1; i >=0; i--)    //  {    //      bitset<32>temp;    //      for (int j = 0; j < 32; j++)    //      {    //          temp[j] = a1[i * 32 + j];    //      }    //      cout << temp << " ";    //  }    //  cout << endl;    //}    //des_xiong.use(s.c_str(), k.c_str());    //cout << des_xiong.Str_plain << endl;    //Rsa rsa_xiong;    //cout << rsa_xiong.title << endl;    //s = "kskjaf";    //rsa_xiong.use(s.c_str(    ));    //cout << rsa_xiong.Str_plain << endl;    Ecc ecc_xiong;    cout<<ecc_xiong.title<<endl;    s = "msfassfsafsasf";    ecc_xiong.use(s.c_str());    cout << ecc_xiong.str_plain << endl;    //sha sha_xiong;    //cout << sha_xiong.title << endl;    //s = "abc";    //sha_xiong.use(s.c_str());    //rc4 rc_xiong;    //rc_xiong.use();    //    //rc42 rc2_x;    //cout << rc2_x.title << endl;    //s = "abcdefg";    ///rc2_x.use(s.c_str());    //cout << rc2_x.str_plain << endl;    //dss dss1;    //cout<<dss1.title << endl;    //dss1.use(s.c_str());    system("pause");    return 0;}

做的时候用控制台系统进行封装,使用MFC实现图形化界面。上传进csdn资源中。

如果后续有时间。

需要对ECC的补充,关于选取椭圆曲线,加密的密钥等等。
RSA,实现大数,和自由选取素数。
RC4的学习。

原创粉丝点击