[zt]Java/PHP/C 幾種語言 RSA 的互操作

來源:互聯網
上載者:User

最近有一個項目,涉及到和別的網站合作,雙方通訊的鑒權計劃是通過 RSA 來做。由於可能涉及到不同的開發環境,於是要研究一下各個語言對 RSA 的支援

  1. openssl 預設建立出來的公密鑰檔案是 PEM 格式的,但 Java API 匯入密碼只能是 DER 格式,特別是密鑰必須用 PKCS#8 編碼。這就需要對 openssl 產生出來的檔案做一下轉換

    • openssl rsa -inform PEM -in rsapriv.pem -outform DER -pubout -out rsapub.der
    • openssl pkcs8 -topk8 -inform PEM -in rsapriv.pem -outform DER -nocrypt -out rsapriv.der
  2. 基礎演算法的標準是 openssl 的:RSA_private_encrypt/RSA_public_decrypt、RSA_public_encrypt/RSA_private_decrypt 這4個函數,因為 PHP 的 openssl 模組也只提供了這 4 個基礎函數(不要幻想用非 openssl 模組之外的東西來做 RSA 運算,比如 PEAR 的 Crypt_RSA,速度慢到令人髮指)
  3. 要注意上述 4 個函數裡,可使用的 padding 參數只有那麼有限的幾種。對應 Java 裡面 Cipher.getInstance() 的參數,只能用 "RSA/NONE/PKCS1Padding" 或 "RSA/NONE/NoPadding"(或許 "RSA/None/OAEPPadding" 是對應RSA_PKCS1_OAEP_PADDING,但我沒有深究了)。預設 PHP 裡的 padding 是 RSA_PKCS1_PADDING
  4. 關於 python... 嗯,直接用 ctypes 就好啦
  5. 用 RSA 簽名都是首先將文本做一個單向 hash,然後用私密金鑰將簽名加密;校正端拿到簽名和文本,用公開金鑰將簽名解密,對比是否是文本的 hash。openssl 因此封裝了 RSA_sign/RSA_verify 來做這個事情。
    • 但 openssl 的幾個 NID 雜湊演算法和標準的sha1/md5好像不太一樣,PHP 幾乎無法和這兩個函數互操作。
    • Java API 中 Signature.getInstance() 倒是可以用 "MD2withRSA"、"MD5withRSA" 或 "SHA1withRSA",但也不清楚是否可以和 openssl 的 NID_md2/NID_md2WithRSAEncryption、NID_md5/ NID_md5WithRSAEncryption/NID_md5WithRSA、NID_sha1/NID_sha1WithRSAEncryption/NID_sha1WithRSA 對應起來,仍然需要花時間校正。

    總之為了更多語言的互操作能力,我們現在沒有用 RSA_sign/RSA_verify 這兩個封裝好的函數。

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.