日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程语言 > php >内容正文

php

【转】php和java之间rsa加密互通

發(fā)布時(shí)間:2024/9/19 php 30 豆豆
生活随笔 收集整理的這篇文章主要介紹了 【转】php和java之间rsa加密互通 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

以下是php封裝好的類,引入即可使用

<?php /*** 作者:pjp* 郵箱:vippjp@163.com*/ class RSA{private $privateKey='';//私鑰(用于用戶加密)private $publicKey='';//公鑰(用于服務(wù)端數(shù)據(jù)解密)public function __construct(){$this->privateKey = openssl_pkey_get_private(file_get_contents('php_private.pem'));//私鑰,用于加密$this->publicKey = openssl_pkey_get_public(file_get_contents('php_public.pem'));//公鑰,用于解密}/*** 私鑰加密* @param 原始數(shù)據(jù) $data* @return 密文結(jié)果 string*/public function encryptByPrivateKey($data) {openssl_private_encrypt($data,$encrypted,$this->privateKey,OPENSSL_PKCS1_PADDING);//私鑰加密$encrypted = base64_encode($encrypted);//加密后的內(nèi)容通常含有特殊字符,需要編碼轉(zhuǎn)換下,在網(wǎng)絡(luò)間通過url傳輸時(shí)要注意base64編碼是否是url安全的return $encrypted;}/*** 私鑰解密* @param 密文數(shù)據(jù) $data* @return 原文數(shù)據(jù)結(jié)果 string*/public function decryptByPrivateKey($data){$data = base64_decode($data);openssl_private_decrypt($data,$encrypted,$this->privateKey,OPENSSL_PKCS1_PADDING);//私鑰解密return $encrypted;}/*** 私鑰簽名* @param unknown $data*/public function signByPrivateKey($data){openssl_sign($data, $signature, $this->privateKey);$encrypted = base64_encode($signature);//加密后的內(nèi)容通常含有特殊字符,需要編碼轉(zhuǎn)換下,在網(wǎng)絡(luò)間通過url傳輸時(shí)要注意base64編碼是否是url安全的return $encrypted;}/*** 公鑰加密* @param 原文數(shù)據(jù) $data* @return 加密結(jié)果 string*/public function encryptByPublicKey($data) {openssl_public_encrypt($data,$decrypted,$this->publicKey,OPENSSL_PKCS1_PADDING);//公鑰加密return base64_encode($decrypted);}/*** 公鑰解密* @param 密文數(shù)據(jù) $data* @return 原文結(jié)果 string*/public function decryptByPublicKey($data) {$data = base64_decode($data);openssl_public_decrypt($data,$decrypted,$this->publicKey,OPENSSL_PKCS1_PADDING);//公鑰解密return $decrypted;}/*** 公鑰驗(yàn)簽* @param unknown $data* @param unknown $sign*/public function verifyByPublicKey($data,$sign){$sign = base64_decode($sign);return openssl_verify($data, $sign, $this->publicKey);}public function __destruct(){openssl_free_key($this->privateKey);openssl_free_key($this->publicKey);} }

php公鑰文件內(nèi)容(php_public.pem)

公鑰和私鑰皆可自己重新生成

-----BEGIN PUBLIC KEY----- MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQCm1YchJdHVy9iXsDfQfMEB2mdO 5wuaEiqUEerHO7HbKKkvhuIfc7haQV5bKTiKZ76FnkkXJMF+onMrQrrqk4TiWlYZ oilesPM88jr01Z9MmhzKV7vWboVhYcd8cw2Mua0HwAMyl9TDt5OLWmT00C4/Lu72 lRL21avxRTvmDQoAqQIDAQAB -----END PUBLIC KEY-----

php私鑰文件內(nèi)容(php_private.pem)

-----BEGIN PRIVATE KEY----- MIICdgIBADANBgkqhkiG9w0BAQEFAASCAmAwggJcAgEAAoGBAKbVhyEl0dXL2Jew N9B8wQHaZ07nC5oSKpQR6sc7sdsoqS+G4h9zuFpBXlspOIpnvoWeSRckwX6icytC uuqThOJaVhmiKV6w8zzyOvTVn0yaHMpXu9ZuhWFhx3xzDYy5rQfAAzKX1MO3k4ta ZPTQLj8u7vaVEvbVq/FFO+YNCgCpAgMBAAECgYB1x4s1eJiyAc4wEITm2Bv+Lez/ BBfptmd+z0NbUiZW3VbLqcLbh3ufpERzwR8cfu8/L6bUAuvjddYutVZ2Ip0Nd7dG 5rrktH+7R8UT89fn87bUa5NlLee+egyoz/PJ63X4JjEg5OJbkXMbK4YrTypS0IAx nZv+7BeSsCrzNlpWAQJBANgmHMDNrIWvU3qVf7u8SS/g+WrlvKMWOXtYjH2OqWoO Vtmh4Or1PbaPIMnPAXFYiYYW8wcLYnVmVCez5qaysWkCQQDFl9XONZIMFAvdJ5S2 UFk63bEYtCroKZjddTlE6K/j+Vj2IaCFm94i4x1YzJR0KrykrtBTLRi7nuWmdJMJ r61BAkA7dxDGAk+KX9fJi8OedIh2AaDcxeOFwqGBy7Sq/kqhgNxn918XhOy7gtj0 bFzrP/5lw36M25b00XgpjBbSmaqxAkBnBN/TUHjh1T3OQ0m0uDWdjGI+KAlK3A04 QVrng43ZBXMNeMDRiE+Lzu/JEXjBDFsoXYB+LT/86j5/x721yiNBAkEAgi0F5BvA wYZQXqAx3iyuj8R9uUKpLePafyBRHnLNrFux2VD0ZX3pXCmfDDmtM/NMO491dI84 6NbVOvxWcNPQ/Q== -----END PRIVATE KEY-----

?

?

?

以下是java封裝好的方法

?

/*** 作者:pjp* 郵箱:vippjp@163.com*/package crypt;import java.io.File; import java.io.FileReader; import java.io.IOException; import java.security.KeyFactory; import java.security.Signature; import java.security.interfaces.RSAPrivateKey; import java.security.interfaces.RSAPublicKey; import java.security.spec.PKCS8EncodedKeySpec; import java.security.spec.X509EncodedKeySpec;import javax.crypto.Cipher;public class Rsa {private String priKey;private String pubKey;public static void main(String[] args) {Rsa rsa = new Rsa();String str = "我要加密這段文字。";System.out.println("原文:"+"我要加密這段文字。");String crypt = rsa.encryptByPrivateKey(str);System.out.println("私鑰加密密文:"+crypt);String result = rsa.decryptByPublicKey(crypt);System.out.println("原文:"+result);System.out.println("---");str = "我要加密這段文字。";System.out.println("原文:"+"我要加密這段文字。");crypt = rsa.encryptByPublicKey(str);System.out.println("公鑰加密密文:"+crypt);result = rsa.decryptByPrivateKey(crypt);System.out.println("原文:"+result);System.out.println("---");str = "我要簽名這段文字。";System.out.println("原文:"+str);String str1 = rsa.signByPrivateKey(str);System.out.println("簽名結(jié)果:"+str1);if(rsa.verifyByPublicKey(str1, str)){System.out.println("成功");} else {System.out.println("失敗");}}public Rsa(){priKey = readStringFromFile("java_private.pem");pubKey = readStringFromFile("java_public.pem");}/*** 使用私鑰加密* @see decByPriKey*/public String encryptByPrivateKey(String data) {// 加密String str = "";try {byte[] pribyte = base64decode(priKey.trim());PKCS8EncodedKeySpec keySpec = new PKCS8EncodedKeySpec(pribyte);KeyFactory fac = KeyFactory.getInstance("RSA");RSAPrivateKey privateKey = (RSAPrivateKey) fac.generatePrivate(keySpec);Cipher c1 = Cipher.getInstance("RSA/ECB/PKCS1Padding");c1.init(Cipher.ENCRYPT_MODE, privateKey);str = base64encode(c1.doFinal(data.getBytes()));} catch (Exception e) {e.printStackTrace();}return str;}/*** 使用私鑰解密* @see decByPriKey*/public String decryptByPrivateKey(String data) {// 加密String str = "";try {byte[] pribyte = base64decode(priKey.trim());PKCS8EncodedKeySpec keySpec = new PKCS8EncodedKeySpec(pribyte);KeyFactory fac = KeyFactory.getInstance("RSA");RSAPrivateKey privateKey = (RSAPrivateKey) fac.generatePrivate(keySpec);Cipher c1 = Cipher.getInstance("RSA/ECB/PKCS1Padding");c1.init(Cipher.DECRYPT_MODE, privateKey);byte[] temp = c1.doFinal(base64decode(data));str = new String(temp);} catch (Exception e) {e.printStackTrace();}return str;}/*** 使用公鑰加密* @see decByPriKey*/public String encryptByPublicKey(String data) {// 加密String str = "";try {byte[] pubbyte = base64decode(pubKey.trim());X509EncodedKeySpec keySpec = new X509EncodedKeySpec(pubbyte);KeyFactory fac = KeyFactory.getInstance("RSA");RSAPublicKey rsaPubKey = (RSAPublicKey) fac.generatePublic(keySpec);Cipher c1 = Cipher.getInstance("RSA/ECB/PKCS1Padding");c1.init(Cipher.ENCRYPT_MODE, rsaPubKey);str = base64encode(c1.doFinal(data.getBytes()));} catch (Exception e) {e.printStackTrace();}return str;}/*** 使用公鑰解密* @see decByPriKey*/public String decryptByPublicKey(String data) {// 加密String str = "";try {byte[] pubbyte = base64decode(pubKey.trim());X509EncodedKeySpec keySpec = new X509EncodedKeySpec(pubbyte);KeyFactory fac = KeyFactory.getInstance("RSA");RSAPublicKey rsaPubKey = (RSAPublicKey) fac.generatePublic(keySpec);Cipher c1 = Cipher.getInstance("RSA/ECB/PKCS1Padding");c1.init(Cipher.DECRYPT_MODE, rsaPubKey);byte[] temp = c1.doFinal(base64decode(data));str = new String(temp);} catch (Exception e) {e.printStackTrace();}return str;}/*** 本方法使用SHA1withRSA簽名算法產(chǎn)生簽名* @param String src 簽名的原字符串* @return String 簽名的返回結(jié)果(16進(jìn)制編碼)。當(dāng)產(chǎn)生簽名出錯(cuò)的時(shí)候,返回null。*/public String signByPrivateKey(String src) {try {Signature sigEng = Signature.getInstance("SHA1withRSA");byte[] pribyte = base64decode(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 base64encode(signature);} catch (Exception e) {e.printStackTrace();return null;}}/*** 使用共鑰驗(yàn)證簽名* @param sign* @param src* @return*/public boolean verifyByPublicKey(String sign, String src) {try {Signature sigEng = Signature.getInstance("SHA1withRSA");byte[] pubbyte = base64decode(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 = base64decode(sign);return sigEng.verify(sign1);} catch (Exception e) {e.printStackTrace();return false;}}/*** base64加密* @param bstr* @return*/@SuppressWarnings("restriction")private String base64encode(byte[] bstr) {String str = new sun.misc.BASE64Encoder().encode(bstr);str = str.replaceAll("\r\n", "").replaceAll("\r", "").replaceAll("\n", "");return str;}/*** base64解密* @param str* @return byte[]*/@SuppressWarnings("restriction")private byte[] base64decode(String str) {byte[] bt = null;try {sun.misc.BASE64Decoder decoder = new sun.misc.BASE64Decoder();bt = decoder.decodeBuffer(str);} catch (IOException e) {e.printStackTrace();}return bt;}/*** 從文件中讀取所有字符串* @param fileName* @return String*/private String readStringFromFile(String fileName){StringBuffer str = new StringBuffer();try {File file = new File(fileName);FileReader fr = new FileReader(file);char[] temp = new char[1024];while (fr.read(temp) != -1) {str.append(temp);}fr.close();} catch (IOException e) {// TODO Auto-generated catch blocke.printStackTrace();}return str.toString();} }

?

java公鑰文件內(nèi)容(java_public.pem)

MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQCm1YchJdHVy9iXsDfQfMEB2mdO 5wuaEiqUEerHO7HbKKkvhuIfc7haQV5bKTiKZ76FnkkXJMF+onMrQrrqk4TiWlYZ oilesPM88jr01Z9MmhzKV7vWboVhYcd8cw2Mua0HwAMyl9TDt5OLWmT00C4/Lu72 lRL21avxRTvmDQoAqQIDAQAB

java私鑰文件內(nèi)容(java_private.pem)

MIICdgIBADANBgkqhkiG9w0BAQEFAASCAmAwggJcAgEAAoGBAKbVhyEl0dXL2Jew N9B8wQHaZ07nC5oSKpQR6sc7sdsoqS+G4h9zuFpBXlspOIpnvoWeSRckwX6icytC uuqThOJaVhmiKV6w8zzyOvTVn0yaHMpXu9ZuhWFhx3xzDYy5rQfAAzKX1MO3k4ta ZPTQLj8u7vaVEvbVq/FFO+YNCgCpAgMBAAECgYB1x4s1eJiyAc4wEITm2Bv+Lez/ BBfptmd+z0NbUiZW3VbLqcLbh3ufpERzwR8cfu8/L6bUAuvjddYutVZ2Ip0Nd7dG 5rrktH+7R8UT89fn87bUa5NlLee+egyoz/PJ63X4JjEg5OJbkXMbK4YrTypS0IAx nZv+7BeSsCrzNlpWAQJBANgmHMDNrIWvU3qVf7u8SS/g+WrlvKMWOXtYjH2OqWoO Vtmh4Or1PbaPIMnPAXFYiYYW8wcLYnVmVCez5qaysWkCQQDFl9XONZIMFAvdJ5S2 UFk63bEYtCroKZjddTlE6K/j+Vj2IaCFm94i4x1YzJR0KrykrtBTLRi7nuWmdJMJ r61BAkA7dxDGAk+KX9fJi8OedIh2AaDcxeOFwqGBy7Sq/kqhgNxn918XhOy7gtj0 bFzrP/5lw36M25b00XgpjBbSmaqxAkBnBN/TUHjh1T3OQ0m0uDWdjGI+KAlK3A04 QVrng43ZBXMNeMDRiE+Lzu/JEXjBDFsoXYB+LT/86j5/x721yiNBAkEAgi0F5BvA wYZQXqAx3iyuj8R9uUKpLePafyBRHnLNrFux2VD0ZX3pXCmfDDmtM/NMO491dI84 6NbVOvxWcNPQ/Q==

說明:

java和php的RSA加解密版本已全部通過測(cè)試。并且可以相互加解密。
私鑰是服務(wù)器保留,公鑰可以發(fā)放給對(duì)應(yīng)的客戶端,甚至可以是公共的。
采用私鑰加密-》公鑰解密 和 公鑰加密-》私鑰解密 的加密方式。
但是如果客戶端是需要更高安全性的支付系統(tǒng),那么應(yīng)該采用兩對(duì)密鑰。
每一方分別是自己的私鑰和對(duì)方的公鑰,采用私鑰加密并簽名-》公鑰解密并驗(yàn)簽的方式。

注意:給出的是兩個(gè)版本的兩對(duì)密鑰,實(shí)際上只是一對(duì)密鑰。區(qū)別是java的密鑰去掉了頭尾注釋。而PHP的密鑰保留了頭尾注釋

轉(zhuǎn)載自:https://blog.csdn.net/panjiapengfly/article/details/75318930

文章為轉(zhuǎn)載其他博客所得,僅供自己學(xué)習(xí)作筆記使用!!!

總結(jié)

以上是生活随笔為你收集整理的【转】php和java之间rsa加密互通的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。