注意:每次rsa加密产生的密文是不一样的,不同的密文解密可以得到相同的内容。
注意:每次rsa加密产生的密文是不一样的,不同的密文解密可以得到相同的内容。
1.公钥与私钥的生成
使用node-rsa来生成公钥与私钥
const NodeRSA = require('node-rsa');
var key = new NodeRSA({b: 2048});
var privateKey = key.exportKey("pkcs8-private");
var publicKey = key.exportKey("pkcs8-public-pem");
console.log(privateKey);
console.log(publicKey);
控制台输出如下所示:
-----BEGIN PRIVATE KEY-----
MIIEvQIBADANBgkqhkiG9w0BAQEFAASCBKcwggSjAgEAAoIBAQClZ7cjBeooF25z
LY4bkAGEL/Mq7vmxVOI8sPUifvaCWdmEDZJao40Jn4G+5P+3hkHpxzNt5wBbjC42
JNg+3Cqswd5v+aAXen3mHtrbE2qFcdgPz7/A2n0xjqp8mBxphFahFbguRURkp4AJ
W6xhinjcD/FoOr3yA2U7baaXAvONyuXU4iFxtcFea6FNzhyKtSZLR7HRcXayEDxR
cwcTJ0epLEfW1riVSf05yOI0NAxKbkdc8hteWoMiOJmRKn4hnBwQKupNmERZtn8I
VPrxTUt4ZwPTBQCtLBB5mULH2eduEY8vga3uaAbj7gEXF2o5EUejTriSY1B9MTp4
bFMEp3ADAgMBAAECggEAaLyrF89X/bkQpHhVQxjGDQk75pTaobLJa3r2Trisqc/x
T5A0e5aS6WQKiXGCh5jJRhpwc4hSDqZOYNSl5fAOScSdcLRV7mgPLtec6Bp8WjHD
igeYOatgmS/ovuqnGx3EqU4SiaIs87uo9MQK/NztORQTXlfMDWKfCKmfUoJ47PBk
jQ90xf/OHYvryv7F9ue+giv7g8o9SyyDy/uFGKsKIryMRifru9T4OTTNc9RA5hgg
BsKyrhvUsqttPc1ESZFPM6q9P3gkFoasZS6bBfyKZzqd7fg0brGGujDrayvXT4nV
dL1Qxu4gu/iWLO1XfdjMCSUhTeaMnFNgzl3+cfSKCQKBgQDzvkhvdQQZDvDZn9Zc
jlMlXHf2X8jYrDWj8PgZJJywAZNS7cVWQWT1LzHApadasWAaJT3QlHEVf/oxBJJ2
mpi/Ji3cqbLc+ILemD0eQk6+0+KED6mksU+0epM3C0npewR4mu+LdC4dMZ2sNx8x
x9oa50WATBsrcritrIjMUrmM5wKBgQCtuPt1tW2bxF9WxzzqQB5JMemy3udkBWLg
hjzTz9UG0XkxfwsLEKgD5qgkAIB8wOsM9JIW52hyDcDWHLzVAXkSWgIuGv7EP0l1
atmGWnjIP0sQ/GYu4MYTMYeq5de2w9iti+L0lgeaHjxB3ZXTPdVn4a1Z1sNCSCpV
rGRZ0TFkhQKBgB9sW6hK3LFiVLipu5gJHT0G08xmgt00LmIpUcLkDnM+cMDTOIqr
OZnGcNKWSKIPlgUo4fQ+/uk3q4igP0WdHq4d/PGiyxVj0HNkCxUYlVBSvrQp1MQP
u+fXmZ0SDoBURLpLtzAyVTOcTuiB3rqrOjoXsMUeiq4qRxbU1HoK/DLnAoGBAIkH
NmH8f760QLeEZIoplToLAtmydTYyAXI0sFoqv0+nfz8JhL5vnvekws/TDYZZ7Y3E
hE9IrNv5+TdqZ5BknwlYsguIA5jsipbxdy9AwbDCLAXz8O3dIqAVG3wz29kv1gPe
KWDfzpNEcidKD1oWlfRg0InimxX3Ml1to6ItHha5AoGAANfN73LBhFbu5mg1UJMJ
MBK4+EPTw6U6//KVX2Z9eL0T8dLOwJocxgCMp+3ZOE0YFGwJ02L6r6+LLXO+3i9L
0QmHIr3MlIsI/CnUKM2OB7DRNNlTXPlEoSvG2jEJXV91wYUzz59Py8Ksz8npCox/
YZcW7Bim5OeLhZi6W1XwdeQ=
-----END PRIVATE KEY-----
-----BEGIN PUBLIC KEY-----
MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEApWe3IwXqKBducy2OG5AB
hC/zKu75sVTiPLD1In72glnZhA2SWqONCZ+BvuT/t4ZB6cczbecAW4wuNiTYPtwq
rMHeb/mgF3p95h7a2xNqhXHYD8+/wNp9MY6qfJgcaYRWoRW4LkVEZKeACVusYYp4
3A/xaDq98gNlO22mlwLzjcrl1OIhcbXBXmuhTc4cirUmS0ex0XF2shA8UXMHEydH
qSxH1ta4lUn9OcjiNDQMSm5HXPIbXlqDIjiZkSp+IZwcECrqTZhEWbZ/CFT68U1L
eGcD0wUArSwQeZlCx9nnbhGPL4Gt7mgG4+4BFxdqORFHo064kmNQfTE6eGxTBKdw
AwIDAQAB
-----END PUBLIC KEY-----
将公钥与私钥进行存储。
2.使用node-rsa来进行加减密
const NodeRSA = require('node-rsa');
var publicKey = '-----BEGIN PUBLIC KEY-----\n' +
'MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEApWe3IwXqKBducy2OG5AB\n' +
'hC/zKu75sVTiPLD1In72glnZhA2SWqONCZ+BvuT/t4ZB6cczbecAW4wuNiTYPtwq\n' +
'rMHeb/mgF3p95h7a2xNqhXHYD8+/wNp9MY6qfJgcaYRWoRW4LkVEZKeACVusYYp4\n' +
'3A/xaDq98gNlO22mlwLzjcrl1OIhcbXBXmuhTc4cirUmS0ex0XF2shA8UXMHEydH\n' +
'qSxH1ta4lUn9OcjiNDQMSm5HXPIbXlqDIjiZkSp+IZwcECrqTZhEWbZ/CFT68U1L\n' +
'eGcD0wUArSwQeZlCx9nnbhGPL4Gt7mgG4+4BFxdqORFHo064kmNQfTE6eGxTBKdw\n' +
'AwIDAQAB\n' +
'-----END PUBLIC KEY-----';
var privateKey = '-----BEGIN PRIVATE KEY-----\n' +
'MIIEvQIBADANBgkqhkiG9w0BAQEFAASCBKcwggSjAgEAAoIBAQClZ7cjBeooF25z\n' +
'LY4bkAGEL/Mq7vmxVOI8sPUifvaCWdmEDZJao40Jn4G+5P+3hkHpxzNt5wBbjC42\n' +
'JNg+3Cqswd5v+aAXen3mHtrbE2qFcdgPz7/A2n0xjqp8mBxphFahFbguRURkp4AJ\n' +
'W6xhinjcD/FoOr3yA2U7baaXAvONyuXU4iFxtcFea6FNzhyKtSZLR7HRcXayEDxR\n' +
'cwcTJ0epLEfW1riVSf05yOI0NAxKbkdc8hteWoMiOJmRKn4hnBwQKupNmERZtn8I\n' +
'VPrxTUt4ZwPTBQCtLBB5mULH2eduEY8vga3uaAbj7gEXF2o5EUejTriSY1B9MTp4\n' +
'bFMEp3ADAgMBAAECggEAaLyrF89X/bkQpHhVQxjGDQk75pTaobLJa3r2Trisqc/x\n' +
'T5A0e5aS6WQKiXGCh5jJRhpwc4hSDqZOYNSl5fAOScSdcLRV7mgPLtec6Bp8WjHD\n' +
'igeYOatgmS/ovuqnGx3EqU4SiaIs87uo9MQK/NztORQTXlfMDWKfCKmfUoJ47PBk\n' +
'jQ90xf/OHYvryv7F9ue+giv7g8o9SyyDy/uFGKsKIryMRifru9T4OTTNc9RA5hgg\n' +
'BsKyrhvUsqttPc1ESZFPM6q9P3gkFoasZS6bBfyKZzqd7fg0brGGujDrayvXT4nV\n' +
'dL1Qxu4gu/iWLO1XfdjMCSUhTeaMnFNgzl3+cfSKCQKBgQDzvkhvdQQZDvDZn9Zc\n' +
'jlMlXHf2X8jYrDWj8PgZJJywAZNS7cVWQWT1LzHApadasWAaJT3QlHEVf/oxBJJ2\n' +
'mpi/Ji3cqbLc+ILemD0eQk6+0+KED6mksU+0epM3C0npewR4mu+LdC4dMZ2sNx8x\n' +
'x9oa50WATBsrcritrIjMUrmM5wKBgQCtuPt1tW2bxF9WxzzqQB5JMemy3udkBWLg\n' +
'hjzTz9UG0XkxfwsLEKgD5qgkAIB8wOsM9JIW52hyDcDWHLzVAXkSWgIuGv7EP0l1\n' +
'atmGWnjIP0sQ/GYu4MYTMYeq5de2w9iti+L0lgeaHjxB3ZXTPdVn4a1Z1sNCSCpV\n' +
'rGRZ0TFkhQKBgB9sW6hK3LFiVLipu5gJHT0G08xmgt00LmIpUcLkDnM+cMDTOIqr\n' +
'OZnGcNKWSKIPlgUo4fQ+/uk3q4igP0WdHq4d/PGiyxVj0HNkCxUYlVBSvrQp1MQP\n' +
'u+fXmZ0SDoBURLpLtzAyVTOcTuiB3rqrOjoXsMUeiq4qRxbU1HoK/DLnAoGBAIkH\n' +
'NmH8f760QLeEZIoplToLAtmydTYyAXI0sFoqv0+nfz8JhL5vnvekws/TDYZZ7Y3E\n' +
'hE9IrNv5+TdqZ5BknwlYsguIA5jsipbxdy9AwbDCLAXz8O3dIqAVG3wz29kv1gPe\n' +
'KWDfzpNEcidKD1oWlfRg0InimxX3Ml1to6ItHha5AoGAANfN73LBhFbu5mg1UJMJ\n' +
'MBK4+EPTw6U6//KVX2Z9eL0T8dLOwJocxgCMp+3ZOE0YFGwJ02L6r6+LLXO+3i9L\n' +
'0QmHIr3MlIsI/CnUKM2OB7DRNNlTXPlEoSvG2jEJXV91wYUzz59Py8Ksz8npCox/\n' +
'YZcW7Bim5OeLhZi6W1XwdeQ=\n' +
'-----END PRIVATE KEY-----';
var key = new NodeRSA();
key.importKey(privateKey,"pkcs8-private");
key.importKey(publicKey,"pkcs8-public-pem");
const text = 'Hello World!Hello World!Hello World!Hello World!Hello World!Hello World!Hello World!Hello World!Hello World!Hello World!';
const encrypted = key.encrypt(text, 'base64');
console.log('encrypted: ', encrypted);
const decrypted = key.decrypt(encrypted, 'utf8');
console.log('decrypted: ', decrypted);
控制台输出如下所示:
encrypted: mrP7jADPSqGE2k8vigWImq06iYWHqcgUSQ4p8xbR5AzVPAafPAMmUB8vtrUxIT6VsVd/5rECxWswDREzZVSyl5JsfFlYbmXFxD+ZAwA/6dqvN6aaJ7HX4haRnB3QwENRRmWlnxOPOa99tewTCzOo7KrYRNswKX/dJPQhQldSFzvDKwj/4cVmJ0GBcnh0TMf+twubN+WBAcCX7XovTFeadrzOTKbh3MFtgrG78Ru+A34DQV10kinXCawIwC583WXd+nnH9iEGSUYDVrYgbQcAlBgnrXX46T56/peD0PemYDGFdnsyo8ANtY691KzoXWl53LxKdar78kwRZKsAwn/97Q==
decrypted: Hello World!Hello World!Hello World!Hello World!Hello World!Hello World!Hello World!Hello World!Hello World!Hello World!
3.使用Java来进行加减密
import javax.crypto.BadPaddingException;
import javax.crypto.Cipher;
import javax.crypto.IllegalBlockSizeException;
import javax.crypto.NoSuchPaddingException;
import java.io.UnsupportedEncodingException;
import java.security.*;
import java.security.interfaces.RSAPrivateKey;
import java.security.spec.InvalidKeySpecException;
import java.security.spec.PKCS8EncodedKeySpec;
import java.security.spec.X509EncodedKeySpec;
import java.util.Base64;
public class TestRSA {
public static void main(String[] args) throws NoSuchAlgorithmException, InvalidKeySpecException, NoSuchPaddingException, InvalidKeyException, BadPaddingException, IllegalBlockSizeException, UnsupportedEncodingException {
TestRSA testRSA = new TestRSA();
String data = "Hello World!Hello World!Hello World!Hello World!Hello World!Hello World!Hello World!Hello World!Hello World!Hello World!";
System.out.println(testRSA.encrypt(data));
System.out.println(testRSA.decrypt(testRSA.encrypt(data)));
}
private String encrypt(String data) throws NoSuchAlgorithmException, InvalidKeySpecException, NoSuchPaddingException, InvalidKeyException, BadPaddingException, IllegalBlockSizeException {
byte[] dataBytes = data.getBytes();
if (dataBytes.length > 214) throw new RuntimeException("不能一次性加密超过214字节的数据");
String pubKey =
"MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEApWe3IwXqKBducy2OG5AB" +
"hC/zKu75sVTiPLD1In72glnZhA2SWqONCZ+BvuT/t4ZB6cczbecAW4wuNiTYPtwq" +
"rMHeb/mgF3p95h7a2xNqhXHYD8+/wNp9MY6qfJgcaYRWoRW4LkVEZKeACVusYYp4" +
"3A/xaDq98gNlO22mlwLzjcrl1OIhcbXBXmuhTc4cirUmS0ex0XF2shA8UXMHEydH" +
"qSxH1ta4lUn9OcjiNDQMSm5HXPIbXlqDIjiZkSp+IZwcECrqTZhEWbZ/CFT68U1L" +
"eGcD0wUArSwQeZlCx9nnbhGPL4Gt7mgG4+4BFxdqORFHo064kmNQfTE6eGxTBKdw" +
"AwIDAQAB";
Base64.Decoder decoder = Base64.getDecoder();
byte[] keyBytes = decoder.decode(pubKey);
X509EncodedKeySpec spec = new X509EncodedKeySpec(keyBytes);
KeyFactory kf = KeyFactory.getInstance("RSA");
PublicKey pk = kf.generatePublic(spec);
byte[] cipherText;
Cipher cipher = Cipher.getInstance("RSA/ECB/OAEPWithSHA1AndMGF1Padding");
cipher.init(Cipher.ENCRYPT_MODE, pk);
cipherText = cipher.doFinal(dataBytes);
Base64.Encoder encoder = Base64.getEncoder();
return encoder.encodeToString(cipherText);
}
private String decrypt(String data) throws NoSuchAlgorithmException, InvalidKeySpecException, NoSuchPaddingException, InvalidKeyException, BadPaddingException, IllegalBlockSizeException, UnsupportedEncodingException {
String privateKey =
"MIIEvQIBADANBgkqhkiG9w0BAQEFAASCBKcwggSjAgEAAoIBAQClZ7cjBeooF25z" +
"LY4bkAGEL/Mq7vmxVOI8sPUifvaCWdmEDZJao40Jn4G+5P+3hkHpxzNt5wBbjC42" +
"JNg+3Cqswd5v+aAXen3mHtrbE2qFcdgPz7/A2n0xjqp8mBxphFahFbguRURkp4AJ" +
"W6xhinjcD/FoOr3yA2U7baaXAvONyuXU4iFxtcFea6FNzhyKtSZLR7HRcXayEDxR" +
"cwcTJ0epLEfW1riVSf05yOI0NAxKbkdc8hteWoMiOJmRKn4hnBwQKupNmERZtn8I" +
"VPrxTUt4ZwPTBQCtLBB5mULH2eduEY8vga3uaAbj7gEXF2o5EUejTriSY1B9MTp4" +
"bFMEp3ADAgMBAAECggEAaLyrF89X/bkQpHhVQxjGDQk75pTaobLJa3r2Trisqc/x" +
"T5A0e5aS6WQKiXGCh5jJRhpwc4hSDqZOYNSl5fAOScSdcLRV7mgPLtec6Bp8WjHD" +
"igeYOatgmS/ovuqnGx3EqU4SiaIs87uo9MQK/NztORQTXlfMDWKfCKmfUoJ47PBk" +
"jQ90xf/OHYvryv7F9ue+giv7g8o9SyyDy/uFGKsKIryMRifru9T4OTTNc9RA5hgg" +
"BsKyrhvUsqttPc1ESZFPM6q9P3gkFoasZS6bBfyKZzqd7fg0brGGujDrayvXT4nV" +
"dL1Qxu4gu/iWLO1XfdjMCSUhTeaMnFNgzl3+cfSKCQKBgQDzvkhvdQQZDvDZn9Zc" +
"jlMlXHf2X8jYrDWj8PgZJJywAZNS7cVWQWT1LzHApadasWAaJT3QlHEVf/oxBJJ2" +
"mpi/Ji3cqbLc+ILemD0eQk6+0+KED6mksU+0epM3C0npewR4mu+LdC4dMZ2sNx8x" +
"x9oa50WATBsrcritrIjMUrmM5wKBgQCtuPt1tW2bxF9WxzzqQB5JMemy3udkBWLg" +
"hjzTz9UG0XkxfwsLEKgD5qgkAIB8wOsM9JIW52hyDcDWHLzVAXkSWgIuGv7EP0l1" +
"atmGWnjIP0sQ/GYu4MYTMYeq5de2w9iti+L0lgeaHjxB3ZXTPdVn4a1Z1sNCSCpV" +
"rGRZ0TFkhQKBgB9sW6hK3LFiVLipu5gJHT0G08xmgt00LmIpUcLkDnM+cMDTOIqr" +
"OZnGcNKWSKIPlgUo4fQ+/uk3q4igP0WdHq4d/PGiyxVj0HNkCxUYlVBSvrQp1MQP" +
"u+fXmZ0SDoBURLpLtzAyVTOcTuiB3rqrOjoXsMUeiq4qRxbU1HoK/DLnAoGBAIkH" +
"NmH8f760QLeEZIoplToLAtmydTYyAXI0sFoqv0+nfz8JhL5vnvekws/TDYZZ7Y3E" +
"hE9IrNv5+TdqZ5BknwlYsguIA5jsipbxdy9AwbDCLAXz8O3dIqAVG3wz29kv1gPe" +
"KWDfzpNEcidKD1oWlfRg0InimxX3Ml1to6ItHha5AoGAANfN73LBhFbu5mg1UJMJ" +
"MBK4+EPTw6U6//KVX2Z9eL0T8dLOwJocxgCMp+3ZOE0YFGwJ02L6r6+LLXO+3i9L" +
"0QmHIr3MlIsI/CnUKM2OB7DRNNlTXPlEoSvG2jEJXV91wYUzz59Py8Ksz8npCox/" +
"YZcW7Bim5OeLhZi6W1XwdeQ=";
//64位解码加密后的字符串
Base64.Decoder decoder = Base64.getDecoder();
byte[] inputByte = decoder.decode(data.getBytes("UTF-8"));
//base64编码的私钥
byte[] decoded = decoder.decode(privateKey);
RSAPrivateKey priKey = (RSAPrivateKey) KeyFactory.getInstance("RSA").generatePrivate(new PKCS8EncodedKeySpec(decoded));
//RSA解密
Cipher cipher = Cipher.getInstance("RSA/ECB/OAEPWithSHA1AndMGF1Padding");
cipher.init(Cipher.DECRYPT_MODE, priKey);
return new String(cipher.doFinal(inputByte));
}
}
控制台输出如下所示:
lsFkcMewpiH2V6znNHV+ccqmpqbAC17aSZ5noEEg7djxXUcCEMx1EmUYKsXeolWIvXlh0D+OxGLVc1z5uCGwMFve9BOvGRyjkMSXFrsvvTxlqc4diZZ1wAmcRd9sKnYFD1LB/k3ewJkSHAj5ejmdANXXOtRuiqtyhWzbmIpmzpNfsywF1nkjJvuuOWipQXeh/+BtQyxMrASVg9mBA/8QWb7ovfW7MpbxW8Chtsb/BBTqbAACaY7LZ2oIeK0FN27lpUojEqL5/1LFv2GGrK/XK0GWnp00SAaGS/N4AkTbQ9Ba8wgO8xKyTRbhZgDoPpi5uJPbsW0aDzONPEJliPQCVA==
Hello World!Hello World!Hello World!Hello World!Hello World!Hello World!Hello World!Hello World!Hello World!Hello World!
4.node-rsa 于 java rsa 加减密互调
4.1使用Java调用node加密的内容:
将java文件的main函数改为:
public static void main(String[] args) throws NoSuchAlgorithmException, InvalidKeySpecException, NoSuchPaddingException, InvalidKeyException, BadPaddingException, IllegalBlockSizeException, UnsupportedEncodingException {
TestRSA testRSA = new TestRSA();
System.out.println(testRSA.decrypt("mrP7jADPSqGE2k8vigWImq06iYWHqcgUSQ4p8xbR5AzVPAafPAMmUB8vtrUxIT6VsVd/5rECxWswDREzZVSyl5JsfFlYbmXFxD+ZAwA/6dqvN6aaJ7HX4haRnB3QwENRRmWlnxOPOa99tewTCzOo7KrYRNswKX/dJPQhQldSFzvDKwj/4cVmJ0GBcnh0TMf+twubN+WBAcCX7XovTFeadrzOTKbh3MFtgrG78Ru+A34DQV10kinXCawIwC583WXd+nnH9iEGSUYDVrYgbQcAlBgnrXX46T56/peD0PemYDGFdnsyo8ANtY691KzoXWl53LxKdar78kwRZKsAwn/97Q=="));
}
控制台输出如下:
Hello World!Hello World!Hello World!Hello World!Hello World!Hello World!Hello World!Hello World!Hello World!Hello World!
4.2使用node调用java加密的内容:
const NodeRSA = require('node-rsa');
var publicKey = '-----BEGIN PUBLIC KEY-----\n' +
'MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEApWe3IwXqKBducy2OG5AB\n' +
'hC/zKu75sVTiPLD1In72glnZhA2SWqONCZ+BvuT/t4ZB6cczbecAW4wuNiTYPtwq\n' +
'rMHeb/mgF3p95h7a2xNqhXHYD8+/wNp9MY6qfJgcaYRWoRW4LkVEZKeACVusYYp4\n' +
'3A/xaDq98gNlO22mlwLzjcrl1OIhcbXBXmuhTc4cirUmS0ex0XF2shA8UXMHEydH\n' +
'qSxH1ta4lUn9OcjiNDQMSm5HXPIbXlqDIjiZkSp+IZwcECrqTZhEWbZ/CFT68U1L\n' +
'eGcD0wUArSwQeZlCx9nnbhGPL4Gt7mgG4+4BFxdqORFHo064kmNQfTE6eGxTBKdw\n' +
'AwIDAQAB\n' +
'-----END PUBLIC KEY-----';
var privateKey = '-----BEGIN PRIVATE KEY-----\n' +
'MIIEvQIBADANBgkqhkiG9w0BAQEFAASCBKcwggSjAgEAAoIBAQClZ7cjBeooF25z\n' +
'LY4bkAGEL/Mq7vmxVOI8sPUifvaCWdmEDZJao40Jn4G+5P+3hkHpxzNt5wBbjC42\n' +
'JNg+3Cqswd5v+aAXen3mHtrbE2qFcdgPz7/A2n0xjqp8mBxphFahFbguRURkp4AJ\n' +
'W6xhinjcD/FoOr3yA2U7baaXAvONyuXU4iFxtcFea6FNzhyKtSZLR7HRcXayEDxR\n' +
'cwcTJ0epLEfW1riVSf05yOI0NAxKbkdc8hteWoMiOJmRKn4hnBwQKupNmERZtn8I\n' +
'VPrxTUt4ZwPTBQCtLBB5mULH2eduEY8vga3uaAbj7gEXF2o5EUejTriSY1B9MTp4\n' +
'bFMEp3ADAgMBAAECggEAaLyrF89X/bkQpHhVQxjGDQk75pTaobLJa3r2Trisqc/x\n' +
'T5A0e5aS6WQKiXGCh5jJRhpwc4hSDqZOYNSl5fAOScSdcLRV7mgPLtec6Bp8WjHD\n' +
'igeYOatgmS/ovuqnGx3EqU4SiaIs87uo9MQK/NztORQTXlfMDWKfCKmfUoJ47PBk\n' +
'jQ90xf/OHYvryv7F9ue+giv7g8o9SyyDy/uFGKsKIryMRifru9T4OTTNc9RA5hgg\n' +
'BsKyrhvUsqttPc1ESZFPM6q9P3gkFoasZS6bBfyKZzqd7fg0brGGujDrayvXT4nV\n' +
'dL1Qxu4gu/iWLO1XfdjMCSUhTeaMnFNgzl3+cfSKCQKBgQDzvkhvdQQZDvDZn9Zc\n' +
'jlMlXHf2X8jYrDWj8PgZJJywAZNS7cVWQWT1LzHApadasWAaJT3QlHEVf/oxBJJ2\n' +
'mpi/Ji3cqbLc+ILemD0eQk6+0+KED6mksU+0epM3C0npewR4mu+LdC4dMZ2sNx8x\n' +
'x9oa50WATBsrcritrIjMUrmM5wKBgQCtuPt1tW2bxF9WxzzqQB5JMemy3udkBWLg\n' +
'hjzTz9UG0XkxfwsLEKgD5qgkAIB8wOsM9JIW52hyDcDWHLzVAXkSWgIuGv7EP0l1\n' +
'atmGWnjIP0sQ/GYu4MYTMYeq5de2w9iti+L0lgeaHjxB3ZXTPdVn4a1Z1sNCSCpV\n' +
'rGRZ0TFkhQKBgB9sW6hK3LFiVLipu5gJHT0G08xmgt00LmIpUcLkDnM+cMDTOIqr\n' +
'OZnGcNKWSKIPlgUo4fQ+/uk3q4igP0WdHq4d/PGiyxVj0HNkCxUYlVBSvrQp1MQP\n' +
'u+fXmZ0SDoBURLpLtzAyVTOcTuiB3rqrOjoXsMUeiq4qRxbU1HoK/DLnAoGBAIkH\n' +
'NmH8f760QLeEZIoplToLAtmydTYyAXI0sFoqv0+nfz8JhL5vnvekws/TDYZZ7Y3E\n' +
'hE9IrNv5+TdqZ5BknwlYsguIA5jsipbxdy9AwbDCLAXz8O3dIqAVG3wz29kv1gPe\n' +
'KWDfzpNEcidKD1oWlfRg0InimxX3Ml1to6ItHha5AoGAANfN73LBhFbu5mg1UJMJ\n' +
'MBK4+EPTw6U6//KVX2Z9eL0T8dLOwJocxgCMp+3ZOE0YFGwJ02L6r6+LLXO+3i9L\n' +
'0QmHIr3MlIsI/CnUKM2OB7DRNNlTXPlEoSvG2jEJXV91wYUzz59Py8Ksz8npCox/\n' +
'YZcW7Bim5OeLhZi6W1XwdeQ=\n' +
'-----END PRIVATE KEY-----';
var key = new NodeRSA();
key.importKey(privateKey,"pkcs8-private");
key.importKey(publicKey,"pkcs8-public-pem");
const decrypted = key.decrypt('lsFkcMewpiH2V6znNHV+ccqmpqbAC17aSZ5noEEg7djxXUcCEMx1EmUYKsXeolWIvXlh0D+OxGLVc1z5uCGwMFve9BOvGRyjkMSXFrsvvTxlqc4diZZ1wAmcRd9sKnYFD1LB/k3ewJkSHAj5ejmdANXXOtRuiqtyhWzbmIpmzpNfsywF1nkjJvuuOWipQXeh/+BtQyxMrASVg9mBA/8QWb7ovfW7MpbxW8Chtsb/BBTqbAACaY7LZ2oIeK0FN27lpUojEqL5/1LFv2GGrK/XK0GWnp00SAaGS/N4AkTbQ9Ba8wgO8xKyTRbhZgDoPpi5uJPbsW0aDzONPEJliPQCVA==', 'utf8');
console.log('decrypted: ', decrypted);
控制台输出为:
decrypted: Hello World!Hello World!Hello World!Hello World!Hello World!Hello World!Hello World!Hello World!Hello World!Hello World!
注意事项:
1.每次rsa加密产生的密文是不一样的,不同的密文解密可以得到相同的内容。如连续对同一对象(Hello World!Hello World!Hello World!Hello World!Hello World!Hello World!Hello World!Hello World!Hello World!Hello World!)运行两次加密运算得到结果如下:
第一次:
mrP7jADPSqGE2k8vigWImq06iYWHqcgUSQ4p8xbR5AzVPAafPAMmUB8vtrUxIT6VsVd/5rECxWswDREzZVSyl5JsfFlYbmXFxD+ZAwA/6dqvN6aaJ7HX4haRnB3QwENRRmWlnxOPOa99tewTCzOo7KrYRNswKX/dJPQhQldSFzvDKwj/4cVmJ0GBcnh0TMf+twubN+WBAcCX7XovTFeadrzOTKbh3MFtgrG78Ru+A34DQV10kinXCawIwC583WXd+nnH9iEGSUYDVrYgbQcAlBgnrXX46T56/peD0PemYDGFdnsyo8ANtY691KzoXWl53LxKdar78kwRZKsAwn/97Q==
第二次:
lgztt7wbgVSv7jEg9hrZ1WSPgGhX9dK2r3CEhw1R6cNxbjkFhi2c8HtJIgF96Y9xCNtZScKBa1gI9cD50IPV1FAo5Cm5IIf0Z7RxsYFkmDuCXpHWJS0fmgPf162lhQiGfDhZCnCCNu/8vsLAMnTDk5tpH/V6FMc4RTfzYMRALd6KurN7IUD1bpF8yzw8/KhkITFKV/+k3p3ft+3y7CMyoNigo+/yrqpeVTKek/V1UEINw/eAQGLaeLa58QSNXLFZ4Q53suUmxAfNz+7wzG/EmQ2MBVu6ofuGYZ/bcaCH7PF4mjnwKqCLuHlzP3NSsCsoxtF+8bGK/1eDRwlLGRix+A==