Advertisement
yerseg

Untitled

Feb 28th, 2020
200
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 3.61 KB | None | 0 0
  1. #include <fstream>
  2. #include <vector>
  3. #include <sha.h>
  4. #include <hex.h>
  5. #include <randpool.h>
  6.  
  7. using byte = unsigned char;
  8. using ByteArray = std::vector<byte>; //ДОЛГО, но не надо парить мозги
  9.  
  10. #define OPAD 0x5C
  11. #define IPAD 0x36
  12. #define BITMASK 0x1F
  13. #define KEYSCOUNT 1000
  14.  
  15.  
  16. ByteArray StringToByteArray(std::string str)
  17. {
  18.     ByteArray byteArray(str.size());
  19.     for (int i = 0; i < str.size(); i++)
  20.     {
  21.         byteArray[i] = static_cast<byte>(str[i]);
  22.     }
  23.     return byteArray;
  24. }
  25.  
  26. ByteArray CArrayToByteArray(byte* bytePtr, size_t length)
  27. {
  28.     ByteArray byteArray(length);
  29.     for (int i = 0; i < length; i++)
  30.     {
  31.         byteArray[i] = bytePtr[i];
  32.     }
  33.     return byteArray;
  34. }
  35.  
  36. ByteArray Sha256(ByteArray data)
  37. {
  38.     CryptoPP::SHA256 hash;
  39.     byte digest[CryptoPP::SHA256::DIGESTSIZE];
  40.     hash.CalculateDigest(digest, data.data(), data.size());
  41.     return CArrayToByteArray(digest, CryptoPP::SHA256::DIGESTSIZE);
  42. }
  43.  
  44. ByteArray HmacSha256(ByteArray key, ByteArray data)
  45. {
  46.     if (key.size() > CryptoPP::SHA256::BLOCKSIZE)
  47.         key = Sha256(key);
  48.     if (key.size() < CryptoPP::SHA256::BLOCKSIZE)
  49.         key.insert(key.end(), CryptoPP::SHA256::BLOCKSIZE - key.size(), 0x0);
  50.  
  51.     ByteArray firstOperand = key;
  52.     ByteArray secondOperand = key;
  53.  
  54.     for (int i = 0; i < CryptoPP::SHA256::BLOCKSIZE; i++)
  55.     {
  56.         firstOperand[i] ^= OPAD;
  57.         secondOperand[i] ^= IPAD;
  58.     }
  59.  
  60.     secondOperand.insert(secondOperand.end(), data.begin(), data.end());
  61.     secondOperand = Sha256(secondOperand);
  62.     firstOperand.insert(firstOperand.end(), secondOperand.begin(), secondOperand.end());
  63.     ByteArray hmac = Sha256(firstOperand);
  64.     return hmac;
  65. }
  66.  
  67. ByteArray HkdfExtract(ByteArray xts, ByteArray skm)
  68. {
  69.     return HmacSha256(xts, skm);
  70. }
  71.  
  72. ByteArray HkdfExpand(ByteArray prk, ByteArray lastKey, ByteArray ctx, int i)
  73. {
  74.     lastKey.insert(lastKey.end(), ctx.begin(), ctx.end());
  75.     lastKey.push_back(i);
  76.     return HmacSha256(prk, lastKey);
  77. }
  78.  
  79. ByteArray Pbkdf2(ByteArray p, ByteArray s, int c, int keyLen)
  80. {
  81.     int len = keyLen / CryptoPP::SHA256::DIGESTSIZE;
  82.     ByteArray key;
  83.     CryptoPP::RandomPool prng;
  84.     byte output[CryptoPP::SHA256::DIGESTSIZE];
  85.     for (int i = 0; i < len; i++)
  86.     {
  87.         ByteArray u(CryptoPP::SHA256::DIGESTSIZE, 0);
  88.         prng.GenerateBlock(output, CryptoPP::SHA256::DIGESTSIZE);
  89.         ByteArray xts = CArrayToByteArray(output, 32);
  90.         ByteArray _i(sizeof(i), 0);
  91.         for (int l = 0; l < _i.size(); l++)
  92.             _i[l] = (i >> (8 * l)) & 0xFF;
  93.         xts.insert(xts.end(), _i.begin(), _i.end());
  94.         for (int j = 0; j < c; j++)
  95.         {
  96.            
  97.             ByteArray new_u = HmacSha256(p, xts);
  98.         }
  99.     }
  100. }
  101.  
  102. int main()
  103. {
  104.     std::ifstream in("\\weather.json", std::ios::in);
  105.     std::string data;
  106.     std::getline(in, data);
  107.     in.close();
  108.  
  109.     std::vector<ByteArray> keyArrayHkdf;
  110.     ByteArray ctx = { 'y', 'e', 'r', 's', 'e', 'g' };
  111.     CryptoPP::RandomPool prng;
  112.     byte output[CryptoPP::SHA256::DIGESTSIZE];
  113.    
  114.     for (int i = 0; i < KEYSCOUNT; i++)
  115.     {
  116.         prng.GenerateBlock(output, CryptoPP::SHA256::DIGESTSIZE);
  117.         ByteArray xts = CArrayToByteArray(output, 32);
  118.         ByteArray prk = HkdfExtract(xts, StringToByteArray(data));
  119.         if (i == 0)
  120.             keyArrayHkdf.push_back(HkdfExpand(prk, { 0x0 }, ctx, i));
  121.         else
  122.             keyArrayHkdf.push_back(HkdfExpand(prk, keyArrayHkdf[i - 1], ctx, i));
  123.     }
  124.    
  125.     std::ofstream out;
  126.     out.open("keys.txt");
  127.    
  128.     for (auto i = 0; i < KEYSCOUNT; i++)
  129.     {
  130.         byte key = keyArrayHkdf[i][CryptoPP::SHA256::DIGESTSIZE - 1];
  131.         out << (key & BITMASK);
  132.         out << std::endl;
  133.     }
  134.    
  135.     out.close();
  136.    
  137.     return 0;
  138. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement