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 までご連絡ください。

ホットAIツール

Undresser.AI Undress

Undresser.AI Undress

リアルなヌード写真を作成する AI 搭載アプリ

AI Clothes Remover

AI Clothes Remover

写真から衣服を削除するオンライン AI ツール。

Undress AI Tool

Undress AI Tool

脱衣画像を無料で

Clothoff.io

Clothoff.io

AI衣類リムーバー

Video Face Swap

Video Face Swap

完全無料の AI 顔交換ツールを使用して、あらゆるビデオの顔を簡単に交換できます。

ホットツール

メモ帳++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 は、Web サーバー、ロード バランサー、リバース プロキシ、キャッシュで広く使用されているソフトウェアです。ネットワーク伝送において、データの暗号化とセキュリティに対する注目が高まっています。通信のセキュリティを向上させるために、OpenSSL ライブラリを使用して SSL/TLS プロトコルを実装し、機密データの送信を保護できます。この記事では、Nginx と OpenSSL ライブラリを使用して、より安全な通信を実現する方法について説明します。 OpenSSL ライブラリのインストールと構成 まず、サーバーに OpenSSL ライブラリをインストールする必要があります。作れます

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

Java の String.valueOf() 関数を使用して基本データ型を文字列に変換する Java 開発で基本データ型を文字列に変換する必要がある場合、一般的な方法は String クラスの valueOf() 関数を使用することです。この関数は、基本データ型のパラメータを受け入れ、対応する文字列表現を返すことができます。この記事では、基本的なデータ型変換に String.valueOf() 関数を使用する方法を検討し、いくつかのコード例を提供します。

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

char配列をstringに変換する方法:代入によって実現できます {char a[]=" abc d\0efg ";string s=a;} 構文を使用して、char配列にstringに値を直接代入させて実行します変換を完了するためのコード。

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

SQL における Identity とは何ですか? 具体的なコード例が必要です。SQL では、Identity は自動インクリメント数値の生成に使用される特別なデータ型です。多くの場合、テーブル内のデータの各行を一意に識別するために使用されます。 Identity 列は、各レコードが一意の識別子を持つようにするために、主キー列と組み合わせてよく使用されます。この記事では、Identity の使用方法といくつかの実用的なコード例について詳しく説明します。 Identity の基本的な使用方法は、テーブルを作成するときに Identity を使用することです。

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

1. 機能の概要 キースペース通知を使用すると、クライアントはチャネルまたはパターンをサブスクライブすることで、何らかの方法で Rediskey の変更を変更するイベントを受信できます。キーのキーを変更するすべてのコマンド。 LPUSHkeyvalue[value…] コマンドを受信したすべてのキー。 db データベース内の期限切れのキーすべて。イベントは Redis のサブスクリプションおよび公開機能 (pub/sub) を通じて配布されるため、サブスクリプションおよび公開機能をサポートするすべてのクライアントは、変更を加えることなくキースペース通知機能を直接使用できます。 Redis の現在のサブスクリプション機能と公開機能は fireandforget 戦略を採用しているため、プログラムが

Java の String.replace() 関数を使用して、文字列内の文字 (文字列) を置換します。 Java の String.replace() 関数を使用して、文字列内の文字 (文字列) を置換します。 Jul 25, 2023 pm 05:16 PM

Java の String.replace() 関数を使用して文字列内の文字 (文字列) を置換する Java では、文字列は不変オブジェクトです。つまり、文字列オブジェクトが作成されると、その値は変更できません。ただし、文字列内の特定の文字または文字列を置換する必要がある状況が発生する場合があります。現時点では、Java の String クラスの replace() メソッドを使用して文字列置換を実装できます。 String クラスの replace() メソッドには 2 つのタイプがあります。

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

OpenSSL を使用して MySQL SSL 証明書を生成する方法の紹介: MySQL は広く使用されているリレーショナル データベース システムですが、実際の運用環境では暗号化通信に SSL (SecureSocketsLayer) プロトコルを使用することが非常に重要です。この記事では、OpenSSL ツールを使用して MySQL SSL 証明書を生成する方法を紹介し、対応するコード例を示します。手順: OpenSSL をインストールする: まず、コンピューターに OpenSSL がインストールされていることを確認します。

2wワード詳細説明文字列、yyds 2wワード詳細説明文字列、yyds Aug 24, 2023 pm 03:56 PM

皆さんこんにちは。今日は Java の基本知識である String についてお話します。 String クラスの重要性は言うまでもなく、バックエンド開発で最もよく使用されるクラスであるため、説明する必要があります。

See all articles