PHP と Java 間の RSA 暗号化

Jun 13, 2016 pm 12:15 PM
key openssl private public string

PHP と Java 間の RSA 暗号化の相互運用性
1. 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 メソッドを使用して署名と検証が行われるため、3 番目の手順は必要ありません。Java 秘密キーには 3 番目の手順が必要です。ステップ。

2. 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 の暗号化と復号には、元の文字列が長すぎて暗号化が失敗するという問題があります。注意して使用してください。使用されるすべてのキーは元の文字列形式である必要があります。


3. 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:
JAVA および署名を復号化して検証する場合は、署名アルゴリズム (SHA1withRSA など) を使用する必要があります。 PHP と相互運用する場合は、一致するものを使用する必要があります。


16 進変換方法:


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 < bcd.length; i++)		{			s.append(bcdLookup[(bcd[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 < bytes.length; i++){			bytes[i] = (byte) Integer.parseInt(s.substring(2 * i, 2 * i + 2), 16);		}		return bytes;	}		public static void main(String[] args) {		String str = "aa人民";//		str = URLEncoder.encode(str);//		byte[] aa = UtilString.hexStrToBytes(str);//		String nstr =new String(aa);//		System.out.println(nstr);//		System.out.println(UtilString.HexToString(nstr));				//字符串先byte 再十六进制,再字符串		str=bytesToHexStr(str.getBytes());		System.out.println(str);				//将16进制字符串还原为字节数组.		byte[] bb=hexStrToBytes(str);		System.out.println(new String(hexStrToBytes(str)));			}}
ログイン後にコピー




ドキュメント パッケージ内のキーは、一致するキーの値です。は直接使用でき、他のファイルには参照用のサンプル メソッドが含まれています。
インターネット参照アドレス:
http://blog.csdn.net/clh604/article/details/20224735
http://blog.csdn.net/chaijunkun/article/details/7275632


このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。

ホットな記事タグ

メモ帳++7.3.1

メモ帳++7.3.1

使いやすく無料のコードエディター

SublimeText3 中国語版

SublimeText3 中国語版

中国語版、とても使いやすい

ゼンドスタジオ 13.0.1

ゼンドスタジオ 13.0.1

強力な PHP 統合開発環境

ドリームウィーバー CS6

ドリームウィーバー CS6

ビジュアル Web 開発ツール

SublimeText3 Mac版

SublimeText3 Mac版

神レベルのコード編集ソフト(SublimeText3)

Nginx がより安全な通信のために OpenSSL ライブラリを使用する方法 Nginx がより安全な通信のために OpenSSL ライブラリを使用する方法 Jun 10, 2023 pm 01:51 PM

Nginx がより安全な通信のために OpenSSL ライブラリを使用する方法

SQL の ID 属性は何を意味しますか? SQL の ID 属性は何を意味しますか? Feb 19, 2024 am 11:24 AM

SQL の ID 属性は何を意味しますか?

Java の String.valueOf() 関数を使用して基本データ型を文字列に変換する Java の String.valueOf() 関数を使用して基本データ型を文字列に変換する Jul 24, 2023 pm 07:55 PM

Java の String.valueOf() 関数を使用して基本データ型を文字列に変換する

char配列を文字列に変換する方法 char配列を文字列に変換する方法 Jun 09, 2023 am 10:04 AM

char配列を文字列に変換する方法

SpringBoot が Redis キー変更イベントを監視する方法 SpringBoot が Redis キー変更イベントを監視する方法 May 26, 2023 pm 01:55 PM

SpringBoot が Redis キー変更イベントを監視する方法

iOS の開発者バージョンとパブリック バージョンの違いは何ですか? iOS の開発者バージョンとパブリック バージョンの違いは何ですか? Mar 01, 2024 pm 12:55 PM

iOS の開発者バージョンとパブリック バージョンの違いは何ですか?

パッチ不可能な Yubico 2 要素認証キーの脆弱性により、ほとんどの Yubikey 5、セキュリティ キー、YubiHSM 2FA デバイスのセキュリティが侵害される パッチ不可能な Yubico 2 要素認証キーの脆弱性により、ほとんどの Yubikey 5、セキュリティ キー、YubiHSM 2FA デバイスのセキュリティが侵害される Sep 04, 2024 pm 06:32 PM

パッチ不可能な Yubico 2 要素認証キーの脆弱性により、ほとんどの Yubikey 5、セキュリティ キー、YubiHSM 2FA デバイスのセキュリティが侵害される

OpenSSL を使用して MySQL SSL 証明書を生成する方法 OpenSSL を使用して MySQL SSL 証明書を生成する方法 Sep 09, 2023 pm 02:12 PM

OpenSSL を使用して MySQL SSL 証明書を生成する方法

See all articles