zoukankan      html  css  js  c++  java
  • SHA-1(安全哈希算法实现)

    如题,不知道sha-1的自己百度吧。

      1 #include <iostream>
      2 #include <vector>   //定义vector数组
      3 #include <string>   //记录消息
      4 using namespace std;
      5 
      6 const int NUM = 8;   //一个字由32比特(或者8个16进制数)
      7 const int BIT = 512;  //消息认证码要以512比特一组
      8 
      9 //字常量
     10 string H0 = "67452301";
     11 string H1 = "EFCDAB89";
     12 string H2 = "98BADCFE";
     13 string H3 = "10325476";
     14 string H4 = "C3D2E1F0";
     15 
     16 //定义SHA1(安全哈希算法)类
     17 class SHA1
     18 {
     19 public:
     20     //将一个字符串形式的字转化为vector数组
     21     vector<int> hex_into_dec(string word);
     22 
     23     //将vector转化为string字符串形式
     24     string num_into_message(vector<int> A);
     25 
     26     //两个字X和Y的逻辑"和"
     27     vector<int> word_AND(vector<int> A,vector<int> B);
     28 
     29     //两个字X和Y的逻辑"或"
     30     vector<int> word_OR(vector<int> A,vector<int> B);
     31 
     32     //两个字X和Y的逻辑"异或"
     33     vector<int> word_XOR(vector<int> A,vector<int> B);
     34 
     35     //两个字X和Y的逻辑"补"
     36     vector<int> word_COMPLEMENT(vector<int> A);
     37 
     38     //两个字X和Y的摸2^32整数加
     39     vector<int> word_ADD(vector<int> A,vector<int> B);
     40 
     41     //将字X循环左移s个位置
     42     vector<int> ROTL(vector<int> A,int s);
     43 
     44     //SHA-1的填充方案,我们设定msg由ASCII码组成
     45     vector<vector<int> > SHA_1_PAD(string msg);
     46 
     47     //将SHA-1压成以字为单位
     48     vector<vector<vector<int> > > compress(vector<vector<int> > result);
     49 
     50     //定义ft函数,每个ft函数都有B,C,D三个字作为输入,并产生一个字作为输出
     51     vector<int> Ft(int t,vector<int> B,vector<int> C,vector<int> D);
     52 
     53     //定义字常数K
     54     vector<int> K(int t);
     55 
     56     //开始进行SHA-1(安全Hash算法)的加密
     57     vector<vector<int> > SHA_1(string msg);
     58 
     59 };
     60 
     61 //将vector转化为string字符串形式
     62 string SHA1::num_into_message(vector<int> A)
     63 {
     64     int i;
     65     string msg = "";
     66     for(i = 0;i < A.size();i++)
     67     {
     68         if(A[i] >= 0 && A[i] <= 9)
     69             msg += '0' + A[i];
     70         else if(A[i] >= 10 && A[i] <= 15)
     71             msg += 'A' + (A[i] - 10);
     72     }
     73     return msg;
     74 }
     75 
     76 //将一个字符串形式的字转化为vector数组
     77 vector<int> SHA1::hex_into_dec(string word)
     78 {
     79     int i;
     80     vector<int> result(NUM,0);
     81     for(i = 0;i < NUM;i++)
     82     {
     83         if(word[i] >= '0' && word[i] <= '9')
     84         {
     85             result[i] = word[i] - '0';
     86         }
     87         else if(word[i] >= 'A' && word[i] <= 'F')
     88         {
     89             result[i] = 10 + word[i] - 'A';
     90         }
     91     }
     92     return result;
     93 }
     94 
     95 //两个字X和Y的逻辑"和"
     96 vector<int> SHA1::word_AND(vector<int> A,vector<int> B)
     97 {
     98     vector<int> result(NUM,0);
     99     int i;
    100     for(i = 0;i < NUM;i++)
    101     {
    102         result[i] = A[i] & B[i];
    103     }
    104     return result;
    105 }
    106 
    107 //两个字X和Y的逻辑"或"
    108 vector<int> SHA1::word_OR(vector<int> A,vector<int> B)
    109 {
    110     vector<int> result(NUM,0);
    111     int i;
    112     for(i = 0;i < NUM;i++)
    113     {
    114         result[i] = A[i] | B[i];
    115     }
    116     return result;
    117 }
    118 
    119 //两个字X和Y的逻辑"异或"
    120 vector<int> SHA1::word_XOR(vector<int> A,vector<int> B)
    121 {
    122     vector<int> result(NUM,0);
    123     int i;
    124     for(i = 0;i < NUM;i++)
    125     {
    126         result[i] = A[i] ^ B[i];
    127     }
    128     return result;
    129 }
    130 
    131 //两个字X和Y的逻辑"补"
    132 vector<int> SHA1::word_COMPLEMENT(vector<int> A)
    133 {
    134     vector<int> result(NUM,0);
    135     int i;
    136     for(i = 0;i < NUM;i++)
    137     {
    138         result[i] = 15 - A[i];
    139     }
    140     return result;
    141 }
    142 
    143 //两个字X和Y的摸2^32整数加
    144 vector<int> SHA1::word_ADD(vector<int> A,vector<int> B)
    145 {
    146     vector<int> result(NUM,0);
    147     int i;
    148     for(i = NUM - 1;i >= 0;i--)
    149     {
    150         result[i] = A[i] + B[i];
    151         if(i != 0)
    152         {
    153             int temp = result[i] / 16;
    154             result[i-1] += temp;
    155         }
    156         result[i] %= 16;
    157     }
    158     return result;
    159 }
    160 
    161 //将字X循环左移s个位置
    162 vector<int> SHA1::ROTL(vector<int> A,int s)
    163 {
    164     vector<int> result = A;
    165     vector<int> temp(NUM,0);
    166     int i,j;
    167     for(i = 0;i < s;i++)
    168     {
    169         for(j = NUM - 1;j >= 0;j--)
    170         {
    171             if(result[j] / 8 >= 1)
    172             {
    173                 temp[j] = 1;
    174                 result[j] <<= 1;
    175                 result[j] %= 16;
    176                 if(j < NUM - 1)
    177                     result[j] += temp[j + 1];
    178             }
    179             else if(result[j] / 8 == 0)
    180             {
    181                 temp[j] = 0;
    182                 result[j] <<= 1;
    183                 result[j] %= 16;
    184             }
    185         }
    186         result[NUM - 1] += temp[0];
    187     }
    188     return result;
    189 }
    190 
    191 //SHA-1的填充方案,我们设定msg由ASCII码组成
    192 vector<vector<int> > SHA1::SHA_1_PAD(string msg)
    193 {
    194     int len = msg.length();
    195     int bit_num = len * 8;
    196     int i,j;
    197     int num,lest = bit_num % 512;
    198     if(lest != 0)   //看消息长度是否超过512字节,我们需要将它补成512的倍数
    199         num = bit_num / 512 + 1;
    200     else
    201         num = bit_num / 512;
    202     //首先我们以8位字节为一组保存到vector里面,512比特为一组,即一组里面有64位元素
    203     vector<vector<int> > result;
    204     result.resize(num);
    205     for(i = 0;i < num;i++)
    206     {
    207         result[i].resize(64);
    208     }
    209     for(i = 0;i < num;i++)
    210     {
    211         for(j = 0;j < 64 && i * 64 + j < len;j++)
    212         {
    213             result[i][j] = msg[i * 64 + j];
    214         }
    215     }
    216     //下面开始为未够512比特的消息分组进行补长度操作
    217     if(lest != 0){
    218     int x = num - 1,last_len = lest / 8;
    219     result[x][last_len] = 128;   //先补一个"1"
    220     for(i = last_len + 1;i < 56;i++)
    221     {
    222         result[x][i] = 0;
    223     }
    224     int last_l = lest;
    225     j = 63;
    226     while(j >= 56)
    227     {
    228         result[x][j] = last_l % 128;
    229         last_l /= 128;
    230         j--;
    231     }
    232     }
    233     return result;
    234 }
    235 
    236 //将SHA-1压成以字为单位(三维数组有点复杂)
    237 vector<vector<vector<int> > > SHA1::compress(vector<vector<int> > result)
    238 {
    239     vector<vector<int> > rr;
    240     rr.resize(result.size());
    241     int i,j;
    242     for(i = 0;i < rr.size();i++)
    243     {
    244         rr[i].resize(128);
    245     }
    246     for(i = 0;i < result.size();i++)
    247     {
    248         for(j = 0;j < result[i].size();j++)
    249         {
    250             rr[i][2 * j] = result[i][j] / 16;
    251             rr[i][2 * j + 1] = result[i][j] % 16;
    252         }
    253     }
    254     vector<vector<vector<int> > > rrr;
    255     rrr.resize(result.size());
    256     for(i = 0;i < rrr.size();i++)
    257     {
    258         rrr[i].resize(16);
    259     }
    260     for(i = 0;i < rrr.size();i++)
    261     {
    262         for(j = 0;j < 16;j++)
    263         {
    264             rrr[i][j].resize(8);
    265         }
    266     }
    267     for(i = 0;i < rr.size();i++)
    268     {
    269         for(j = 0;j < rr[i].size();j++)
    270         {
    271             rrr[i][j / 8][j % 8] = rr[i][j];
    272         }
    273     }
    274     return rrr;
    275 }
    276 
    277 //定义ft函数,每个ft函数都有B,C,D三个字作为输入,并产生一个字作为输出
    278 vector<int> SHA1::Ft(int t,vector<int> B,vector<int> C,vector<int> D)
    279 {
    280     vector<int> result;
    281     if(t >= 0 && t <= 19)
    282     {
    283         vector<int> a1 = word_AND(B,C);
    284         vector<int> a2 = word_AND(word_COMPLEMENT(B),D);
    285         result = word_OR(a1,a2);
    286     }
    287     else if((t >= 20 && t <= 39) || (t >= 60 && t <= 79))
    288     {
    289         vector<int> a1 = word_XOR(B,C);
    290         result = word_XOR(a1,D);
    291     }
    292     else if(t >= 40 && t <= 59)
    293     {
    294         vector<int> a1 = word_AND(B,C);
    295         vector<int> a2 = word_AND(B,D);
    296         vector<int> a3 = word_AND(C,D);
    297         vector<int> a4 = word_OR(a1,a2);
    298         result = word_OR(a4,a3);
    299     }
    300     return result;
    301 }
    302 
    303 //定义字常数K
    304 vector<int> SHA1::K(int t)
    305 {
    306     vector<int> result;
    307     if(t >= 0 && t <= 19)
    308     {
    309         result = hex_into_dec("5A827999");
    310     }
    311     else if(t >= 20 && t <= 39)
    312     {
    313         result = hex_into_dec("6ED9EBA1");
    314     }
    315     else if(t >= 40 && t <= 59)
    316     {
    317         result = hex_into_dec("8F1BBCDC");
    318     }
    319     else if(t >= 60 && t <= 79)
    320     {
    321         result = hex_into_dec("CA62C1D6");
    322     }
    323     return result;
    324 }
    325 
    326 //开始进行SHA-1(安全Hash算法)的加密
    327 vector<vector<int> > SHA1::SHA_1(string msg)
    328 {
    329     vector<int> h0 = hex_into_dec(H0);
    330     vector<int> h1 = hex_into_dec(H1);
    331     vector<int> h2 = hex_into_dec(H2);
    332     vector<int> h3 = hex_into_dec(H3);
    333     vector<int> h4 = hex_into_dec(H4);
    334     
    335     vector<vector<int> > result1 = SHA_1_PAD(msg);
    336     vector<vector<vector<int> > > result2 = compress(result1);
    337     int n = result2.size();
    338     int i,j;
    339     for(i = 0;i < n;i++)
    340     {
    341         vector<vector<int> > W;
    342         W.resize(80);
    343         for(j = 0;j < 16;j++)
    344         {
    345             W[j] = result2[i][j];
    346         }
    347         for(j = 16;j < 80;j++)
    348         {
    349             vector<int> a1 = word_XOR(W[j-3],W[j-8]);
    350             vector<int> a2 = word_XOR(a1,W[j-14]);
    351             vector<int> a3 = word_XOR(a2,W[j-16]);
    352             W[j] = ROTL(a3,1);
    353         }
    354         
    355         //将string转化为vector数组
    356         vector<int> A = hex_into_dec(H0);
    357         vector<int> B = hex_into_dec(H1);
    358         vector<int> C = hex_into_dec(H2);
    359         vector<int> D = hex_into_dec(H3);
    360         vector<int> E = hex_into_dec(H4);
    361 
    362         for(j = 0;j < 80;j++)
    363         {
    364             vector<int> a1 = ROTL(A,5);
    365             vector<int> a2 = Ft(j,B,C,D);
    366             vector<int> a3 = word_ADD(a1,a2);
    367             vector<int> a4 = word_ADD(a3,E);
    368             vector<int> a5 = word_ADD(a4,W[j]);
    369             vector<int> temp = word_ADD(a5,K(j));
    370             E = D;
    371             D = C;
    372             C = ROTL(B,30);
    373             B = A;
    374             A = temp;
    375         }
    376 
    377         h0 = word_ADD(h0,A);
    378         h1 = word_ADD(h1,B);
    379         h2 = word_ADD(h2,C);
    380         h3 = word_ADD(h3,D);
    381         h4 = word_ADD(h4,E);
    382     }
    383 
    384     //返回结果(H0||H1||H2||H3||H4)
    385     vector<vector<int> > result;
    386     result.push_back(h0);
    387     result.push_back(h1);
    388     result.push_back(h2);
    389     result.push_back(h3);
    390     result.push_back(h4);
    391 
    392     return result;
    393 }
    394 
    395 int main()
    396 {
    397     SHA1 sha1;   //定义SHA1算法类
    398     string message = "cryptographyisthepracticeandstudyoftechniquesforsecurecommunicationinthepresenceofthirdpartiesmoregenerallyitisaboutconstructingandanalyzingprotocolsthatovercometheinfluenceofadversariesandwhicharerelatedtovariousaspectsininformationsecuritysuchasdataconfidentialitydataintegrityauthenticationandnonrepudiationmoderncryptographyintersectsthedisciplinesofmathematicscomputerscienceandelectricalengineeringapplicationsofcryptographyincludeATMcardscomputerpasswordsandelectroniccommerce";
    399     vector<vector<int> > result;
    400     result = sha1.SHA_1(message);
    401     cout << "消息为:" << endl << message << endl;
    402     cout << "利用填充方案SHA-1-PAD给出对消息的填充,得出SHA-1(x)得:" << endl;
    403     int i;
    404     for(i = 0;i < result.size();i++)
    405     {
    406         cout << sha1.num_into_message(result[i]);
    407     }
    408     cout << endl;
    409     return 0;
    410 }

    就这样,请多多指教!

  • 相关阅读:
    Flip Game
    Python中apply用法学习【转载】
    Py-lamda表达式学习【转载】
    Py中的多维数组ndarray学习【转载】
    超几何分布与应用【转载】
    Fisher精确检验【转载】
    置换检验(Permutation Test)学习[转载]
    BGD-py实现学习【1】[转载]
    R实现的最小二乘lsfit函数学习
    对生信与计算生物的一点认识[转载]
  • 原文地址:https://www.cnblogs.com/sysu-blackbear/p/3479142.html
Copyright © 2011-2022 走看看