#include #include #include using namespace std; string sm3pad(const string &str)//Ìî³ä { string astr=str; astr+=(char)(0x80); while ((astr.size()<<3) % 512 != 448) { astr+=(char)0; } for (int i=56;i>=0;i-=8) { astr+=(char)((str.size()<<3)>>i); } return astr; } unsigned ROTL(const unsigned &word,const int &num)//wordÑ­»·×óÒÆnumλ { return (word<>(32-num)); } unsigned T(const unsigned &j) { if (j<=15) return 0x79cc4519; else return 0x7a879d8a; } unsigned FF(const unsigned &X,const unsigned &Y,const unsigned &Z,const unsigned &j ) { if (j<=15) return (X^Y^Z); else return (X&Y)|(X&Z)|(Y&Z); } unsigned GG(const unsigned &X,const unsigned &Y,const unsigned &Z,const unsigned &j ) { if (j<=15) return (X^Y^Z); else return (X&Y)|((~X)&Z); } unsigned P0(const unsigned &X) { return X^ROTL(X,9)^ROTL(X,17); } unsigned P1(const unsigned &X) { return X^ROTL(X,15)^ROTL(X,23); } string sm3(const string &str) { string strs=str; unsigned V[8]={0x7380166f,0x4914b2b9,0x172442d7,0xda8a0600,0xa96f30bc,0x163138aa,0xe38dee4d,0xb0fb0e4e}; unsigned W[68]={0}; unsigned W1[64]={0}; for (int i=0;i>strs; return strs; } int main() { string str; cout<<"input a string:"<>str; //str=""; for (int i=0;i<1000000;i++) { str+='a'; } string astr=sm3pad(str); cout<<"SM3:"<