PHP和Java的RSA加密相通
PHP和Java的RSA加密互通
一、利用OpenSSL生成RSA公私钥
1.生成RSA私钥
openssl genrsa -out rsa_private_key.pem 1024
示例:
-----BEGIN RSA PRIVATE KEY-----MIICXAIBAAKBgQC19+3Zkg8ko4S7XeAjGl2ps8dEVGx2prFAAsq9OeNjvI4zbUG2iw7fvk02VZuilYyspB/MR1nMEWreVj21FdnN/szIlC/stptlNMtmkZ28jv8QVvls8O2Zp97qDxSWbYwZFT1nmQVK1uSZV7wMEldWTSlFcLuOXoFGGXndO9062QIDAQABAoGASoBHkVyLdqS8Izo8GiMhVemVHBS0k5+L0nlSKEcbIiqAze1dii9E17ZCRoymO9qezdAkdK6BxVscNgt5GDrqAQvS6LmQ1KQfOF2mr3rNeCjz6RLl4ujl9mjwAikGHRWBev7Dz9q/YjKg4OaFTTT5HcgnuyLzO2DY8rKA1PM3gkECQQDlPtu0N4gZJe2/BSqEFwLLme+lQP8d1NNoICAP5U+GowUc885AMMWqOObOUVe/PzaSSObyAsRTht2HOCalqWh/AkEAyzSUXpThSShB6JQxDC52r+SS9342bEa6z3vSJ2gBfIZObxA25jHSF7pRh/vXpGXzcsV4fzIDGKz6tEPHfh3wpwJBANUwnrs7RWs1taKGWGKcz7Guh4nkJxyD9tKHxalitJFd+3xQU4eok7pYznQie3rUe5iRCY0Y+6E987gzhOVc5VsCQFNs4MT75on8ZyKvRHu1z7Bi7RuCy6EkYKmyMhNPldyj3yulwoQ7S//F1Jc5g8zQtmQWQmQmCjNlQQAlG4/hht0CQByUzQ2Vj9uB/RXMvPWtGimEENaAO5Q2wF5kWnoyfg8U8DjPPoFe0B9mWxAjPBCnI3UwW3P7B7TZKrAlf+GbtxE=-----END RSA PRIVATE KEY-----
2.生成RSA公钥
openssl rsa -in rsa_private_key.pem -pubout -out rsa_public_key.pem
示例:
-----BEGIN PUBLIC KEY-----MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQC19+3Zkg8ko4S7XeAjGl2ps8dEVGx2prFAAsq9OeNjvI4zbUG2iw7fvk02VZuilYyspB/MR1nMEWreVj21FdnN/szIlC/stptlNMtmkZ28jv8QVvls8O2Zp97qDxSWbYwZFT1nmQVK1uSZV7wMEldWTSlFcLuOXoFGGXndO9062QIDAQAB-----END PUBLIC KEY-----
3.将RSA私钥转换成PKCS8格式
openssl pkcs8 -topk8 -inform PEM -in rsa_private_key.pem -outform PEM –nocrypt
示例:
-----BEGIN PRIVATE KEY-----MIICdgIBADANBgkqhkiG9w0BAQEFAASCAmAwggJcAgEAAoGBALX37dmSDySjhLtd4CMaXamzx0RUbHamsUACyr0542O8jjNtQbaLDt++TTZVm6KVjKykH8xHWcwRat5WPbUV2c3+zMiUL+y2m2U0y2aRnbyO/xBW+Wzw7Zmn3uoPFJZtjBkVPWeZBUrW5JlXvAwSV1ZNKUVwu45egUYZed073TrZAgMBAAECgYBKgEeRXIt2pLwjOjwaIyFV6ZUcFLSTn4vSeVIoRxsiKoDN7V2KL0TXtkJGjKY72p7N0CR0roHFWxw2C3kYOuoBC9LouZDUpB84Xaaves14KPPpEuXi6OX2aPACKQYdFYF6/sPP2r9iMqDg5oVNNPkdyCe7IvM7YNjysoDU8zeCQQJBAOU+27Q3iBkl7b8FKoQXAsuZ76VA/x3U02ggIA/lT4ajBRzzzkAwxao45s5RV78/NpJI5vICxFOG3Yc4JqWpaH8CQQDLNJRelOFJKEHolDEMLnav5JL3fjZsRrrPe9InaAF8hk5vEDbmMdIXulGH+9ekZfNyxXh/MgMYrPq0Q8d+HfCnAkEA1TCeuztFazW1ooZYYpzPsa6HieQnHIP20ofFqWK0kV37fFBTh6iTuljOdCJ7etR7mJEJjRj7oT3zuDOE5VzlWwJAU2zgxPvmifxnIq9Ee7XPsGLtG4LLoSRgqbIyE0+V3KPfK6XChDtL/8XUlzmDzNC2ZBZCZCYKM2VBACUbj+GG3QJAHJTNDZWP24H9Fcy89a0aKYQQ1oA7lDbAXmRaejJ+DxTwOM8+gV7QH2ZbECM8EKcjdTBbc/sHtNkqsCV/4Zu3EQ==-----END PRIVATE KEY-----
注:php中使用openssl方法,签名和验签,不需要第三步,Java的私钥需要做第三步。
二、PHP的RSA签名和验签方法
1. 签名方法
openssl_sign($msg, $sign, $ key, OPENSSL_ALGO_SHA1);
$msg:要签名的字符串。
$sign:做好签名字符串。
不可以写成 $sign = openssl_sign($msg, $sign, $ key, OPENSSL_ALGO_SHA1);
$ key:密钥,密钥格式,必须为rsa_private_key.pem的格式。
OPENSSL_ALGO_SHA1:密钥算法,如果与Java等交互,必须相互配对。
2. 验签方法
$result= openssl_verify($msg, $sign, $key);
$msg:签名的原字符串。
$sign:签名字符串。
$ key:密钥,密钥格式,必须为rsa_private_key.pem的格式。
$result:验签结果;为1时,验签正确;其余失败。
3. 判断私钥是否是可用
$pi_key = openssl_pkey_get_private($private_key);
这个函数可用来判断私钥是否是可用的,可用返回
4. 判断公钥是否是可用
$pu_key = openssl_pkey_get_public($public_key);
这个函数可用来判断公钥是否是可用的
5. 私钥加密
openssl_private_encrypt($data,$encrypted,$pi_key);
$data :要签名的字符串。
$encrypted:签名后的字符串。
$pi_key:私钥。
6.公钥解密
openssl_public_decrypt($encrypted,$decrypted,$pu_key);
$encrypted:签名字符串。
$decrypted:解签后的字符串。
$pu_key:公钥。
注:3,4,5,6需要联合使用,5,6的这种加解密存在原串过长,加密失败的问题,请谨慎使用。所有使用到的key,请保证是原始串的格式。
三、JAVA的RSA签名和验签方法
1.签名方法
PS: 本方法中使用的密钥需要转换成PKCS8格式
/** * 本方法使用SHA1withRSA签名算法产生签名 * @param String priKey 签名时使用的私钥(16进制编码) * @param String src 签名的原字符串 * @return String 签名的返回结果(16进制编码)。当产生签名出错的时候,返回null。 */ public static String generateSHA1withRSASigature(String priKey, String src) { try { Signature sigEng = Signature.getInstance("SHA1withRSA"); byte[] pribyte = UtilString.hexStrToBytes(priKey.trim()); PKCS8EncodedKeySpec keySpec = new PKCS8EncodedKeySpec(pribyte); KeyFactory fac = KeyFactory.getInstance("RSA"); RSAPrivateKey privateKey = (RSAPrivateKey) fac.generatePrivate(keySpec); sigEng.initSign(privateKey); sigEng.update(src.getBytes()); byte[] signature = sigEng.sign(); return UtilString.bytesToHexStr(signature); } catch (Exception e) { e.printStackTrace(); return null; } }
2.验签方法
/** * 本方法使用SHA1withRSA签名算法验证签名 * @param String pubKey 验证签名时使用的公钥(16进制编码) * @param String sign 签名结果(16进制编码) * @param String src 签名的原字符串 * @return String 签名的返回结果(16进制编码) */ public static boolean verifySHA1withRSASigature(String pubKey, String sign, String src) { try { Signature sigEng = Signature.getInstance("SHA1withRSA"); byte[] pubbyte = UtilString.hexStrToBytes(pubKey.trim()); X509EncodedKeySpec keySpec = new X509EncodedKeySpec(pubbyte); KeyFactory fac = KeyFactory.getInstance("RSA"); RSAPublicKey rsaPubKey = (RSAPublicKey) fac.generatePublic(keySpec); sigEng.initVerify(rsaPubKey); sigEng.update(src.getBytes()); byte[] sign1 = UtilString.hexStrToBytes(sign); return sigEng.verify(sign1); } catch (Exception e) { e.printStackTrace(); //LogMan.log("[NeteaseSignUtil][verifySHA1withRSASigature]"+e); return false; } }
PS:解签和验签时签名算法(如SHA1withRSA)一定要使用配套的,
JAVA与PHP互通时也一定要用配套的。
十六进制转换方法:
package com.nloan.cmis.pub.utils;public class UtilString { private static final char[] bcdLookup = { '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'a', 'b', 'c', 'd', 'e', 'f' }; /** * 将字节数组转换为16进制字符串的形式. */ public static final String bytesToHexStr(byte[] bcd){ StringBuffer s = new StringBuffer(bcd.length * 2); for (int i = 0; i >> 4) & 0x0f]); s.append(bcdLookup[bcd[i] & 0x0f]); } return s.toString(); } /** * 将16进制字符串还原为字节数组. */ public static final byte[] hexStrToBytes(String s) { byte[] bytes; bytes = new byte[s.length() / 2]; for (int i = 0; i <br><br><br><br><br>文档包中的key是配套key值,可直接使用,其他的文件有示例方法,可做参考。<br>网络参考地址:<br>http://blog.csdn.net/clh604/article/details/20224735<br>http://blog.csdn.net/chaijunkun/article/details/7275632<br><br><div class="clear"> </div>

熱AI工具

Undresser.AI Undress
人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover
用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool
免費脫衣圖片

Clothoff.io
AI脫衣器

Video Face Swap
使用我們完全免費的人工智慧換臉工具,輕鬆在任何影片中換臉!

熱門文章

熱工具

記事本++7.3.1
好用且免費的程式碼編輯器

SublimeText3漢化版
中文版,非常好用

禪工作室 13.0.1
強大的PHP整合開發環境

Dreamweaver CS6
視覺化網頁開發工具

SublimeText3 Mac版
神級程式碼編輯軟體(SublimeText3)

Nginx是一款廣泛應用於Web伺服器、負載平衡器、反向代理程式和快取的軟體。在網路傳輸過程中,資料的加密和安全性越來越受到關注。為了提高通訊的安全性,可以使用OpenSSL函式庫來實現SSL/TLS協議,從而保護敏感資料的傳輸。本文將說明如何使用Nginx與OpenSSL函式庫實現更安全的通訊。安裝與設定OpenSSL函式庫首先,需要在伺服器上安裝OpenSSL函式庫。可以使

使用Java的String.valueOf()函數將基本資料型別轉換為字串在Java開發中,當我們需要將基本資料型別轉換為字串時,常見的方法是使用String類別的valueOf()函數。這個函數可以接受基本資料類型的參數,並傳回對應的字串表示。在本文中,我們將探討如何使用String.valueOf()函數進行基本資料型別轉換,並提供一些程式碼範例來

char陣列轉string的方法:可以透過賦值來實現,使用{char a[]=" abc d\0efg ";string s=a;}語法,讓char陣列對string直接賦值,執行程式碼即可完成轉換。

SQL中的Identity是什麼,需要具體程式碼範例在SQL中,Identity是一種用於產生自增數字的特殊資料類型,它常用於唯一識別表中的每一行資料。 Identity欄位通常與主鍵列搭配使用,可確保每筆記錄都有獨一無二的識別碼。本文將詳細介紹Identity的使用方式以及一些實際的程式碼範例。 Identity的基本使用方式在建立表格時,可以使用Identit

一、功能概覽鍵空間通知使得客戶端可以透過訂閱頻道或模式,來接收那些以某種方式改變了Rediskey變化的事件。所有修改key鍵的指令。所有接收到LPUSHkeyvalue[value…]指令的鍵。 db資料庫中所有已過期的鍵。活動透過Redis的訂閱與發布功能(pub/sub)來分發,因此所有支援訂閱與發布功能的用戶端都可以在無須做任何修改的情況下,直接使用按鍵空間通知功能。因為Redis目前的訂閱與發布功能採取的是發送即忘(fireandforget)策略,所以如果你的程

使用Java的String.replace()函數替換字串中的字元(字串)在Java中,字串是不可變的對象,這意味著一旦創建了一個字串對象,就無法修改它的值。但是,你可能會遇到需要替換字串中的某些字元或字串的情況。這時候,我們可以使用Java的String類別中的replace()方法來實作字串的替換。 String類別的replace()方法有兩種重

如何使用OpenSSL產生MySQLSSL憑證簡介:MySQL是一種廣泛應用的關係型資料庫系統,在實際生產環境中使用SSL(SecureSocketsLayer)協定進行加密通訊是非常重要的。本文將介紹如何使用OpenSSL工具產生MySQLSSL證書,並提供對應的程式碼範例。步驟:安裝OpenSSL:首先,確保電腦上已安裝O

遇到的問題:在開發過程中,會遇到要批量刪除某種規則的key,例如login_logID(ID為變數),現在需要刪除"login_log*"這一類的數據,但是redis本身只有批量查詢一類別key值的指令keys,但是沒有批次刪除某一個類別的指令。解決方法:先查詢,在刪除,使用xargs傳參(xargs可以將管道或標準輸入(stdin)資料轉換成命令列參數),先執行查詢語句,在將查詢出來的key值,當初del的參數去刪除。 redis-cliKEYSkey*(查找條件)|xargsr
