2016-06-27 7 views
0

以下のように暗号化された数値です。暗号化された数値の長さが異なるのはなぜですか?

> 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

暗号化されたメッセージのクラス名を印刷してみてください。 –

+0

クラスを印刷しようとしました。 > encrypt_message1.class =>文字列 > encrypt_message3.class =>文字列 – tamagohan2

+0

次に、あなたの答えがあります:) - すなわち数の大きさは、単に彼は数が格納されたレジスタのサイズが、サイズであります文字列は文字列内の文字数です。 –

答えて

2

は、ここで何が起こっているのかに複数の層があり、あなたは

ルックで(つまり、あなたはまた起こる変換で考慮しなければならない)だけに使用されるデータのサイズ+暗号化でそれを説明することはできません。https://github.com/rails/rails/blob/29be3f5d8386fc9a8a67844fa9b7d6860574e715/activesupport/lib/active_support/message_encryptor.rb

以降を参照してください: https://github.com/rails/rails/blob/29be3f5d8386fc9a8a67844fa9b7d6860574e715/activesupport/lib/active_support/message_verifier.rbこれは、暗号化装置で使用されます。あなたはデータを符号化する

  • BASE64を(あなたはどのシリアライザを指定しない場合、これはMarshal.dumpを使用して行われます)で渡すデータをシリアライズ

    1. は、いくつかの段階があります。

    2. データのダイジェスト(すなわち署名)を生成する。
    3. データ+ダイジェストを暗号化し、暗号化された形式で使用される暗号から結果+ ivを格納します。

    あなたは、生成した暗号化データを理解したい場合は、基本的には上記のコードをトレースする必要がありますが、:

    ::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ルールfまたはパディング。

  • +0

    ありがとうございます。私が理解することができます!! – tamagohan2

    関連する問題