2016-05-13 11 views
0

私がメッセージに署名するのopensslコマンドを使用して "テスト" を、hexdumpが持つ出力opensslとgolangで生成するRSAシグネチャが異なるのはなぜですか?

# echo "Test." | openssl rsautl -inkey privite.key -sign -hexdump 
0000 - 09 1b ce e2 4b 69 86 be-d7 b1 fb f0 ec e4 53 0e ....Ki........S. 
0010 - ef 9c a4 7b db d3 21 d5-3e 78 23 61 89 34 7e bc ...{..!.>x#a.4~. 
0020 - e9 1e 5a e9 f4 40 e6 53-07 e4 dd 1a fe 31 ec 42 [email protected] 
0030 - 98 a5 07 d4 7e d9 f4 01-2f ba a3 65 18 b7 69 a4 ....~.../..e..i. 

16進数文字列が091bcee24b69です...

マイprivate.Key

# cat private.Key 
-----BEGIN RSA PRIVATE KEY----- 
MIIBOgIBAAJBALKZD0nEffqM1ACuak0bijtqE2QrI/KLADv7l3kK3ppMyCuLKoF0 
fd7Ai2KW5ToIwzFofvJcS/STa6HA5gQenRUCAwEAAQJBAIq9amn00aS0h/CrjXqu 
/ThglAXJmZhOMPVn4eiu7/ROixi9sex436MaVeMqSNf7Ex9a8fRNfWss7Sqd9eWu 
RTUCIQDasvGASLqmjeffBNLTXV2A5g4t+kLVCpsEIZAycV5GswIhANEPLmax0ME/ 
EO+ZJ79TJKN5yiGBRsv5yvx5UiHxajEXAiAhAol5N4EUyq6I9w1rYdhPMGpLfk7A 
IU2snfRJ6Nq2CQIgFrPsWRCkV+gOYcajD17rEqmuLrdIRexpg8N1DOSXoJ8CIGlS 
tAboUGBxTDq3ZroNism3DaMIbKPyYrAqhKov1h5V 
-----END RSA PRIVATE KEY----- 

署名を生成しますゴランと

var prvKeyPem = `-----BEGIN RSA PRIVATE KEY----- 
MIIBOgIBAAJBALKZD0nEffqM1ACuak0bijtqE2QrI/KLADv7l3kK3ppMyCuLKoF0 
fd7Ai2KW5ToIwzFofvJcS/STa6HA5gQenRUCAwEAAQJBAIq9amn00aS0h/CrjXqu 
/ThglAXJmZhOMPVn4eiu7/ROixi9sex436MaVeMqSNf7Ex9a8fRNfWss7Sqd9eWu 
RTUCIQDasvGASLqmjeffBNLTXV2A5g4t+kLVCpsEIZAycV5GswIhANEPLmax0ME/ 
EO+ZJ79TJKN5yiGBRsv5yvx5UiHxajEXAiAhAol5N4EUyq6I9w1rYdhPMGpLfk7A 
IU2snfRJ6Nq2CQIgFrPsWRCkV+gOYcajD17rEqmuLrdIRexpg8N1DOSXoJ8CIGlS 
tAboUGBxTDq3ZroNism3DaMIbKPyYrAqhKov1h5V 
-----END RSA PRIVATE KEY-----` 

func GenerateSignature() { 
    block, _ := pem.Decode([]byte(prvKeyPem)) 
    if block == nil { 
     panic("failed to parse root certificate PEM") 
    } 
    privKey, err := x509.ParsePKCS1PrivateKey(block.Bytes) //x509.ParseCertificate(block.Bytes) 
    if err != nil { 
     panic("failed to parse certificate: " + err.Error()) 
    } 
    indata := "Test." 
    h := sha256.New() 
    h.Write([]byte(indata)) 
    digest := h.Sum(nil) 

    s, err := rsa.SignPKCS1v15(rand.Reader, privKey, crypto.SHA256, digest) 
    if err != nil { 
     panic("failed to sign:" + err.Error()) 
    } 
    fmt.Printf("%x\n", s) 
} 

func main() { 
    GenerateSignature() 
} 

llowingが出力されます。 52e1cce3810c1a89693cf6965d1035618820a9e3a7b95203d885c4153dc3f7424b98e3ba628a186f1074d672bb59a1c0788a9c2064951ca2326eb1bf8e3e49e9

しかし、私はそれがあるべきだと思う:

091bcee24b69 ...

どこが間違っているのですか?末尾の改行(\nまたは0a)とのおかげで

答えて

6

は、OpenSSLのrsautlコマンドは、供給されたデータ上で直接動作しますSHA256で暗号化し、結果のダイジェストに署名します。他を移動するには

$ echo -n "Test." | openssl dgst -sha256 -sign private.key -hex 
52e1cce3810c1a89693cf6965d1035618820a9e3a7b95203d885c4153dc3f7424b98e3ba628a186f1074d672bb59a1c0788a9c2064951ca2326eb1bf8e3e49e9 

のOpenSSLで行くコードと同じを実行するには、-signオプション(私はここにもecho-nオプションを含めました注意してください)とdgst commandを使用することができます道とゴー・コードでハッシュ化せずに生のメッセージに署名、あなたはrsa.SignPKCS1v15hash引数の値として0を渡すことができます。

indata := []byte("Test.") 

s, err := rsa.SignPKCS1v15(nil, privKey, 0, indata) 
+0

あなたの助けを借りて、私の問題は解決されました。どうもありがとうございます。別の質問として、次のコマンドを使用して文字列 "Test。\ n"を取得します。 '$ openssl rsautl -verify -inkey pub.key -pubin -in署名 ' ' $ Test.' Golangのバグでは、VerifyPKCS1v15が署名を検証する機能しか見つかりませんでしたが、関数を呼び出す前に、この文字列 "Test。\ n"を知っていて、引数を生成する必要があります** hashed88。 'func VerifyPKCS1v15(pub * PublicKey、ハッシュcrypto.Hash、ハッシュされた[]バイト、sig []バイト)' opensslコマンドと同様に、公開鍵から "Test。\ n"という文字列を取得して署名できますか? –

3

echoコマンドを印刷文字列:

> echo 'Test.' | hexdump -C 
00000000 54 65 73 74 2e 0a         |Test..| 
00000006 

は、だからあなたの場合には、あなたがTest.\n初めてに署名している、とあなたの中Test.二度目Goプログラム。改行抑制するために使用echo-nスイッチ:GOコードは最初のデータをハッシュしながらhelmbert’s answerに記載echoによって追加改行に加え

> echo -n 'Test.' | hexdump -C 
00000000 54 65 73 74 2e         |Test.| 
00000005 
+0

だけでなく、すべての 'echo' implementatの点に注意してください。イオンは '-n'スイッチをサポートします。 – eduncan911

関連する問題