我有一个编码器(使用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个地址是什么。
这些是地址中的有效字符:
' '
-
_
^
%
$
#
...
真的是任何角色。
答案 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
作为分隔符。
这些是地址中的有效字符:
' ' - _ ^ % $ # ...
请注意,您没有列出逗号,这对于分隔符来说是一个明显的选择。