2015-06-26 91 views
8

我想弄清楚我有一個小紅寶石腳本的等效shell腳本。這是紅寶石腳本:OpenSSL RSA與SHA256摘要簽名

require 'openssl' 
require 'base64' 

k = OpenSSL::PKey::RSA.new(File.read("key.pem")) 
res = File.read("res.tmp") 
digest = OpenSSL::Digest::SHA256.new 
signature = k.sign(digest,res) 
File.write("foo1.txt",Base64.strict_encode64(signature)) 

就是這樣。它需要一些數據,獲取它的SHA256哈希值,然後用我擁有的私鑰簽名。我認爲在終端上的等效命令應該是:

openssl sha -sha256 -sign key.pem < res.tmp | base64 -w 0 > foo2.txt 

但是,這些不會產生相同的輸出。有誰能夠啓發我爲什麼?

- 編輯 -

我加入一些更多的信息,使人們可以嘗試,如果需要複製這個在他們的計算機。的res.tmp內容是:

This is some sample text. 
This is some sample text. 
This is some sample text. 
This is some more sample text. 
This is some more sample text. 
This is some more sample text. 

私有密鑰(這是,實際上是用於任何生產系統的私鑰,只是澄清)是:

-----BEGIN PRIVATE KEY----- 
MIICdgIBADANBgkqhkiG9w0BAQEFAASCAmAwggJcAgEAAoGBALNY2EtJTj78tvnL 
G1v+5HFqn8mZ85AToUqj/n86/eymcMqEjskHAoVmU9FOr+ZsnSxopNvUVLCzDkv6 
w88tUtHGblzFtzJpQrxvtH8VCd2BNUc6Esxx7lmQeCxJMMPnmY2ZkDZuH6L+UsVL 
DbM7LCvJyluo/A3AP68G9YL+XTjFAgMBAAECgYBkJzsyX894UTwFJq0ypJcB1x9A 
P97KGIw72HTorBLdMt1N2tS54lZAFLK98gk8zm6/O/jEYkChJHzZZUIv0gmq+HOG 
CHLyBNsf3BzmBXmwLRIOf54MxwaafysjpHifuYB4Po7G/utvlYqIxg1mBo/KtnMC 
Wl2Enmrunei6gN3SAQJBAN94UfraP7lG50OYWhkcso95xpGrCeoFT64dV9I56FhU 
q4tD6SSeIXj50hvSH2MQMdFBjsUHPIt+X7zw17ywgwUCQQDNdETg4FD3YT1xolWD 
IFEowLlKfNqSaDIQia0dMIzk1/IqOoYhRKH03A97Wae1w/iyMgefyOVvkk+FZUs7 
r0rBAkAnZox1wTNJFIJD/cGs+c1V1K+5EUIPO95/oXbRfxpDMLKKPHAH38WhEdME 
yrhz++/8qCVnAc6f/akdpA01nJ2NAkEArC1GE9aow8fgADz0wMDygt6P6ZacbZmY 
azeVtiKb0KQQM8d75KFpwJQy/UJzQ+aJonw+2282p7vLnJT46XnLgQJALxzSBu0D 
hXIDTAMBpon+zgXjiy0ndiigLDPh1jJyCXrH0tBwj3FN+Br3yxbZT2LmE6PLIaJy 
rkTCKqlnkG2h+w== 
-----END PRIVATE KEY----- 

現在,任何人應該能夠運行我上面給出的命令並獲得相同的結果。 shell腳本產生這個輸出:

l4BxJyo/GQ0vUF5YR/vO7NtX5Sn/9bGfNHiVGS+W1CMfrwVlCtT0afHERXowx5T8mOiZ90VCJioHMj9Z6ssmfF1SpUbpoo1HYwNBCAfEcIjPLBj4N4KDLpy4gbMZtHEo2B8DZitYLwYDyvkCEudrMiU9b39DqOL+p3pwjJxT5iE= 

當然沒有結尾的換行符。紅寶石腳本產生:

l4BxJyo/GQ0vUF5YR/vO7NtX5Sn/9bGfNHiVGS+W1CMfrwVlCtT0afHERXowx5T8mOiZ90VCJioHMj9Z6ssmfF1SpUbpoo1HYwNBCAfEcIjPLBj4N4KDLpy4gbMZtHEo2B8DZitYLwYDyvkCEudrMiU9b39DqOL+p3pwjJxT5iE= 

也沒有尾隨換行符。我只基於64編碼的結果,使他們可以呈現給人類。這部分不是問題。真正的問題是,我在ruby腳本和shell腳本中調用openssl做了不同的事情。人們在評論中不斷詢問中間結果。只是要清楚,在base64編碼之前,唯一可以被認爲是原始二進制結果的「中間結果」(並且這對我來說是無用的和不可能的)。我運行的openssl命令只是一個不透明的命令(在兩個腳本中),所以在這兩種情況下我都無法訪問SHA256哈希。我想,它將與這個命令產生:

sha256sum res.tmp 

其中在命令行給出了這樣的:

688a84cb84ce3b203460a2775248a31d4c3e9590a41ba27134dc342c328b8f9c res.tmp 

但我不能肯定,散列以上實際上是任一的任何中間結果這兩個腳本。讓我知道我是否可以提供更多信息。謝謝。

+0

你是否每次都從ruby腳本得到相同的結果?你是否從ruby腳本和openssl命令獲得了相同的中間結果?你使用的是什麼版本的openssl? –

+0

@EtanReisner是的。這兩個腳本都是完全確定性的。他們每次運行都會得到相同的結果。 「中間結果」(如果是這樣的話,你的意思是在進行base64編碼之前的原始二進制數據)每次也是一樣的。我不知道計算機上的openssl版本是在運行這些命令,但它應該是ubuntu的quetzal回購庫中的一個版本。 –

+0

這兩個腳本之間的中間步驟是否相同?(這是哪個步驟導致不同的輸出) –

回答

0

不知何故,我最終弄錯了,看來這兩個腳本確實產生了相同的輸出。抱歉。

+0

鑑於情況我不認爲這個問題是非常有用的,然後;-) –

+0

這是真的。如果有人想關閉或刪除它,我會很好。 –