Advertisement
Chris_M_Thomasson

Funny Fractal Encryption c++11 testing 123...

Nov 12th, 2015
193
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 6.03 KB | None | 0 0
  1. /*
  2. Funny Fractal Encryption (in progress)...
  3. by: Chris M. Thomasson
  4. __________________________________________________________________*/
  5.  
  6.  
  7.  
  8. #include <cstdlib>
  9. #include <climits>
  10. #include <cstdio>
  11. #include <cmath>
  12. #include <string>
  13. #include <complex>
  14. #include <iostream>
  15. #include <algorithm>
  16.  
  17.  
  18.  
  19.  
  20.  
  21.  
  22. namespace fractal
  23. {
  24.  
  25. #define FRACTAL_PREC ".17"
  26.  
  27. typedef std::complex<double> complex_t;
  28.  
  29.  
  30. static double round(double n)
  31. {
  32.     if (n > 0.0)
  33.     {
  34.         n = n + 0.5;
  35.     }
  36.  
  37.     else
  38.     {
  39.         n = n - 0.5;
  40.     }
  41.  
  42.     return n;
  43. }
  44.  
  45. struct grid
  46. {
  47.     std::size_t m_width;
  48.     std::size_t m_height;
  49. };
  50.  
  51.  
  52. struct axes
  53. {
  54.     double m_xmin;
  55.     double m_xmax;
  56.     double m_ymin;
  57.     double m_ymax;
  58.  
  59.     double width() const
  60.     {
  61.         return m_xmax - m_xmin;
  62.     }
  63.  
  64.     double height() const
  65.     {
  66.         return m_ymax - m_ymin;
  67.     }
  68. };
  69.  
  70.  
  71. struct iter_result
  72. {
  73.     std::size_t m_iters;
  74.     double m_orbit_trap;
  75.     complex_t m_z;
  76. };
  77.  
  78. struct iter_settings
  79. {
  80.     grid m_grid;
  81.     axes m_axes;
  82.     std::size_t m_iters;
  83.     complex_t m_jp[3];
  84. };
  85.  
  86. struct iter_callback_base
  87. {
  88.     virtual bool callback(std::size_t x, std::size_t y, complex_t const c, iter_settings const& isets, iter_result& ires) = 0;
  89. };
  90.  
  91.  
  92. // Iterate 3 points in triple mixed Julia mode...
  93. static bool iterate_point(complex_t const c, iter_settings const& isets, iter_result& ires)
  94. {
  95.     complex_t z = c;
  96.  
  97.     complex_t scale(1.0, 0.0);
  98.  
  99.     double orbit_trap = 99999999999999999.0;
  100.  
  101.     std::size_t jstep = 0;
  102.  
  103.     double escape =
  104.         std::abs(2.0 +
  105.             isets.m_jp[0].real() + isets.m_jp[0].imag() +
  106.             isets.m_jp[1].real() + isets.m_jp[1].imag() +
  107.             isets.m_jp[2].real() + isets.m_jp[2].imag()
  108.         );
  109.  
  110.     for (std::size_t i = 1; i < isets.m_iters + 1; ++i)
  111.     {
  112.         z = z * z;
  113.  
  114.         if (jstep == 0)
  115.         {
  116.             z = z + isets.m_jp[0];
  117.         }
  118.  
  119.  
  120.         else if (jstep == 1)
  121.         {
  122.             z = z + isets.m_jp[1];
  123.         }
  124.  
  125.         else
  126.         {
  127.             z = z + isets.m_jp[2];
  128.         }
  129.  
  130.         z = z * scale;
  131.  
  132.         jstep = (jstep + 1) % 3;
  133.  
  134.         double d = std::sqrt(z.real() * z.real() + z.imag() * z.imag());
  135.  
  136.         if (d != 0)
  137.         {
  138.             orbit_trap = std::min(orbit_trap, d);
  139.         }
  140.  
  141.         else
  142.         {
  143.             orbit_trap = std::min(orbit_trap, 0.1);
  144.         }
  145.  
  146.         if (d > escape)
  147.         {
  148.             ires.m_iters = i;
  149.             ires.m_orbit_trap = orbit_trap;
  150.             ires.m_z = z;
  151.  
  152.             return false;
  153.         }
  154.     }
  155.  
  156.     ires.m_iters = isets.m_iters;
  157.     ires.m_orbit_trap = orbit_trap;
  158.     ires.m_z = z;
  159.  
  160.     return true;
  161. }
  162.  
  163. // Iterare the whole axes in `isets' using a callback for each mapped complex number
  164. static void iterate_plane(iter_callback_base& callback, iter_settings const& isets, iter_result& ires)
  165. {
  166.     complex_t c(0.0, 0.0);
  167.     double xstep = isets.m_axes.width() / (isets.m_grid.m_width - 1);
  168.     double ystep = isets.m_axes.height() / (isets.m_grid.m_height - 1);
  169.  
  170.     for (std::size_t y = 0; y < isets.m_grid.m_height; ++y)
  171.     {
  172.         c.imag(isets.m_axes.m_ymax - ystep * y);
  173.  
  174.         for (std::size_t x = 0; x < isets.m_grid.m_width; ++x)
  175.         {
  176.             c.real(isets.m_axes.m_xmin + xstep * x);
  177.  
  178.             if (! callback.callback(x, y, c, isets, ires))
  179.             {
  180.                 return;
  181.             }
  182.         }
  183.     }
  184. }
  185.  
  186.  
  187. }
  188.  
  189.  
  190. namespace ffe
  191. {
  192.  
  193. #define FFE_LB "\r\n"
  194. #define FFE_BYTE_SZ (UCHAR_MAX + 1)
  195.  
  196.  
  197. struct private_fractal : public fractal::iter_callback_base
  198. {
  199.     bool callback(std::size_t x, std::size_t y, fractal::complex_t const c, fractal::iter_settings const& isets, fractal::iter_result& ires)
  200.     {
  201.         double cipher_mutator_real = 0.0;
  202.         fractal::iterate_point(c, isets, ires);
  203.  
  204.         if (isets.m_iters != ires.m_iters)
  205.         {
  206.             cipher_mutator_real = ires.m_iters * ires.m_orbit_trap * (ires.m_z.real() + ires.m_z.imag());
  207.             cipher_mutator_real *= 5134.0413;
  208.         }
  209.  
  210.         else
  211.         {
  212.             cipher_mutator_real = ires.m_iters * ires.m_orbit_trap * (ires.m_z.real() + ires.m_z.imag());
  213.             cipher_mutator_real *= 178654.681;
  214.         }
  215.  
  216.         std::size_t cipher_mutator = ((std::size_t)std::abs(fractal::round(cipher_mutator_real))) % FFE_BYTE_SZ;
  217.  
  218.         // Encrypt the 9 A's in the plaintext. 65 = A in decimal wrt ASCII
  219.         std::size_t cipher_mutation = (65 + cipher_mutator) % FFE_BYTE_SZ;
  220.  
  221.         std::cout << cipher_mutation << " ";
  222.  
  223.         return true;
  224.     }
  225. };
  226.  
  227.  
  228.  
  229. }
  230.  
  231.  
  232.  
  233.  
  234.  
  235.  
  236.  
  237. namespace app
  238. {
  239.  
  240. struct ascii_fractal : public fractal::iter_callback_base
  241. {
  242.     bool callback(
  243.         std::size_t x, std::size_t y,
  244.         fractal::complex_t const c,
  245.         fractal::iter_settings const& isets,
  246.         fractal::iter_result& ires
  247.     ){
  248.         if (! fractal::iterate_point(c, isets, ires))
  249.         {
  250.             std::cout << "-";
  251.         }
  252.  
  253.         else
  254.         {
  255.             std::cout << "*";
  256.         }
  257.  
  258.         return true;
  259.     }
  260. };
  261.  
  262.  
  263. }
  264.  
  265.  
  266.  
  267.  
  268. int main()
  269. {
  270.     {
  271.         std::string plaintext = "AAAAAAAAA";
  272.  
  273.         std::size_t D = ((std::size_t)(std::ceil(std::sqrt(plaintext.length())) + 1));
  274.  
  275.         std::cout << "D = " << D << FFE_LB;
  276.  
  277.         fractal::iter_settings isets = {
  278.             { D, D },
  279.             { -1.5, 1.5, -1.5, 1.5 },
  280.             314,
  281.             { { 0.36, 0.1 }, { -0.75, 0.2 }, { 0.35, 0.1 } }
  282.         };
  283.  
  284.         fractal::iter_result ires = {
  285.             0,
  286.             0.0,
  287.             { 0.0, 0.0 }
  288.         };
  289.  
  290.         ffe::private_fractal ffe_frac;
  291.         app::ascii_fractal txt_frac;
  292.  
  293.         fractal::complex_t c(0.0, 0.5);
  294.  
  295.         std::cout << c << FFE_LB FFE_LB;
  296.  
  297.  
  298.         fractal::iterate_plane(txt_frac, isets, ires);
  299.  
  300.         std::cout << FFE_LB FFE_LB;
  301.  
  302.         fractal::iterate_plane(ffe_frac, isets, ires);
  303.     }
  304.  
  305.     std::cout << FFE_LB FFE_LB "Hit <ENTER> to exit..." << FFE_LB;
  306.     std::cin.get();
  307.  
  308.     return 0;
  309. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement