daily pastebin goal
16%
SHARE
TWEET

Reverse Iteration Fractal Encryption

Chris_M_Thomasson Feb 21st, 2016 95 Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  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 byte to encode, the plaintext pt
  187.         unsigned char pt = 203;
  188.  
  189.         // set pt to bitchar_t
  190.         bitchar_t pt_bits = bitchar_set(pt);
  191.  
  192.         // Our encoded byte point origin, out ciphertext ct
  193.         complex_t ct = iterate_reverse(z, c, pt_bits);
  194.  
  195.         // Our decoded bits and point origin db_z
  196.         forward_ret db_z = iterate_forward(ct, c);
  197.  
  198.         // Our decoded byte db, should be equal to plaintext pt.
  199.         unsigned char db = bitchar_get(db_z.bc);
  200.  
  201.         if (pt != db)
  202.         {
  203.             std::cout << "pt:" << (int)pt << " != db:" << (int)db << std::endl;
  204.             assert(pt == db);
  205.         }
  206.  
  207.         std::cout << "pt:" << (int)pt << " == db:" << (int)db << std::endl;
  208.     }
  209.  
  210.     std::cout << std::endl << "__________________________________________"
  211.         << std::endl << "Program Complete!" << std::endl;
  212.  
  213.     std::cin.get();
  214.  
  215.     return 0;
  216. }
RAW Paste Data
We use cookies for various purposes including analytics. By continuing to use Pastebin, you agree to our use of cookies as described in the Cookies Policy. OK, I Understand
Pastebin PRO 'AUTUMN SPECIAL'!
Get 60% OFF Pastebin PRO accounts!
 
Top