我将数值加密如下。
> secret = Sestrong textcureRandom::hex(128)
> encryptor = ::ActiveSupport::MessageEncryptor.new(secret, cipher: 'aes-256-cbc')
> message1 = 1
> message1.size
=> 8
> message1.class
=> Fixnum
> encrypt_message1 = encryptor.encrypt_and_sign(message1)
> encrypt_message1.length
=> 110
> message2 = 10000
> message2.size
=> 8
> message2.class
=> Fixnum
> encrypt_message2 = encryptor.encrypt_and_sign(message2)
> encrypt_message2.length
=> 110
以上结果是预期的结果。 因为,小于4611686018427387903的数量的类是Fixnum,Fixnum的大小是8字节。 此外,AES的块大小为128位(16字节)。 8字节< 16字节。 因此,加密值1和10000的长度都相同。
但是,以下情况,加密值的长度不同。
> message3 = 1000000000000000000000000000
> message3.size
=> 12
> message3.class
=> Bignum
> encrypt_message3 = encryptor.encrypt_and_sign(message3)
> encrypt_message3.size
=> 138
1000000000000000000000000000是Bignum,但此大小为12且小于16(AES的块大小)。 所以,我预计加密值的长度与Fixnum的长度相同。 但是,这些是不同的......
为什么这些不同?
答案 0 :(得分:2)
此处发生的事情有多个层次,您无法仅根据所使用的数据大小+加密来解释它(即您必须考虑发生的转换因素)
有几个阶段:
如果您想了解生成的加密数据,您基本上需要跟踪上面的代码,但是:
::Base64.strict_encode64(Marshal.dump(1)).size is 8
::Base64.strict_encode64(Marshal.dump(10000)).size is 8
::Base64.strict_encode64(Marshal.dump(1000000000000000000000000000)).size is 24
可是:
Marshal.dump(1).size is 4
Marshal.dump(10000).size is 6
Marshal.dump(1000000000000000000000000000).size is 17
以下是Marshal.dump内部工作的方式:http://jakegoulding.com/blog/2013/01/15/a-little-dip-into-rubys-marshal-format/
以下是base64编码的工作原理:https://blogs.oracle.com/rammenon/entry/base64_explained查看填充规则。