Advertisement
pokecon

PKM Encryption

Dec 19th, 2012
72
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 10.44 KB | None | 0 0
  1. #include <stdio.h>
  2.  
  3. #include <stdlib.h>
  4.  
  5. #include <iostream>
  6.  
  7. #include <fstream>
  8.  
  9. using namespace std;
  10.  
  11. unsigned int seed;
  12.  
  13. void setseed(unsigned int newSeed){
  14.  
  15.     seed = newSeed;
  16.  
  17. }
  18.  
  19. unsigned int srand(){
  20.  
  21.     seed = ((0x41c64e6d * seed + 0x6073)) & 4294967295L;
  22.  
  23.     return seed >> 16;
  24.  
  25. }
  26.  
  27.  
  28.  
  29. unsigned int toUInt32(unsigned char* input, int offset){
  30.  
  31.     union{
  32.  
  33.         unsigned int num;
  34.  
  35.         unsigned char bytes[4];
  36.  
  37.     } obj;
  38.  
  39.     for(int i = offset; i < offset + 4; i++)
  40.  
  41.         obj.bytes[i - offset] = input[i];
  42.  
  43.     return obj.num;
  44.  
  45. }
  46.  
  47.  
  48.  
  49. unsigned short toUInt16 (unsigned char* input, int offset){
  50.  
  51.     union{
  52.  
  53.         unsigned short num;
  54.  
  55.         unsigned char bytes[2];
  56.  
  57.     } obj;
  58.  
  59.     for(int i = offset; i < offset + 2; i++)
  60.  
  61.         obj.bytes[i - offset] = input[i];
  62.  
  63.     return obj.num;
  64.  
  65. }
  66.  
  67.  
  68.  
  69. unsigned char* encrypt(unsigned char* pks2)
  70.  
  71. {
  72.  
  73.     unsigned int pid = 0;
  74.  
  75.     unsigned short checksum = 0;
  76.  
  77.     pid = toUInt32(pks2, 0);
  78.  
  79.     checksum = toUInt16(pks2, 6);
  80.  
  81.     int order = (pid >> (13) & 31) % 24;
  82.  
  83.     char firstblock, secondblock, thirdblock, fourthblock;
  84.  
  85.  
  86.  
  87.     switch (order) {
  88.  
  89.         case 0:
  90.  
  91.             firstblock = 'A';
  92.  
  93.             secondblock = 'B';
  94.  
  95.             thirdblock = 'C';
  96.  
  97.             fourthblock = 'D';
  98.  
  99.             break;
  100.  
  101.         case 1:
  102.  
  103.             firstblock = 'A';
  104.  
  105.             secondblock = 'B';
  106.  
  107.             thirdblock = 'D';
  108.  
  109.             fourthblock = 'C';
  110.  
  111.             break;
  112.  
  113.         case 2:
  114.  
  115.             firstblock = 'A';
  116.  
  117.             secondblock = 'C';
  118.  
  119.             thirdblock = 'B';
  120.  
  121.             fourthblock = 'D';
  122.  
  123.             break;
  124.  
  125.         case 3:
  126.  
  127.             firstblock = 'A';
  128.  
  129.             secondblock = 'C';
  130.  
  131.             thirdblock = 'D';
  132.  
  133.             fourthblock = 'B';
  134.  
  135.             break;
  136.  
  137.         case 4:
  138.  
  139.             firstblock = 'A';
  140.  
  141.             secondblock = 'D';
  142.  
  143.             thirdblock = 'B';
  144.  
  145.             fourthblock = 'C';
  146.  
  147.             break;
  148.  
  149.         case 5:
  150.  
  151.             firstblock = 'A';
  152.  
  153.             secondblock = 'D';
  154.  
  155.             thirdblock = 'C';
  156.  
  157.             fourthblock = 'B';
  158.  
  159.             break;
  160.  
  161.         case 6:
  162.  
  163.             firstblock = 'B';
  164.  
  165.             secondblock = 'A';
  166.  
  167.             thirdblock = 'C';
  168.  
  169.             fourthblock = 'D';
  170.  
  171.             break;
  172.  
  173.         case 7:
  174.  
  175.             firstblock = 'B';
  176.  
  177.             secondblock = 'A';
  178.  
  179.             thirdblock = 'D';
  180.  
  181.             fourthblock = 'C';
  182.  
  183.             break;
  184.  
  185.         case 8:
  186.  
  187.             firstblock = 'B';
  188.  
  189.             secondblock = 'C';
  190.  
  191.             thirdblock = 'A';
  192.  
  193.             fourthblock = 'D';
  194.  
  195.             break;
  196.  
  197.         case 9:
  198.  
  199.             firstblock = 'B';
  200.  
  201.             secondblock = 'C';
  202.  
  203.             thirdblock = 'D';
  204.  
  205.             fourthblock = 'A';
  206.  
  207.             break;
  208.  
  209.         case 10:
  210.  
  211.             firstblock = 'B';
  212.  
  213.             secondblock = 'D';
  214.  
  215.             thirdblock = 'A';
  216.  
  217.             fourthblock = 'C';
  218.  
  219.             break;
  220.  
  221.         case 11:
  222.  
  223.             firstblock = 'B';
  224.  
  225.             secondblock = 'D';
  226.  
  227.             thirdblock = 'C';
  228.  
  229.             fourthblock = 'A';
  230.  
  231.             break;
  232.  
  233.         case 12:
  234.  
  235.             firstblock = 'C';
  236.  
  237.             secondblock = 'A';
  238.  
  239.             thirdblock = 'B';
  240.  
  241.             fourthblock = 'D';
  242.  
  243.             break;
  244.  
  245.         case 13:
  246.  
  247.             firstblock = 'C';
  248.  
  249.             secondblock = 'A';
  250.  
  251.             thirdblock = 'D';
  252.  
  253.             fourthblock = 'B';
  254.  
  255.             break;
  256.  
  257.         case 14:
  258.  
  259.             firstblock = 'C';
  260.  
  261.             secondblock = 'B';
  262.  
  263.             thirdblock = 'A';
  264.  
  265.             fourthblock = 'D';
  266.  
  267.             break;
  268.  
  269.         case 15:
  270.  
  271.             firstblock = 'C';
  272.  
  273.             secondblock = 'B';
  274.  
  275.             thirdblock = 'D';
  276.  
  277.             fourthblock = 'A';
  278.  
  279.             break;
  280.  
  281.         case 16:
  282.  
  283.             firstblock = 'C';
  284.  
  285.             secondblock = 'D';
  286.  
  287.             thirdblock = 'A';
  288.  
  289.             fourthblock = 'B';
  290.  
  291.             break;
  292.  
  293.         case 17:
  294.  
  295.             firstblock = 'C';
  296.  
  297.             secondblock = 'D';
  298.  
  299.             thirdblock = 'B';
  300.  
  301.             fourthblock = 'A';
  302.  
  303.             break;
  304.  
  305.         case 18:
  306.  
  307.             firstblock = 'D';
  308.  
  309.             secondblock = 'A';
  310.  
  311.             thirdblock = 'B';
  312.  
  313.             fourthblock = 'C';
  314.  
  315.             break;
  316.  
  317.         case 19:
  318.  
  319.             firstblock = 'D';
  320.  
  321.             secondblock = 'A';
  322.  
  323.             thirdblock = 'C';
  324.  
  325.             fourthblock = 'B';
  326.  
  327.             break;
  328.  
  329.         case 20:
  330.  
  331.             firstblock = 'D';
  332.  
  333.             secondblock = 'B';
  334.  
  335.             thirdblock = 'A';
  336.  
  337.             fourthblock = 'C';
  338.  
  339.             break;
  340.  
  341.         case 21:
  342.  
  343.             firstblock = 'D';
  344.  
  345.             secondblock = 'B';
  346.  
  347.             thirdblock = 'C';
  348.  
  349.             fourthblock = 'A';
  350.  
  351.             break;
  352.  
  353.         case 22:
  354.  
  355.             firstblock = 'D';
  356.  
  357.             secondblock = 'C';
  358.  
  359.             thirdblock = 'A';
  360.  
  361.             fourthblock = 'B';
  362.  
  363.             break;
  364.  
  365.         case 23:
  366.  
  367.             firstblock = 'D';
  368.  
  369.             secondblock = 'C';
  370.  
  371.             thirdblock = 'B';
  372.  
  373.             fourthblock = 'A';
  374.  
  375.             break;
  376.  
  377.     }
  378.  
  379.  
  380.  
  381.     // BLOCK A
  382.  
  383.     int z = 0;
  384.  
  385.     int v = 8;
  386.  
  387.     unsigned short* blocka = new unsigned short[17];
  388.  
  389.     while (z < 16) {
  390.  
  391.         blocka[z] = toUInt16(pks2, v);
  392.  
  393.         z = z + 1;
  394.  
  395.         v = v + 2;
  396.  
  397.     }
  398.  
  399.  
  400.  
  401.     // BLOCK B
  402.  
  403.     z = 0;
  404.  
  405.     v = 40;
  406.  
  407.     unsigned short* blockb = new unsigned short[17];
  408.  
  409.     while (z < 16) {
  410.  
  411.         blockb[z] = toUInt16(pks2, v);
  412.  
  413.         z = z + 1;
  414.  
  415.         v = v + 2;
  416.  
  417.     }
  418.  
  419.  
  420.  
  421.     // BLOCK C
  422.  
  423.     z = 0;
  424.  
  425.     v = 72;
  426.  
  427.     unsigned short* blockc = new unsigned short[17];
  428.  
  429.     while (z < 16) {
  430.  
  431.         blockc[z] = toUInt16(pks2, v);
  432.  
  433.         z = z + 1;
  434.  
  435.         v = v + 2;
  436.  
  437.     }
  438.  
  439.  
  440.  
  441.     // BLOCK D
  442.  
  443.     z = 0;
  444.  
  445.     unsigned short* blockd = new unsigned short[17];
  446.  
  447.     v = 104;
  448.  
  449.     while (z < 16) {
  450.  
  451.         blockd[z] = toUInt16(pks2, v);
  452.  
  453.         z = z + 1;
  454.  
  455.         v = v + 2;
  456.  
  457.     }
  458.  
  459.  
  460.  
  461.     setseed(checksum);
  462.  
  463.  
  464.  
  465.     // BYTER (FIRSTBLOCK)
  466.  
  467.     unsigned short* byter = new unsigned short[17];
  468.  
  469.     z = 0;
  470.  
  471.     v = 8;
  472.  
  473.     switch (firstblock) {
  474.  
  475.         case 'A':
  476.  
  477.             while (z < 16) {
  478.  
  479.                 byter[z] = blocka[z] ^ srand();
  480.  
  481.                 z = z + 1;
  482.  
  483.             }
  484.  
  485.             break;
  486.  
  487.         case 'B':
  488.  
  489.             while (z < 16) {
  490.  
  491.                 byter[z] = blockb[z] ^ srand();
  492.  
  493.                 z = z + 1;
  494.  
  495.             }
  496.  
  497.             break;
  498.  
  499.         case 'C':
  500.  
  501.             while (z < 16) {
  502.  
  503.                 byter[z] = blockc[z] ^ srand();
  504.  
  505.                 z = z + 1;
  506.  
  507.             }
  508.  
  509.             break;
  510.  
  511.         case 'D':
  512.  
  513.             while (z < 16) {
  514.  
  515.                 byter[z] = blockd[z] ^ srand();
  516.  
  517.                 z = z + 1;
  518.  
  519.             }
  520.  
  521.             break;
  522.  
  523.     }
  524.  
  525.     z = 0;
  526.  
  527.     v = 8;
  528.  
  529.     while (z < 16) {
  530.  
  531.         pks2[v] = byter[z] & 255;
  532.  
  533.         pks2[v + 1] = byter[z] >> 8;
  534.  
  535.         z = z + 1;
  536.  
  537.         v = v + 2;
  538.  
  539.     }
  540.  
  541.  
  542.  
  543.     // SECONDBLOCK
  544.  
  545.     z = 0;
  546.  
  547.     v = 40;
  548.  
  549.     switch (secondblock) {
  550.  
  551.         case 'A':
  552.  
  553.             while (z < 16) {
  554.  
  555.                 byter[z] = blocka[z] ^ srand();
  556.  
  557.                 z = z + 1;
  558.  
  559.             }
  560.  
  561.             break;
  562.  
  563.         case 'B':
  564.  
  565.             while (z < 16) {
  566.  
  567.                 byter[z] = blockb[z] ^ srand();
  568.  
  569.                 z = z + 1;
  570.  
  571.             }
  572.  
  573.             break;
  574.  
  575.         case 'C':
  576.  
  577.             while (z < 16) {
  578.  
  579.                 byter[z] = blockc[z] ^ srand();
  580.  
  581.                 z = z + 1;
  582.  
  583.             }
  584.  
  585.             break;
  586.  
  587.         case 'D':
  588.  
  589.             while (z < 16) {
  590.  
  591.                 byter[z] = blockd[z] ^ srand();
  592.  
  593.                 z = z + 1;
  594.  
  595.             }
  596.  
  597.             break;
  598.  
  599.     }
  600.  
  601.     z = 0;
  602.  
  603.     while (z < 16) {
  604.  
  605.         pks2[v] = byter[z] & 255;
  606.  
  607.         pks2[v + 1] = byter[z] >> 8;
  608.  
  609.         z = z + 1;
  610.  
  611.         v = v + 2;
  612.  
  613.     }
  614.  
  615.  
  616.  
  617.     // THIRDBLOCK
  618.  
  619.     z = 0;
  620.  
  621.     v = 72;
  622.  
  623.     switch (thirdblock) {
  624.  
  625.         case 'A':
  626.  
  627.             while (z < 16) {
  628.  
  629.                 byter[z] = blocka[z] ^ srand();
  630.  
  631.                 z = z + 1;
  632.  
  633.             }
  634.  
  635.             break;
  636.  
  637.         case 'B':
  638.  
  639.             while (z < 16) {
  640.  
  641.                 byter[z] = blockb[z] ^ srand();
  642.  
  643.                 z = z + 1;
  644.  
  645.             }
  646.  
  647.             break;
  648.  
  649.         case 'C':
  650.  
  651.             while (z < 16) {
  652.  
  653.                 byter[z] = blockc[z] ^ srand();
  654.  
  655.                 z = z + 1;
  656.  
  657.             }
  658.  
  659.             break;
  660.  
  661.         case 'D':
  662.  
  663.             while (z < 16) {
  664.  
  665.                 byter[z] = blockd[z] ^ srand();
  666.  
  667.                 z = z + 1;
  668.  
  669.             }
  670.  
  671.             break;
  672.  
  673.     }
  674.  
  675.     z = 0;
  676.  
  677.     while (z < 16) {
  678.  
  679.         pks2[v] = byter[z] & 255;
  680.  
  681.         pks2[v + 1] = byter[z] >> 8;
  682.  
  683.         z = z + 1;
  684.  
  685.         v = v + 2;
  686.  
  687.     }
  688.  
  689.  
  690.  
  691.     // FOURTHBLOCK
  692.  
  693.     z = 0;
  694.  
  695.     v = 104;
  696.  
  697.     switch (fourthblock) {
  698.  
  699.         case 'A':
  700.  
  701.             while (z < 16) {
  702.  
  703.                 byter[z] = blocka[z] ^ srand();
  704.  
  705.                 z = z + 1;
  706.  
  707.             }
  708.  
  709.             break;
  710.  
  711.         case 'B':
  712.  
  713.             while (z < 16) {
  714.  
  715.                 byter[z] = blockb[z] ^ srand();
  716.  
  717.                 z = z + 1;
  718.  
  719.             }
  720.  
  721.             break;
  722.  
  723.         case 'C':
  724.  
  725.             while (z < 16) {
  726.  
  727.                 byter[z] = blockc[z] ^ srand();
  728.  
  729.                 z = z + 1;
  730.  
  731.             }
  732.  
  733.             break;
  734.  
  735.         case 'D':
  736.  
  737.             while (z < 16) {
  738.  
  739.                 byter[z] = blockd[z] ^ srand();
  740.  
  741.                 z = z + 1;
  742.  
  743.             }
  744.  
  745.             break;
  746.  
  747.     }
  748.  
  749.     z = 0;
  750.  
  751.     while (z < 16) {
  752.  
  753.         pks2[v] = byter[z] & 255;
  754.  
  755.         pks2[v + 1] = byter[z] >> 8;
  756.  
  757.         z = z + 1;
  758.  
  759.         v = v + 2;
  760.  
  761.     }
  762.  
  763.  
  764.  
  765.     return pks2;
  766.  
  767. }
  768.  
  769. int main(int argc, char* argv[])
  770.  
  771. {
  772.  
  773.     if(sizeof(int) != 4){
  774.  
  775.         printf("The algorithm is incompatible with the system.");
  776.  
  777.         exit(-1);
  778.  
  779.     }
  780.  
  781.     ifstream file (argv[1]);
  782.  
  783.     unsigned char* input = new unsigned char[136];
  784.  
  785.     file.read((char*)input, 136);
  786.  
  787.     unsigned char* output = encrypt(input);
  788.  
  789.     /*for(int i = 0; i < 136; i++){
  790.  
  791.         printf("%c", output[i]);
  792.  
  793.     }*/
  794.  
  795.     ofstream file2 (argv[2], ios::out | ios::binary);
  796.  
  797.     file2.write((char*)output, 136);
  798.  
  799.     file2.close();
  800.  
  801.     return 0;
  802.  
  803. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement