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

以下是php封装好的类,引入即可使用

/**

* 作者:pjp

* 邮箱:vippjp@163.com

*/

class RSA{

private $privateKey='';//私钥(用于用户加密)

private $publicKey='';//公钥(用于服务端数据解密)

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 原始数据 $data

* @return 密文结果 string

*/

public function encryptByPrivateKey($data) {

openssl_private_encrypt($data,$encrypted,$this->privateKey,OPENSSL_PKCS1_PADDING);//私钥加密

$encrypted = base64_encode($encrypted);//加密后的内容通常含有特殊字符,需要编码转换下,在网络间通过url传输时要注意base64编码是否是url安全的

return $encrypted;

}

/**

* 私钥解密

* @param 密文数据 $data

* @return 原文数据结果 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);//加密后的内容通常含有特殊字符,需要编码转换下,在网络间通过url传输时要注意base64编码是否是url安全的

return $encrypted;

}

/**

* 公钥加密

* @param 原文数据 $data

* @return 加密结果 string

*/

public function encryptByPublicKey($data) {

openssl_public_encrypt($data,$decrypted,$this->publicKey,OPENSSL_PKCS1_PADDING);//公钥加密

return base64_encode($decrypted);

}

/**

* 公钥解密

* @param 密文数据 $data

* @return 原文结果 string

*/

public function decryptByPublicKey($data) {

$data = base64_decode($data);

openssl_public_decrypt($data,$decrypted,$this->publicKey,OPENSSL_PKCS1_PADDING);//公钥解密

return $decrypted;

}

/**

* 公钥验签

* @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公钥文件内容(php_public.pem)

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

-----BEGIN PUBLIC KEY-----

MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQCm1YchJdHVy9iXsDfQfMEB2mdO

5wuaEiqUEerHO7HbKKkvhuIfc7haQV5bKTiKZ76FnkkXJMF+onMrQrrqk4TiWlYZ

oilesPM88jr01Z9MmhzKV7vWboVhYcd8cw2Mua0HwAMyl9TDt5OLWmT00C4/Lu72

lRL21avxRTvmDQoAqQIDAQAB

-----END PUBLIC KEY-----

php私钥文件内容(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("签名结果:"+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签名算法产生签名

* @param String src 签名的原字符串

* @return String 签名的返回结果(16进制编码)。当产生签名出错的时候,返回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;

}

}

/**

* 使用共钥验证签名

* @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

* @returnString

*/

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 block

e.printStackTrace();

}

return str.toString();

}

}

java公钥文件内容(java_public.pem)

MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQCm1YchJdHVy9iXsDfQfMEB2mdO

5wuaEiqUEerHO7HbKKkvhuIfc7haQV5bKTiKZ76FnkkXJMF+onMrQrrqk4TiWlYZ

oilesPM88jr01Z9MmhzKV7vWboVhYcd8cw2Mua0HwAMyl9TDt5OLWmT00C4/Lu72

lRL21avxRTvmDQoAqQIDAQAB

java私钥文件内容(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加解密版本已全部通过测试。并且可以相互加解密。

私钥是服务器保留,公钥可以发放给对应的客户端,甚至可以是公共的。

采用私钥加密-》公钥解密 和 公钥加密-》私钥解密 的加密方式。

但是如果客户端是需要更高安全性的支付系统,那么应该采用两对密钥。

每一方分别是自己的私钥和对方的公钥,采用私钥加密并签名-》公钥解密并验签的方式。

注意:给出的是两个版本的两对密钥,实际上只是一对密钥。区别是java的密钥去掉了头尾注释。而PHP的密钥保留了头尾注释。

from:https://blog.csdn.net/panjiapengfly/article/details/75318930

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
RSA是一种非对称加密算法,它可以用于对文件进行加密解密。在Java中,可以使用Java加密库来实现RSA加密解密。下面是一个简单的示例代码: ```java import java.io.*; import java.security.*; import javax.crypto.*; public class RSAEncryption { private static final String PUBLIC_KEY_FILE = "public.key"; private static final String PRIVATE_KEY_FILE = "private.key"; public static void main(String[] args) throws Exception { // 生成密钥对 KeyPairGenerator keyGen = KeyPairGenerator.getInstance("RSA"); SecureRandom random = new SecureRandom(); keyGen.initialize(1024, random); KeyPair keyPair = keyGen.generateKeyPair(); // 保存公钥和私钥到文件 saveKeyToFile(keyPair.getPublic(), PUBLIC_KEY_FILE); saveKeyToFile(keyPair.getPrivate(), PRIVATE_KEY_FILE); // 加密文件 encryptFile("plaintext.txt", "ciphertext.txt", keyPair.getPublic()); // 解密文件 decryptFile("ciphertext.txt", "decrypted.txt", keyPair.getPrivate()); } private static void saveKeyToFile(Key key, String fileName) throws IOException { byte[] keyBytes = key.getEncoded(); FileOutputStream fos = new FileOutputStream(fileName); fos.write(keyBytes); fos.close(); } private static void encryptFile(String inputFile, String outputFile, PublicKey publicKey) throws Exception { Cipher cipher = Cipher.getInstance("RSA"); cipher.init(Cipher.ENCRYPT_MODE, publicKey); FileInputStream fis = new FileInputStream(inputFile); FileOutputStream fos = new FileOutputStream(outputFile); byte[] buffer = new byte[100]; int bytesRead; while ((bytesRead = fis.read(buffer)) != -1) { byte[] output = cipher.update(buffer, 0, bytesRead); if (output != null) { fos.write(output); } } byte[] output = cipher.doFinal(); if (output != null) { fos.write(output); } fis.close(); fos.flush(); fos.close(); } private static void decryptFile(String inputFile, String outputFile, PrivateKey privateKey) throws Exception { Cipher cipher = Cipher.getInstance("RSA"); cipher.init(Cipher.DECRYPT_MODE, privateKey); FileInputStream fis = new FileInputStream(inputFile); FileOutputStream fos = new FileOutputStream(outputFile); byte[] buffer = new byte[128]; int bytesRead; while ((bytesRead = fis.read(buffer)) != -1) { byte[] output = cipher.update(buffer, 0, bytesRead); if (output != null) { fos.write(output); } } byte[] output = cipher.doFinal(); if (output != null) { fos.write(output); } fis.close(); fos.flush(); fos.close(); } } ``` 上面的代码中,首先生成密钥对,然后保存公钥和私钥到文件中。接着,使用公钥对明文文件进行加密,将密文保存到文件中。最后,使用私钥对密文文件进行解密,将明文保存到文件中。 需要注意的是,RSA算法只能加密比密钥长度小的数据,因此在加密大文件时,需要将文件分块加密,并将每个加密块保存到文件中。在解密时,将每个加密块读取出来,进行解密,然后将解密结果拼接起来即可。 另外,由于RSA算法的加密解密速度比较慢,因此在加密大文件时,可能需要使用其他加密算法,如AES算法,来加密文件。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值