PHP と Java 間の RSA 暗号化
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

ホットAIツール

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

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

Undress AI Tool
脱衣画像を無料で

Clothoff.io
AI衣類リムーバー

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

人気の記事

ホットツール

メモ帳++7.3.1
使いやすく無料のコードエディター

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

ゼンドスタジオ 13.0.1
強力な PHP 統合開発環境

ドリームウィーバー CS6
ビジュアル Web 開発ツール

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 の基本的な使用方法は、テーブルを作成するときに Identity を使用することです。

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

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

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

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