Current section

Files

Jump to
apollo18 lib apollo18 auto auto_cipher.ex
Raw

lib/apollo18/auto/auto_cipher.ex

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
cond do
(nil == string
or string == "")
-> string
true
-> string
|> cipher2(max_decipher_time_execution_seconds,key)
end
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
cond do
(nil == string
or string == "")
-> string
true
-> string
|> decipher2(parameters,key)
end
end
@doc false
def cipher2(string,max_decipher_time_execution_seconds,key) 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 false
defp decipher2(string,parameters,key) 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