2016-06-27 8 views
0

Ich verschlüsselte numerischen Wert wie folgt.Warum ist die Länge des verschlüsselten numerischen Werts anders?

> 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 

Das obige Ergebnis ist das erwartete Ergebnis. Da die Klasse der Nummer, die weniger als 4611686018427387903 ist, Fixnum ist, und die Größe von Fixnum ist 8 Byte. Außerdem beträgt die Blockgröße von AES 128 Bit (16 Byte). 8 Byte < 16 Byte. So ist die Länge des verschlüsselten Wertes von 1 und 10000 gleich.

Aber folgenden Fall, Länge des verschlüsselten Werts ist anders.

> message3 = 1000000000000000000000000000 
> message3.size 
=> 12 
> message3.class 
=> Bignum 
> encrypt_message3 = encryptor.encrypt_and_sign(message3) 
> encrypt_message3.size 
=> 138 

1000000000000000000000000000 Bignum ist, aber diese Größe 12 und weniger als 16 (Blockgröße von AES). Also, ich habe erwartet, dass die Länge des verschlüsselten Wertes der von Fixnum ist. Aber diese sind unterschiedlich ...

Warum sind diese anders?

+0

Versuchen Sie, den Klassennamen der verschlüsselten Nachricht zu drucken ... –

+0

Ich habe versucht, Klasse zu drucken. > encrypt_message1.class => String > encrypt_message3.class => String – tamagohan2

+0

Dann gibt es die Antwort :) also - die Größe einer Zahl ist lediglich die Größe des Registers, dass er Nummer gespeichert, aber die Größe von eine Zeichenkette ist, wie viele Zeichen in der Schnur sind ... –

Antwort

2

Es gibt mehrere Ebenen, was hier geschieht, und Sie können es nicht allein auf die Datengröße erklären + Verschlüsselung verwendet (dh Sie in den Transformationen Faktor haben, die auch geschehen)

Blick auf: https://github.com/rails/rails/blob/29be3f5d8386fc9a8a67844fa9b7d6860574e715/activesupport/lib/active_support/message_encryptor.rb

und danach Blick auf: https://github.com/rails/rails/blob/29be3f5d8386fc9a8a67844fa9b7d6860574e715/activesupport/lib/active_support/message_verifier.rb, die im Verschlüsseler verwendet wird.

Es gibt ein paar Stufen:

  1. die Daten Serialisierung Sie passieren in (dies wird mit Marshal.dump getan, wenn Sie keine Serializer angeben)
  2. base64 die Daten kodieren.
  3. Erzeugen eines Digest (dh Signatur) für die Daten.
  4. Verschlüsseln der Daten + Digest und storign das Ergebnis + iv aus der Chiffre in verschlüsselter Form verwendet.

Wenn Sie den erzeugten verschlüsselten Daten verstehen, sollten Sie grundsätzlich oben durch den Code verfolgen müssen, aber:

::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 

Aber:

Marshal.dump(1).size is 4 
    Marshal.dump(10000).size is 6 
    Marshal.dump(1000000000000000000000000000).size is 17 

Hier ist, wie Marshal.dump Werke intern: http://jakegoulding.com/blog/2013/01/15/a-little-dip-into-rubys-marshal-format/

Hier ist wie base64-Codierung funktioniert: https://blogs.oracle.com/rammenon/entry/base64_explained Schauen Sie sich die Regeln f oder Auffüllen.

+0

Danke für die Antwort. Ich kann verstehen!! – tamagohan2

Verwandte Themen