2013-04-08 68 views
1

我試圖想出一個使用openssl的單線解決方案,它將填充消息的填充SHA256摘要(此字節爲256字節情況下,對於RSA2048),並應用RSA「解密」的256字節消化,即一種使用命令行對填充SHA256哈希進行RSA「加密」的方法openssl

m^d mod n 

其中n是模數,d是私人指數和m是該摘要信息(填充)。這是通常在正常RSA2048身份驗證中發生的事情,但我需要零零碎碎地做。

我試過這個,它沒有工作。

openssl rsautl -decrypt -in msg.sha256 -inkey secret.pem -out msg.sha256.sig 
RSA operation error 
2675740:error:04065084:rsa routines:RSA_EAY_PRIVATE_DECRYPT:data too large for 
modulus:rsa_eay.c:532: 

在我混亂的加密和解密的希望(因爲我想用在計算私人指數)我想這對RSA「加密/解密」太

openssl rsautl -encrypt -in msg.sha256 -inkey secret.pem -out msg.sha256.sig 
RSA operation error 
2675740:error:0406D06E:rsa routines:RSA_padding_add_PKCS1_type_2:data too large 
for key size:rsa_pk1.c:151: 

讀了起來,在這種情況下,我認爲我將文件加密/解密與單個消息加密/解密相混淆。文件加密顯然是涉及AES128等的更高級別的協議。我不想那麼做,我只想用私人指數進行模冪運算。

我也試過pkeyutil(據我所知是具有相同結果的首選方法)。我很確定我要走錯了路,也許這在命令行中是不可能的(我知道它可以從C API使用「bignum」實現)。

--- update ----

我試着從SHA256哈希中刪除PKCS1 v1.5填充(所以我剩下的只是32個字節的哈希),並通過它傳遞,但也沒有工作。

$ head -32c msg.sha256 | openssl.exe rsautl -decrypt -inkey secret.pem -out test.sig 
RSA operation error 
2675740:error:0407106B:rsa routines:RSA_padding_check_PKCS1_type_2:block type is 
not 02:rsa_pk1.c:190: 
2675740:error:04065072:rsa routines:RSA_EAY_PRIVATE_DECRYPT:padding check failed 
:rsa_eay.c:616: 

我試圖用相同和-raw它完成,沒有錯誤,但結果不是我所期待(這是我所期望的,因爲它不具備PKCS1v1.5填充)。然後我試着反轉輸入文件的字節順序,因爲openssl似乎在抱怨輸入文件(作爲256字節的BIGNUM)略大於模數(作爲256字節的BIGNUM),並且如果您將字節順序,則尾部0變成前導零,並且它較小。它完成了,但結果仍然不正確。

$ perl -e '$a = `cat msg.sha256`; print "".reverse($a);' > msg.sha256r 

$ head -256c msg.sha256r | openssl.exe rsautl -encrypt -raw -inkey secret.pem -out test3e.sig 
$ head -256c msg.sha256r | openssl.exe rsautl -decrypt -raw -inkey secret.pem -out test3d.sig 

是的,我知道我只是在黑暗中跌跌撞撞左右,但你會驚奇地發現多少次,我很幸運這樣...

兩個test3e.sig和test3d.sig做不同意我使用第三方工具的計算。

回答

1

也許嘗試使用-raw參數。如果消息已經填充到正確的大小,那麼您不希望該實用程序嘗試填充它。它默認爲-pkcs(PKCS 1.5),這可以解釋爲什麼會出現「太大」的錯誤。

+0

'-raw'給出了相同的結果(太大)。 – 2013-04-08 19:48:12

2

你,data too large for modulus的錯誤,是因爲您輸入以下代碼的第二if

/* make data into a big number */ 
if (BN_bin2bn(from,(int)flen,f) == NULL) goto err; 

if (BN_ucmp(f, rsa->n) >= 0) 
    { 
    RSAerr(RSA_F_RSA_EAY_PRIVATE_DECRYPT,RSA_R_DATA_TOO_LARGE_FOR_MODULUS); 
    goto err; 
    } 

BN_bin2bn轉換數據from(無符號字符*),以BIGNUM f(BIGNUM)。
BN_ucmp然後比較標號f和模數n>=0表示f>=n。由於您的輸入是SHA256摘要(256字節,2048位),轉換後的摘要值可能大於2048位模數n,因此會發生錯誤。

如果您可以將短信修改爲短信,似乎可行。此外,我們在調用函數做填充它計算f^d mod n爲以下行

if (!rsa->meth->bn_mod_exp(ret,f,d,rsa->n,ctx, 
      rsa->_method_mod_n)) 

您可能想要切換到RSA_NO_PADDING模式,以得到預期的答案後。

+0

我試過了,但沒有奏效。我發送它只有32個字節,並讓它嘗試填充PKCS1v1.5填充,但它仍然抱怨。 – 2013-04-09 16:36:16

+0

我真的應該休息一下,但現在我很好奇,因爲我是密碼學的初學者。如果'f 2013-04-09 17:11:44

+1

我不認爲填充是得到錯誤答案的原因。解密函數正在讀取您的文件,正如big-endian所說[在這裏](http://www.openssl.org/docs/crypto/BN_bn2bin.html)。我試圖得到你想要的結果,但答案不正確。我猜這是因爲「rsa_blinding」打開了;否則'if(!rsa-> meth-> rsa_mod_exp(ret,f,rsa,ctx))goto err;'應該給出正確的答案。您使用的工具對您的目的來說太強大了,導致我們陷入了這個混亂局面:P嘗試GMP。 – ChiaraHsieh 2013-04-10 04:42:15

相關問題