2017-01-19 16 views
2

私は、次のRubyのコードがあります。ゴー暗号化は、同じキーを使用してRubyの暗号化とは異なりIV

require 'base64' 
require 'openssl' 

data = '503666666' 

key = '4768c01c4f598828ef80d9982d95f888fb952c5b12189c002123e87f751e3e82' 

nonce = '4eFi6Q3PX1478767\n' 
nonce = Base64.decode64(nonce) 

c = OpenSSL::Cipher.new('aes-256-gcm') 
c.encrypt 
c.key = key 
c.iv = nonce 

result = c.update(data) + c.final 
tag = c.auth_tag 

puts Base64.encode64(result + tag) # => J3AVfNG84bz2UuXcfre7LVjSbMpX9XBq6g==\n 

私はGolangに複製しようとしています。 は、ここで私がこれまで持っているものです。

package main 

import (
    "fmt" 
    "crypto/aes" 
    "crypto/cipher" 
    "encoding/base64" 
    "encoding/hex" 
) 

func main() { 
    data := []byte("503666666") 

    key, err := hex.DecodeString(`4768c01c4f598828ef80d9982d95f888fb952c5b12189c002123e87f751e3e82`) 
    if err != nil { 
     panic(err) 
    } 

    nonceB64 := "4eFi6Q3PX1478767\n" 
    nonce, err := base64.StdEncoding.DecodeString(nonceB64) 
    if err != nil { 
     panic(err) 
    } 

    block, err := aes.NewCipher(key) 
    if err != nil { 
     panic(err.Error()) 
    } 

    aesgcm, err := cipher.NewGCM(block) 
    if err != nil { 
     panic(err.Error()) 
    } 

    ciphertext := aesgcm.Seal(nil, nonce, data, nil) 
    fmt.Printf("%s\n", base64.StdEncoding.EncodeToString(ciphertext)) 
} 

囲碁バージョンから結果があるしかし:

+ S52HGbLV1xp + GnF0v8VNOqc5J2GY2 + SQAの==

J3AVfNG84bz2UuXcfre7LVjSbMpX9XBq6g == \ nは

は、なぜ私は別の結果を取得していますか?

ありがとう、

答えて

4

AES 256暗号には32バイトのキーが必要です。 Rubyコードは、キーを16進数で構成された64バイトの文字列に設定しています。 OpenSSLは使用前に32バイトの文字列を切り捨てている(Rubyコードに'4768c01c4f598828ef80d9982d95f888'keyを変更すると、あなたは同じ出力が得られます)。

移動コードは、しかし、六角キーのために必要な32バイトに64桁の16進数を変換し、使用前にキーを復号します。

あなたはそれがRubyの結果と一致するように移動するコードを変更したい場合は、あなたが鍵を切り捨て、ステップをデコード進を削除する必要があります:

key := []byte("4768c01c4f598828ef80d9982d95f888") 

しかし、私はあることを主張したいですコードのGoバージョンでのキー処理が優れています。 Goバージョンと一致するようにRubyのバージョンを変更したい場合は、使用する前にそのキーを16進デコードすることができます:

key = [key].pack('H*') 
+0

私はそれを認識しています。しかし、私はRubyから得た結果と全く同じ結果を得ようとしています。それが起こるためには、キーはGOでどのように変わるべきですか?私は進エンコードされない場合、キーの長さが大きすぎるため – content01

+0

が、それは失敗します。 – content01

+0

@ content01私は自分の答えを更新しました。 –

関連する問題