Advertisement
Chris_M_Thomasson

Reverse Iteration Fractal Encryption (all byte values)

Feb 21st, 2016
314
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 4.83 KB | None | 0 0
  1. /*
  2. Original idea by: Juaquin Anderson, in the comments of the following thread:
  3.  
  4. https://plus.google.com/+JuaquinAnderson/posts/L9A3Da8ju3B
  5.  
  6. Implementation by: Chris M. Thomasson
  7. ______________________________________________________________________
  8. */
  9.  
  10. #include <iostream>
  11. #include <complex>
  12. #include <array>
  13. #include <vector>
  14. #include <climits>
  15. #include <cassert>
  16.  
  17.  
  18.  
  19. #define ESP ((iim_float_t)0.000000001)
  20.  
  21.  
  22. typedef double iim_float_t;
  23. typedef std::complex<iim_float_t> complex_t;
  24. typedef std::array<bool, CHAR_BIT> bitchar_t;
  25.  
  26.  
  27. struct forward_ret
  28. {
  29.     complex_t z;
  30.     bitchar_t bc;
  31. };
  32.  
  33.  
  34.  
  35.  
  36. static unsigned char
  37. bitchar_get(
  38.     bitchar_t
  39.     );
  40.  
  41.  
  42. static complex_t
  43. iterate_reverse(
  44.     complex_t,
  45.     complex_t,
  46.     bitchar_t const&
  47.     );
  48.  
  49.  
  50. static forward_ret
  51. iterate_forward(
  52.     complex_t,
  53.     complex_t
  54. );
  55.  
  56.  
  57. unsigned char
  58. bitchar_get(
  59.     bitchar_t bc
  60. ) {
  61.     assert(bc.size() == CHAR_BIT);
  62.  
  63.     unsigned char r = 0;
  64.     unsigned int b = 1;
  65.  
  66.     for (unsigned int i = 0; i < bc.size(); ++i)
  67.     {
  68.         if (bc[i]) r = r | b;
  69.         b = b << 1;
  70.     }
  71.  
  72.     return r;
  73. }
  74.  
  75.  
  76. bitchar_t
  77. bitchar_set(
  78.     unsigned char n
  79. ) {
  80.     bitchar_t r = { false };
  81.     unsigned int b = 1;
  82.  
  83.     for (unsigned int i = 0; i < r.size(); ++i)
  84.     {
  85.         r[i] = (n & b) ? true : false;
  86.         b = b << 1;
  87.     }
  88.  
  89.     return r;
  90. }
  91.  
  92.  
  93. complex_t
  94. iterate_reverse(
  95.     complex_t z,
  96.     complex_t c,
  97.     bitchar_t const& bc
  98. ) {
  99.     assert(bc.size() == CHAR_BIT);
  100.  
  101.     for (std::size_t i = 0; i < CHAR_BIT; ++i)
  102.     {
  103.         complex_t d = z - c;
  104.  
  105.         iim_float_t l = std::abs(d);
  106.         iim_float_t s = std::sqrt(l);
  107.         iim_float_t a = std::atan2(d.imag(), d.real()) / 2.0;
  108.         iim_float_t r = 0;
  109.  
  110.         if (bc[i]) { r = 1; }
  111.         else { r = -1; }
  112.  
  113.         complex_t nz = { r * s * std::cos(a), r * s * std::sin(a) };
  114.  
  115.         if (bc[i] == 1)
  116.         {
  117.             std::cout << "iterate_reverse:[" << i << "]:("
  118.                 << bc[i] << "):(+) = " << nz << std::endl;
  119.         }
  120.  
  121.         else
  122.         {
  123.             std::cout << "iterate_reverse:[" << i << "]:("
  124.                 << bc[i] << "):(-) = " << nz << std::endl;
  125.         }
  126.  
  127.         z = nz;
  128.     }
  129.  
  130.     std::cout << "__________________________________________" << std::endl;
  131.  
  132.     return z;
  133. }
  134.  
  135.  
  136. forward_ret
  137. iterate_forward(
  138.     complex_t z,
  139.     complex_t c
  140. ) {
  141.     forward_ret ret = { { z },{ false } };
  142.  
  143.     std::cout << "iterate_forward:(origin):" << z << std::endl;
  144.  
  145.     for (std::size_t i = 0; i < CHAR_BIT; ++i)
  146.     {
  147.         complex_t pz = ret.z;
  148.         ret.z = ret.z * ret.z + c;
  149.  
  150.         // check for bit on condition
  151.         if (pz.real() > 0.0)
  152.         {
  153.             // turn the proper bit on...
  154.             std::size_t bc_i = CHAR_BIT - (i + 1);
  155.             ret.bc[bc_i] = true;
  156.         }
  157.  
  158.         iim_float_t l = std::abs(ret.z);
  159.  
  160.         if (l < ESP)
  161.         {
  162.             std::cout << "iterate_forward:(term):[" << i << "]: " << ret.z << std::endl;
  163.             break;
  164.         }
  165.  
  166.         std::cout << "iterate_forward:[" << i << "]: " << ret.z << std::endl;
  167.     }
  168.  
  169.     std::cout << "__________________________________________" << std::endl;
  170.  
  171.     return ret;
  172. }
  173.  
  174.  
  175.  
  176.  
  177. int main()
  178. {
  179.     {
  180.         // the secret key c
  181.         complex_t c = { -0.75, 0.09 };
  182.  
  183.         // the origin of iteration z
  184.         complex_t z = { 0.0, 0.0 };
  185.  
  186.         // A bytes to encode, the plaintext pt
  187.         std::cout << std::endl << "**********************************************************"
  188.                   << std::endl;
  189.  
  190.         for (std::size_t pt = 0; pt < UCHAR_MAX + 1; ++pt)
  191.         {
  192.             std::cout << "encoding pt:" << pt << std::endl;
  193.             std::cout << "__________________________________________" << std::endl;
  194.  
  195.             // set pt to bitchar_t
  196.             bitchar_t pt_bits = bitchar_set(pt);
  197.  
  198.             // Our encoded byte point origin, out ciphertext ct
  199.             complex_t ct = iterate_reverse(z, c, pt_bits);
  200.  
  201.             // Our decoded bits and point origin db_z
  202.             forward_ret db_z = iterate_forward(ct, c);
  203.  
  204.             // Our decoded byte db, should be equal to plaintext pt.
  205.             unsigned char db = bitchar_get(db_z.bc);
  206.  
  207.             if (pt != db)
  208.             {
  209.                 std::cout << "pt:" << pt << " != db:" << (int)db << std::endl;
  210.                 std::cin.get();
  211.                 assert(pt == db);
  212.             }
  213.  
  214.             std::cout << "decoded: pt:" << pt << " == db:" << (int)db << std::endl;
  215.  
  216.             std::cout << "**********************************************************"
  217.                       << std::endl;
  218.         }
  219.     }
  220.  
  221.     std::cout << std::endl << "__________________________________________"
  222.         << std::endl << "Program Complete!" << std::endl;
  223.  
  224.     std::cin.get();
  225.  
  226.     return 0;
  227. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement