什么用作分隔符,以便我可以检测原始输入。任何好主意。红宝石

时间:2018-01-28 05:06:50

标签: ruby

我有一个编码器(使用openssl)可以加密和解密字符串,如下所示:

new_addresses
=> ["fasfds", "someaddress", "123- this is also a valid address"]
[8] pry(#<Sinatra::Application>)> Encoder.encrypt(new_addresses.join(' '))
=> "55C2FB253468204EA9D3F5CE6D58DC4088BD52731B90B9C0C8EB5FE7FA1CD4E7B41F0A84DC46C69E09A10DC1931C6A976A58E29C"
[9] pry(#<Sinatra::Application>)> enc=_
=> "55C2FB253468204EA9D3F5CE6D58DC4088BD52731B90B9C0C8EB5FE7FA1CD4E7B41F0A84DC46C69E09A10DC1931C6A976A58E29C"
[10] pry(#<Sinatra::Application>)> Encoder.decrypt(enc)
=> "fasfds someaddress 123- this is also a valid address"

我在这里遇到的问题是我不知道原来的3个地址是哪个。 new_addresses只是来自表单的params是一个用逗号分隔的数组。但是当我将它们连接在一起并对其进行编码时,我在解密它时会丢失逗号分隔符和数组结构,因此我不知道原始3 addresses是什么。关于我能做什么的任何想法,以便在我解密字符串后,我仍然可以检测原始3个地址是什么。

这些是地址中的有效字符:

' '
-
_
^
%
$
#
...

真的是任何角色。

1 个答案:

答案 0 :(得分:0)

看起来您的加密算法仅使用字符0-9和A-Z。在这种情况下,您可以将任何不是这些字符之一的字符用于join()加密字符串,例如"-"

encrypted_str = "55C2FB253-3F5CE6D58DC4-B5FE7FA1CD4E7"
encyrpted_pieces = encrypted_str.split '-'

decrypted_pieces = encrypted_pieces.map do |piece|
  Encoder.decrypt piece
end

另一方面,如果您想先将字符串连接在一起,然后对组合字符串进行加密,则可以使用名为NUL的非打印ascii字符将各个部分粘合在一起。 NUL的ascii代码为0,可以用字符串中的十六进制转义\x00表示:

decrypted_str = "fasfds\x00someaddress\x00123- this is also a valid address"
puts decrypted_str
pieces = decrypted_str.split "\x00"
p pieces

--output:--
fasfdssomeaddress123- this is also a valid address
["fasfds", "someaddress", "123- this is also a valid address"]

魔术。

当然,分隔符应该是一个不会出现在输入中的字符。如果输入可以是二进制数据,例如图像,然后您不能使用\x00作为分隔符。

  

这些是地址中的有效字符:

' '
-
_
^
%
$
#
...

请注意,您没有列出逗号,这对于分隔符来说是一个明显的选择。