defmodule Apollo18.AutoCipher do @moduledoc """ Provides cipher mechanism to make your things be like Apollo 18: Officially don't exists, only the owner know that it (if ?) exists. The truth is out there (Maybe ...). Uses the ```Apollo18.CipherDecisor``` mechanism to obtain the cipher parameters an then use ```Apollo18.Cipher``` or ```Apollo18.Based64Cipher``` to cipher/decipher. (This module functionalities are'nt in web/javascript version - Do not use this if you send ciphered messages to be deciphered in web browser). """ alias Krug.MapUtil alias Apollo18.CipherDecisor alias Apollo18.Cipher alias Apollo18.Based64Cipher @doc """ Uses the ```Apollo18.CipherDecisor``` mechanism to obtain the cipher parameters based on string length and max_decipher_time_execution_seconds. After this, use ```Apollo18.Cipher``` or ```Apollo18.Based64Cipher``` to cipher the received string. Return a map object that contains the original string, the ciphered string and the parameters used to cipher (this parameters should be used to call decipher method in this module, on moment of revert the cipher). ## Examples ```elixir iex > string = Krug.SanitizerUtil.generate_random(150) iex > Apollo18.AutoCipher.cipher(string,1) %{ base64: true, ciphered: "789C41114140410041104100120D1222127D12E0123D120D120D120D123D120D122D12FC122D120D12311222122D12" <> ..., salt: 5, value: "0f(bvuJVG51MxQenz0Dy*dG(3M*OM:KhDtaR9Wz6:PbI@@6lHe6*6f:VyWjKD1/rzW7_Me5C7SDNug.B$ch:a44+$LRk)v2O/PÑmpjCXgqloKB$nL*x3CQ$C7g_w,p9F8Qpr8GOv8f,JSKt/*lvTy7" } ``` ```elixir iex > string = Krug.SanitizerUtil.generate_random(250) iex > Apollo18.AutoCipher.cipher(string,1) %{ base64: true, ciphered: "377ABCAF271C411131FF31FF41104120D083D083D0B2D0DED083D083D0B2D042D09ED06ED0AED06ED09ED06ED07E" <> ..., salt: 4, value: "bbWVDv_CkIGNnDTVqq7S:n(K8P$IE10_pG@OKd_ÑcRhz3zyWMI2sxf*a$nZpI-pvbat:XsOBPZBP)hY9Z7ñ2oWQ+@:HYñYe7H7en@sjDVQ.jO(*xBiÑPt/G%bR1@(LMk09SXXñGL%ñhab2h%VB5ItE-v6zTczdr)/cg+SQ:(4dlw:pGxq6rF6gDM2n(ZC7Fc*.28CkcxeX0yC51GUg%hQHqn2lmIhr1Tñ-:HñbvrYZpRe(7$kVk%C9oVdQ" } ``` ```elixir iex > string = Krug.SanitizerUtil.generate_random(2250) iex > Apollo18.AutoCipher.cipher(string,1) %{ base64: true, ciphered: "774F46324151412031FF31EF31CF91C791089108810B818B81DB810B81CC91B7910891A781DB91D791A791B791A791D791A791A" <> ..., salt: 2, value: "orS-qcTwJ1YYa)vb(ThQaDQ8)l4S%+foFdE/68$hhÑwMUyÑpÑ-oM+QbtaB+j91yq_5IyD:lb,56d3Urn9hWoxmOG(@L/E+sk_n5ufv3@5daeV$M4._EkO(SYPFG+$-(Bl_cÑve__*TEESk7lhn,Bljy-n8iZcOa8gnK17H2F$)ezdVXCkw@KvÑ2YxEJ%GRW-b*W(lHu4xphyMZ_3Hj3Npk3n7ZtZHW*Rb$%VjPof/DU@q-S2rofLoQx/ED@ÑGnql**l9R1aJK/Io_yv6HI+$ÑTBor/JE*-ñHBrkeaBGñ)P(tñbEJl9nt)r+W@TzñmVKmC2nh85l3_9gwñ1Ñ*y*9Ñ44xkao@nR:rFHHx-Gj_ÑZsGqEG*+gEQC(F7ñjV01WgqTtk/z1rQWjw5ho-3jhkfNlmIOzffWgKc%M@JfFiñMKf__IE5HquRWhd+7UmsUrf6WVKdD2FVmcftFv)sC7Wy-l0iT$G3ñb+3OxK,6*+lDDPÑYñ6h3ijH+MGjf2RG8TaWse9F018zBQV@mp1iw,qpGV3WUtxYNhRsZRCzY5omQÑVS_IhdhuJqaEU/lMXy**iSÑ/hzf9d(_1%/ZmZE:H1-_16+nÑ@Z%7mtBsQbDBr*mrMqlodñÑN5X6nVN./*xt:OY_K(($$mOTNinR0br$/_w-kHIPI:dXKt7q512)JbU@jWvpFi4:rRc*%HG_V/.:.xMvnC4-etlE(3@(a_ZC6tH15kLB.yVYRq8VC0pw1:BCbOnKYV3PJD6+nÑ/*YXuULmGgd.xznp9Qv2Rn2+Dklq(S91CFwRt.k4g0Qa$Uz$Gh5k176s6YGamIR*upLICzm.y4Pr/:eG%ñG4@iX5ñ:WR)KVy-bKKMRpnYTG%Ñ_@yKRSpLmGQRgD5l7Oi@D77Pl7cBVW:xpIidJTR7w7%dd-ÑVg-(+o)w)RVKKtm_SZFOs(mWvnxÑNñq/%zdZi0Ou7O49k$k/yt+NmSx:dMNnr:gjL4$CiR$eBuv--o/F5X.UMuÑ*E.9p(DN6ih0e_mpbGso%ZrK$5iSBnñTqiFkM1qtCC+nB@$.FlZR0XbR0PY8LX*CJ-ClwJ*+)sY1d:iuQ0WLe(JZaJPP)ÑVaZ)x-ÑLohIu%EXdGDRuo41ñXEQE5Wp)m+wmy6O*K5/10j91,ñumz6Foo$9XjBe@v9fePzkG@YcipñJotlvM2XcIpqRIvRnLzgpW+uyJRCkus7aLjG*KBñGMjZJwzh_lBWyDPB:6LVkU++0PWvmrgH5)kLU@Cn:4ZuBII+,p_ñ1fVTs.CE%X8DVb9i7xscfo2j0Ñta_plL@gW/LzKlÑV*am$pTYSe-)Ut(:B8Uo61fUiñH$KyHlsBXDEgSJCpys@TMNuEEñ+7C6$1nNQ3w+YK5rF3cnq1hB/SñuJivOrfñ$p3),o42lc*/KYqB)ñ(yC5pjU*P%zK+tXcQElb4S*zH+wwXQu9aoMseJS+qlatR)NmMxswuT4HX:n_X+U)6aSZ)F9@bvQ,R7rd%h3DNx1PaÑuS4g1S1)ñ%.rtMw3txGhHYdd_:Bgm2:491ZK-QLiMcHÑÑVVXVD5F6GpHX7Nvz4)DYYXykMMy$mÑZCD.M0m.XU)u_+I(cXe9-ñZhtIZl:.$*B.OQ8gqU:b@+l*k78p74/S,Rv.Wi(4bKf/pmxXqwvH2iQjSYvñswm)uODPqZ5cMFpJVxTTJ4lXFdFSnh6qWh4Kw0oQy$u0YM3q1qKcaWR*q@5:,Z(i4viU:X6NIblv78Yb%ñERiue5sG+,tg@Lnb$WdMlN5_eOib2ñ+,WW4W%3KqmrJ+VKCMafIZhg3_BlU4EwPeUNgR28g4lhFi7yZT%9E8x2ñgBhPcf:vYjFXñYyqY.Cmc-Igg4IgrH9b/kLHc@oX0-:8dOVc@)m+4cuSV1zpEZMK_g/cwv:j2dMtay(ddrzD-0+mMBspPzkwvI).dDÑdWHxRz@rtDKwulow8OcY1/GmjHk*P,Ñc*p2+%TbF2Ft4:w8GdC%1QO@$FnO3R(0PsfZMxO6/IHPslY_QroqP*GY6WO$5yaq)bUNpNuCxF3.S)aQ0V3lu4pMZKo))KK$jf3g:qbBÑrfS*0@()QZprz0/NI5Fp1sS+nXW8Y:Cay@Hs3R1wL6kq_,nnHZ%4/UFswPy(-BbTi/bJZ-5XdrNPl6BH,nkDMRMcGjfhsaiwj@sÑs9jC.vZ7TYFQsH@0MRRxF(JojÑQg$(N9D)p51qZYWwNbSaacSf86Fe5a7kFSlÑ-8IBENk*sE)5m,PVf_HñVw" } ``` ```elixir iex > string = Krug.SanitizerUtil.generate_random(2250) iex > Apollo18.AutoCipher.cipher(string,3) %{ base64: true, ciphered: "00000100414131FF31CF414031CFC08DC08DC05DC042C05DC07DC04DC03DC05DC02DC06DC02DC04DC02DC042C042C04DC02DC071C042C05DC02DC05" <> ..., salt: 3, value: "orS-qcTwJ1YYa)vb(ThQaDQ8)l4S%+foFdE/68$hhÑwMUyÑpÑ-oM+QbtaB+j91yq_5IyD:lb,56d3Urn9hWoxmOG(@L/E+sk_n5ufv3@5daeV$M4._EkO(SYPFG+$-(Bl_cÑve__*TEESk7lhn,Bljy-n8iZcOa8gnK17H2F$)ezdVXCkw@KvÑ2YxEJ%GRW-b*W(lHu4xphyMZ_3Hj3Npk3n7ZtZHW*Rb$%VjPof/DU@q-S2rofLoQx/ED@ÑGnql**l9R1aJK/Io_yv6HI+$ÑTBor/JE*-ñHBrkeaBGñ)P(tñbEJl9nt)r+W@TzñmVKmC2nh85l3_9gwñ1Ñ*y*9Ñ44xkao@nR:rFHHx-Gj_ÑZsGqEG*+gEQC(F7ñjV01WgqTtk/z1rQWjw5ho-3jhkfNlmIOzffWgKc%M@JfFiñMKf__IE5HquRWhd+7UmsUrf6WVKdD2FVmcftFv)sC7Wy-l0iT$G3ñb+3OxK,6*+lDDPÑYñ6h3ijH+MGjf2RG8TaWse9F018zBQV@mp1iw,qpGV3WUtxYNhRsZRCzY5omQÑVS_IhdhuJqaEU/lMXy**iSÑ/hzf9d(_1%/ZmZE:H1-_16+nÑ@Z%7mtBsQbDBr*mrMqlodñÑN5X6nVN./*xt:OY_K(($$mOTNinR0br$/_w-kHIPI:dXKt7q512)JbU@jWvpFi4:rRc*%HG_V/.:.xMvnC4-etlE(3@(a_ZC6tH15kLB.yVYRq8VC0pw1:BCbOnKYV3PJD6+nÑ/*YXuULmGgd.xznp9Qv2Rn2+Dklq(S91CFwRt.k4g0Qa$Uz$Gh5k176s6YGamIR*upLICzm.y4Pr/:eG%ñG4@iX5ñ:WR)KVy-bKKMRpnYTG%Ñ_@yKRSpLmGQRgD5l7Oi@D77Pl7cBVW:xpIidJTR7w7%dd-ÑVg-(+o)w)RVKKtm_SZFOs(mWvnxÑNñq/%zdZi0Ou7O49k$k/yt+NmSx:dMNnr:gjL4$CiR$eBuv--o/F5X.UMuÑ*E.9p(DN6ih0e_mpbGso%ZrK$5iSBnñTqiFkM1qtCC+nB@$.FlZR0XbR0PY8LX*CJ-ClwJ*+)sY1d:iuQ0WLe(JZaJPP)ÑVaZ)x-ÑLohIu%EXdGDRuo41ñXEQE5Wp)m+wmy6O*K5/10j91,ñumz6Foo$9XjBe@v9fePzkG@YcipñJotlvM2XcIpqRIvRnLzgpW+uyJRCkus7aLjG*KBñGMjZJwzh_lBWyDPB:6LVkU++0PWvmrgH5)kLU@Cn:4ZuBII+,p_ñ1fVTs.CE%X8DVb9i7xscfo2j0Ñta_plL@gW/LzKlÑV*am$pTYSe-)Ut(:B8Uo61fUiñH$KyHlsBXDEgSJCpys@TMNuEEñ+7C6$1nNQ3w+YK5rF3cnq1hB/SñuJivOrfñ$p3),o42lc*/KYqB)ñ(yC5pjU*P%zK+tXcQElb4S*zH+wwXQu9aoMseJS+qlatR)NmMxswuT4HX:n_X+U)6aSZ)F9@bvQ,R7rd%h3DNx1PaÑuS4g1S1)ñ%.rtMw3txGhHYdd_:Bgm2:491ZK-QLiMcHÑÑVVXVD5F6GpHX7Nvz4)DYYXykMMy$mÑZCD.M0m.XU)u_+I(cXe9-ñZhtIZl:.$*B.OQ8gqU:b@+l*k78p74/S,Rv.Wi(4bKf/pmxXqwvH2iQjSYvñswm)uODPqZ5cMFpJVxTTJ4lXFdFSnh6qWh4Kw0oQy$u0YM3q1qKcaWR*q@5:,Z(i4viU:X6NIblv78Yb%ñERiue5sG+,tg@Lnb$WdMlN5_eOib2ñ+,WW4W%3KqmrJ+VKCMafIZhg3_BlU4EwPeUNgR28g4lhFi7yZT%9E8x2ñgBhPcf:vYjFXñYyqY.Cmc-Igg4IgrH9b/kLHc@oX0-:8dOVc@)m+4cuSV1zpEZMK_g/cwv:j2dMtay(ddrzD-0+mMBspPzkwvI).dDÑdWHxRz@rtDKwulow8OcY1/GmjHk*P,Ñc*p2+%TbF2Ft4:w8GdC%1QO@$FnO3R(0PsfZMxO6/IHPslY_QroqP*GY6WO$5yaq)bUNpNuCxF3.S)aQ0V3lu4pMZKo))KK$jf3g:qbBÑrfS*0@()QZprz0/NI5Fp1sS+nXW8Y:Cay@Hs3R1wL6kq_,nnHZ%4/UFswPy(-BbTi/bJZ-5XdrNPl6BH,nkDMRMcGjfhsaiwj@sÑs9jC.vZ7TYFQsH@0MRRxF(JojÑQg$(N9D)p51qZYWwNbSaacSf86Fe5a7kFSlÑ-8IBENk*sE)5m,PVf_HñVw" } ``` """ @doc since: "1.0.0" def cipher(string,max_decipher_time_execution_seconds \\ 1,key \\ 0) do parameters = CipherDecisor.get_best_parameters(string,max_decipher_time_execution_seconds) salt = parameters |> MapUtil.get_by_atom_key(:salt) base64 = parameters |> MapUtil.get_by_atom_key(:base64) ciphered = cond do (base64 == true) -> string |> Based64Cipher.cipher(salt,key) true -> string |> Cipher.cipher(salt,key) end parameters |> MapUtil.replace(:value,string) |> MapUtil.replace(:ciphered,ciphered) end @doc """ Uses ```Apollo18.Cipher``` or ```Apollo18.Based64Cipher``` to decipher the received string. The parameters are same map object that was generated by ```cipher(string,max_decipher_time_execution_seconds \\ 1)``` and contain the ```salt``` and cipher module used to cipher this received string. ## Example ```elixir iex > cipher_result_map = %{ base64: true, ciphered: "789C41114140410041104100120D1222127D12E0123D120D120D120D123D120D122D12FC122D120D12311222122D12" <> ..., salt: 5, value: "0f(bvuJVG51MxQenz0Dy*dG(3M*OM:KhDtaR9Wz6:PbI@@6lHe6*6f:VyWjKD1/rzW7_Me5C7SDNug.B$ch:a44+$LRk)v2O/PÑmpjCXgqloKB$nL*x3CQ$C7g_w,p9F8Qpr8GOv8f,JSKt/*lvTy7" } iex > cipher_result_map |> Krug.MapUtil.get(:ciphered) |> Apollo18.AutoCipher.decipher(cipher_result_map) "0f(bvuJVG51MxQenz0Dy*dG(3M*OM:KhDtaR9Wz6:PbI@@6lHe6*6f:VyWjKD1/rzW7_Me5C7SDNug.B$c" <> ... ``` """ @doc since: "1.0.0" def decipher(string,parameters,key \\ 0) do salt = parameters |> MapUtil.get_by_atom_key(:salt) base64 = parameters |> MapUtil.get_by_atom_key(:base64) cond do (base64 == true) -> string |> Based64Cipher.decipher(salt,key) true -> string |> Cipher.decipher(salt,key) end end end