2016-04-21 62 views
1

我不是數學家(我問什麼,我說在這個崗位原諒!),但據我所知,RSA加密和解密應該是相同的操作: M 1Ë模Nopenssl RSA_private_decrypt和RSA_private_encrypt有什麼區別?

哪裏M是我想要解密/加密的,e是指數,n是模塊(在我的情況下是私有的)。

這樣做的確認如下:當我想以「簽到」明文,我得到了相同的簽名,如果我做了下述任何操作:

RSA_private_encrypt(plain_text.size(), &plain_text[0], &encrypted[0], rsa.get(), RSA_NO_PADDING); 

RSA_private_decrypt(plain_text.size(), &plain_text[0], &decrypted[0], rsa.get(), RSA_NO_PADDING); 

我的問題是:RSA_private_encrypt文檔指出「對於基於PKCS#1 v1.5的填充模式,flen必須小於RSA_size(rsa) - 11,對於RSA_PKCS1_OAEP_PADDING小於RSA_size(rsa) - 41並且對於RSA_NO_PADDING小於RSA_size(rsa)」。如果操作是相同的,爲什麼我只有在加密情況下才有這個限制? 實際上,如果我嘗試使用比RSA_SIZE短的純文本(本例中爲1024),解密操作會在加密失敗時成功。

請注意,我沒有使用填充(我知道這是不安全的)。

回答

1

RSA_private_encrypt says

RSA_private_encrypt()體徵使用私鑰RSA的FLEN字節從(具有算法標識符通常的消息摘要),並在存儲到簽名。必須指向RSA_size(rsa)字節的內存。

RSA_private_decrypt says雖然:

RSA_private_decrypt()解密FLEN在從使用私有密鑰RSA字節和在給存儲明文。必須指向足夠大的內存部分來存放解密數據(比RSA_size(rsa)小)。填充是用於加密數據的填充模式。

您引用的段落是指文檔中的RSA_public_encrypt


如果不使用填充,然後RSA_private_encryptRSA_private_decrypt將導致相同的操作。如果指定了填充,然後RSA_private_encrypt將添加填充,以給定的數據之前模冪和RSA_private_decrypt將嘗試後模冪去除填充,其中模冪意味着RSA運算xc mod n其中x是給定的數據和c總是私人密鑰操作的私有指數。

+0

PHP從來不應該暴露這些......不好的安全工程......簽名者應該總是接收文檔,應用消息格式並自己計算哈希。 – jww