Advertisement
Guest User

chacha

a guest
Feb 27th, 2020
88
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 4.59 KB | None | 0 0
  1. #include <iostream>
  2. #include <fstream>
  3. #include <vector>
  4. #include <cstring>
  5. #include <cstdio>
  6. #include <string>
  7. #include <iomanip>
  8. #include <stdint.h>
  9. using namespace std;
  10.  
  11. uint32_t rotl(uint32_t n, size_t shift)
  12. {return (n << shift) | (n >> (32 - shift));}
  13.  
  14. vector<uint32_t> tmp(4);
  15.  
  16. uint8_t read(istream& s)
  17. {
  18.     return s.get();
  19. }
  20.  
  21. void quarterround(vector<uint32_t> &a){
  22.     a[0]=a[0]+a[1];
  23.     a[3]^=a[0];
  24.     a[3]=rotl(a[3],16);
  25.     a[2]=a[2]+a[3];
  26.     a[1]^=a[2];
  27.     a[1]=rotl(a[1],12);
  28.     a[0]=a[0]+a[1];
  29.     a[3]^=a[0];
  30.     a[3]=rotl(a[3],8);
  31.     a[2]=a[2]+a[3];
  32.     a[1]^=a[2];
  33.     a[1]=rotl(a[1],7);
  34. }
  35.  
  36. void columnround(vector<uint32_t> &a){
  37.     tmp[0]=a[0];tmp[1]=a[4];tmp[2]=a[8];tmp[3]=a[12];
  38.     quarterround(tmp);
  39.     a[0]=tmp[0];a[4]=tmp[1];a[8]=tmp[2];a[12]=tmp[3];
  40.     tmp[0]=a[1];tmp[1]=a[5];tmp[2]=a[9];tmp[3]=a[13];
  41.     quarterround(tmp);
  42.     a[1]=tmp[0];a[5]=tmp[1];a[9]=tmp[2];a[13]=tmp[3];
  43.     tmp[0]=a[2];tmp[1]=a[6];tmp[2]=a[10];tmp[3]=a[14];
  44.     quarterround(tmp);
  45.     a[2]=tmp[0];a[6]=tmp[1];a[10]=tmp[2];a[14]=tmp[3];
  46.     tmp[0]=a[3];tmp[1]=a[7];tmp[2]=a[11];tmp[3]=a[15];
  47.     quarterround(tmp);
  48.     a[3]=tmp[0];a[7]=tmp[1];a[11]=tmp[2];a[15]=tmp[3];
  49. }
  50.  
  51. void diagonalround(vector<uint32_t> &a){
  52.     tmp[0]=a[0];tmp[1]=a[5];tmp[2]=a[10];tmp[3]=a[15];
  53.     quarterround(tmp);
  54.     a[0]=tmp[0];a[5]=tmp[1];a[10]=tmp[2];a[15]=tmp[3];
  55.     tmp[0]=a[1];tmp[1]=a[6];tmp[2]=a[11];tmp[3]=a[12];
  56.     quarterround(tmp);
  57.     a[1]=tmp[0];a[6]=tmp[1];a[11]=tmp[2];a[12]=tmp[3];
  58.     tmp[0]=a[2];tmp[1]=a[7];tmp[2]=a[8];tmp[3]=a[13];
  59.     quarterround(tmp);
  60.     a[2]=tmp[0];a[7]=tmp[1];a[8]=tmp[2];a[13]=tmp[3];
  61.     tmp[0]=a[3];tmp[1]=a[4];tmp[2]=a[9];tmp[3]=a[14];
  62.     quarterround(tmp);
  63.     a[3]=tmp[0];a[4]=tmp[1];a[9]=tmp[2];a[14]=tmp[3];
  64. }
  65.  
  66. void doubleround(vector<uint32_t> &a){
  67.     columnround(a);
  68.     diagonalround(a);
  69. }
  70.  
  71. uint32_t u32(uint8_t b[4]){
  72.   uint32_t u;
  73.   u = b[0];
  74.   u = (u  << 8) + b[1];
  75.   u = (u  << 8) + b[2];
  76.   u = (u  << 8) + b[3];
  77.   return u;
  78. }
  79.  
  80. int main(){
  81.     int i1;
  82.     uint8_t b[4];
  83.     vector<uint8_t> key(32);
  84.     vector<uint8_t> nonce(12);
  85.     vector<uint32_t> x(16);
  86.     vector<uint32_t> y(16);
  87.     vector<uint8_t> keystream(114);
  88.     vector<uint8_t> input(114);
  89.     vector<uint8_t> output(114);
  90.     uint32_t k = 0x00000001;
  91.     ifstream in("C:\\Users\\lesha\\key.bin",ios::binary|ios::in);
  92.     if (in.is_open())
  93.     {
  94.         for (int i=0; i<32; i++){
  95.             in.read((char*)&key[i],sizeof(key[i]));
  96.         }
  97.     }
  98.     for (int i=0; i<32; i++){
  99.         cout<<hex<<(int)key[i]<<endl;
  100.     }
  101.     in.close();
  102.     ifstream in1("C:\\Users\\lesha\\nonce.bin",ios::binary|ios::in);
  103.     if (in1.is_open())
  104.     {
  105.         for (int i=0; i<12; i++){
  106.             in1.read((char*)&nonce[i],sizeof(nonce[i]));
  107.         }
  108.     }
  109.     in1.close();
  110.  
  111.     x[0]=0x61707865; x[1]=0x3320646e; x[2]=0x79622d32; x[3]=0x6b206574; x[13]=0x09000000; x[14]=0x4a000000; x[15]=0x00000000;
  112.     for (int i=0; i<8; i++){
  113.         for (int j=0; j<4; j++){
  114.             b[j]=key[4*i+3-j];
  115.         }
  116.         x[4+i]=u32(b);
  117.     }
  118.     for (int i=0; i<3; i++){
  119.         for (int j=0; j<4; j++){
  120.             b[j]=nonce[4*i+3-j];
  121.         }
  122.         x[13+i]=u32(b);
  123.     }
  124.     for (int i=0; i<16; i++){
  125.         y[i]=x[i];
  126.     }
  127.     ifstream in2;
  128.     in2.open("C:\\Users\\lesha\\input.bin",ios::binary|ios::in);
  129.     if (in2.is_open()){
  130.         for (int i=0; i<114; i++){
  131.             in2.read((char*)&input[i],sizeof(input[i]));
  132.         }
  133.     }
  134.     in2.close();
  135.     ofstream out("C:\\Users\\lesha\\output.bin",ios::binary|ios::in);
  136.     for (int i=0; i<114/64+1; i++){
  137.         for (int j=0; j<16; j++){
  138.             x[j]=y[j];
  139.         }
  140.         x[12]=k;
  141.         for (int j=0; j<16; j++){
  142.             y[j]=x[j];
  143.         }
  144.         for (int i=0; i<4; i++){
  145.             for (int j=0; j<4; j++){
  146.                 cout<<hex<<(uint32_t)x[4*i+j]<<" ";
  147.             }
  148.             cout<<endl;
  149.         }
  150.         cout<<endl;
  151.         for (int j=0; j<10; j++){
  152.             doubleround(x);
  153.         }
  154.         for (int j=0; j<16; j++){
  155.             x[j]+=y[j];
  156.         }
  157.         for (int i=0; i<4; i++){
  158.             for (int j=0; j<4; j++){
  159.                 cout<<hex<<(uint32_t)x[4*i+j]<<" ";
  160.             }
  161.             cout<<endl;
  162.         }
  163.         cout<<endl;
  164.         for (int j=0; j<64; j++){
  165.             if(64*i+j<114){
  166.                 output[j+64*i] = input[j+64*i] ^ (uint8_t)(x[j/4]>>(j%4)*8);
  167.                 out.write((char*)&output[j+64*i], sizeof(output[j+64*i]));
  168.             }
  169.         }
  170.         k++;
  171.     }
  172.     out.close();
  173.     return 0;
  174. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement