2015-06-26 20 views
8

Sto cercando di capire lo script di shell equivalente di un piccolo script rubino che ho. Questo è lo script rubino:OpenSSL Firma RSA con digest 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)) 

Questo è tutto. Prende alcuni dati, ottiene l'hash SHA256 e poi li firma con una chiave privata che ho. Penso che il comando equivalente sul terminale dovrebbe essere:

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

Ma questi non producono la stessa uscita. Qualcuno potrebbe illuminarmi sul perché?

- EDIT -

sto aggiungendo qualche informazione in più in modo che le persone possono provare a riprodurre questo sul loro computer se lo si desidera. Il contenuto di res.tmp sono:

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. 

La chiave privata (che è non una chiave privata che viene effettivamente utilizzato per qualsiasi sistema di produzione, solo chiarendo che) è:

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

Ora, chiunque dovrebbe essere in grado di eseguire i comandi che ho dato sopra e ottenere gli stessi risultati. Lo script di shell produce questo come output:

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

Senza riga finale finale, naturalmente. Lo script ruby ​​produce:

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

Anche senza una nuova riga finale. Ho solo 64 basi codificate per renderli presentabili agli umani. Quella parte non è il problema. Il vero problema è che le mie invocazioni di openssl nello script ruby ​​e lo script di shell stanno facendo cose diverse. Nei commenti le persone continuano a chiedere risultati intermedi. Giusto per essere chiari, l'unica cosa che può essere considerata un "risultato intermedio" nel risultato binario crudo prima della codifica base64 (e sarebbe per me inutile e impossibile postarla qui). Il comando openssl che sto eseguendo è solo un comando opaco (in entrambi gli script), quindi in entrambi i casi non ho accesso all'hash SHA256. Suppongo che sarebbe stato generato con questo comando:

sha256sum res.tmp 

che dà questo nella riga di comando:

688a84cb84ce3b203460a2775248a31d4c3e9590a41ba27134dc342c328b8f9c res.tmp 

Ma non posso essere sicuro che l'hash di cui sopra è in realtà alcun risultato intermedio di uno di i due script. Fammi sapere se posso fornire ulteriori informazioni. Grazie.

+0

Ricevi sempre lo stesso risultato dallo script rubino? Ottieni lo stesso risultato intermedio dallo script ruby ​​e dal comando openssl? Quale versione di openssl stai usando? –

+0

@EtanReisner Sì. Entrambi gli script sono completamente deterministici. Entrambi danno gli stessi risultati ogni volta che vengono eseguiti. Il "risultato intermedio" (se con questo intendi i dati binari non elaborati prima che sia codificato in base64) è sempre lo stesso. Non so quale versione di openssl è sul computer è in esecuzione questi comandi, ma dovrebbe essere solo quello nel repository quantum quetzal ubuntu. –

+0

Il passaggio intermedio è identico tra i due script?(Questo è il passo che sta causando il diverso output.) –

risposta

0

In qualche modo, ho finito per sbagliare, e sembra che questi due script stiano effettivamente producendo lo stesso risultato. Scusate.

+0

Date le circostanze, non penso che la domanda sia molto utile, quindi ;-) –

+0

Questo è vero . Se qualcuno volesse chiuderlo o rimuoverlo, mi andrebbe bene. –

Problemi correlati