node.js 使用crypto模块进行RSA加解密操作
2017-09-12 21:00
621 查看
多余的话不说了,直接上代码
先在package.json配置文件里添加crypto模块的支持。
"dependencies": {
......
"crypto":"~1.0.1",
}
加密工具类:
注:公钥,私钥怎么生成这里不介绍了,网上很多。
生成后保存成pem文件,放到工程目录下引用即可
//加密解密类
var crypto = require('crypto');
var fs = require('fs');
var path = require('path');
/**
* RSA最大加密明文大小
*/
var MAX_ENCRYPT_BLOCK = 117-31;
/**
* RSA最大解密密文大小
*/
var MAX_DECRYPT_BLOCK = 128;
/**
* 公钥加密
* @param data
* @returns {string}
*/
function publicEncrypt(data) {
//得到公钥
var publicPem = fs.readFileSync(path.join(__dirname, "../../properties/rsa_public_key.pem"));//替换你自己的路径
var publicKey = publicPem.toString();
//加密信息用buf封装
var buf = new Buffer(data, "utf-8");
//buf转byte数组
var inputLen = buf.byteLength;
//密文
var bufs = [];
//开始长度
var offSet = 0;
//结束长度
var endOffSet = MAX_ENCRYPT_BLOCK;
//分段加密
while (inputLen - offSet > 0) {
if (inputLen - offSet > MAX_ENCRYPT_BLOCK) {
var bufTmp = buf.slice(offSet, endOffSet);
bufs.push(crypto.publicEncrypt({key: publicKey, padding: crypto.RSA_PKCS1_PADDING}, bufTmp));
} else {
var bufTmp = buf.slice(offSet, inputLen);
bufs.push(crypto.publicEncrypt({key: publicKey, padding: crypto.RSA_PKCS1_PADDING}, bufTmp));
}
offSet += MAX_ENCRYPT_BLOCK;
endOffSet += MAX_ENCRYPT_BLOCK;
}
var result = Buffer.concat(bufs);
//密文BASE64编码
var base64Str = result.toString("base64");
console.log(base64Str);
return base64Str;
}
/**
* 公钥解密
* @param date
* @returns {string}
*/
function publicDecrypt(date) {
//得到私钥
var publicPem = fs.readFileSync(path.join(__dirname, "../../properties/rsa_public_key.pem"));//替换你自己的路径
var publicKey = publicPem.toString();
//经过base64编码的密文转成buf
var buf = new Buffer(date, "base64");
//buf转byte数组
//var inputLen = bytes(buf, "base64");
var inputLen = buf.byteLength;
//密文
var bufs = [];
//开始长度
var offSet = 0;
//结束长度
var endOffSet = MAX_DECRYPT_BLOCK;
//分段加密
while (inputLen - offSet > 0) {
if (inputLen - offSet > MAX_DECRYPT_BLOCK) {
var bufTmp = buf.slice(offSet, endOffSet);
bufs.push(crypto.publicDecrypt({key: publicKey, padding: crypto.RSA_PKCS1_PADDING}, bufTmp));
} else {
var bufTmp = buf.slice(offSet, inputLen);
bufs.push(crypto.publicDecrypt({key: publicKey, padding: crypto.RSA_PKCS1_PADDING}, bufTmp));
}
offSet += MAX_DECRYPT_BLOCK;
endOffSet += MAX_DECRYPT_BLOCK;
}
var result = Buffer.concat(bufs).toString();
console.log(result);
return result;
}
/**
* 私钥加密
* @param date
* @returns {string}
*/
function privateEncrypt(date) {
//得到私钥
var privatePem = fs.readFileSync(path.join(__dirname, "../../properties/rsa_private_key.pem"));
var privateKey = privatePem.toString();
//经过base64编码的密文转成buf
var buf = new Buffer(date, "utf-8");
//buf转byte数组
var inputLen = buf.byteLength;
//密文
var bufs = [];
//开始长度
var offSet = 0;
//结束长度
var endOffSet = MAX_ENCRYPT_BLOCK;
//分段加密
while (inputLen - offSet > 0) {
if (inputLen - offSet > MAX_ENCRYPT_BLOCK) {
var bufTmp = buf.slice(offSet, endOffSet);
bufs.push(crypto.privateEncrypt({key: privateKey, padding: crypto.RSA_PKCS1_PADDING}, bufTmp));
} else {
var bufTmp = buf.slice(offSet, inputLen);
bufs.push(crypto.privateEncrypt({key: privateKey, padding: crypto.RSA_PKCS1_PADDING}, bufTmp));
}
offSet += MAX_ENCRYPT_BLOCK;
endOffSet += MAX_ENCRYPT_BLOCK;
}
var result = Buffer.concat(bufs);
//密文BASE64编码
var base64Str = result.toString("base64");
console.log(base64Str);
return base64Str;
}
/**
* 私钥解密
* @param date
* @returns {string}
*/
function privateDecrypt(date) {
//得到私钥
var privatePem = fs.readFileSync(path.join(__dirname, "../../properties/rsa_private_key.pem"));
var privateKey = privatePem.toString();
//经过base64编码的密文转成buf
var buf = new Buffer(date, "base64");
//buf转byte数组
//var inputLen = bytes(buf, "base64");
var inputLen = buf.byteLength;
//密文
var bufs = [];
//开始长度
var offSet = 0;
//结束长度
var endOffSet = MAX_DECRYPT_BLOCK;
//分段加密
while (inputLen - offSet > 0) {
if (inputLen - offSet >
b7d1
MAX_DECRYPT_BLOCK) {
var bufTmp = buf.slice(offSet, endOffSet);
bufs.push(crypto.privateDecrypt({key: privateKey, padding: crypto.RSA_PKCS1_PADDING}, bufTmp));
} else {
var bufTmp = buf.slice(offSet, inputLen);
bufs.push(crypto.privateDecrypt({key: privateKey, padding: crypto.RSA_PKCS1_PADDING}, bufTmp));
}
offSet += MAX_DECRYPT_BLOCK;
endOffSet += MAX_DECRYPT_BLOCK;
}
var result = Buffer.concat(bufs).toString();
console.log(result);
//解密
return result;
}
module.exports.publicEncrypt = publicEncrypt;
module.exports.publicDecrypt = publicDecrypt;
module.exports.privateEncrypt = privateEncrypt;
module.exports.privateDecrypt = privateDecrypt;
使用:
var str = cryptoUtil.publicEncrypt("123456789");//公钥加密
var deStr = cryptoUtil.privateDecrypt(str);//私钥解密
完。
先在package.json配置文件里添加crypto模块的支持。
"dependencies": {
......
"crypto":"~1.0.1",
}
加密工具类:
注:公钥,私钥怎么生成这里不介绍了,网上很多。
生成后保存成pem文件,放到工程目录下引用即可
//加密解密类
var crypto = require('crypto');
var fs = require('fs');
var path = require('path');
/**
* RSA最大加密明文大小
*/
var MAX_ENCRYPT_BLOCK = 117-31;
/**
* RSA最大解密密文大小
*/
var MAX_DECRYPT_BLOCK = 128;
/**
* 公钥加密
* @param data
* @returns {string}
*/
function publicEncrypt(data) {
//得到公钥
var publicPem = fs.readFileSync(path.join(__dirname, "../../properties/rsa_public_key.pem"));//替换你自己的路径
var publicKey = publicPem.toString();
//加密信息用buf封装
var buf = new Buffer(data, "utf-8");
//buf转byte数组
var inputLen = buf.byteLength;
//密文
var bufs = [];
//开始长度
var offSet = 0;
//结束长度
var endOffSet = MAX_ENCRYPT_BLOCK;
//分段加密
while (inputLen - offSet > 0) {
if (inputLen - offSet > MAX_ENCRYPT_BLOCK) {
var bufTmp = buf.slice(offSet, endOffSet);
bufs.push(crypto.publicEncrypt({key: publicKey, padding: crypto.RSA_PKCS1_PADDING}, bufTmp));
} else {
var bufTmp = buf.slice(offSet, inputLen);
bufs.push(crypto.publicEncrypt({key: publicKey, padding: crypto.RSA_PKCS1_PADDING}, bufTmp));
}
offSet += MAX_ENCRYPT_BLOCK;
endOffSet += MAX_ENCRYPT_BLOCK;
}
var result = Buffer.concat(bufs);
//密文BASE64编码
var base64Str = result.toString("base64");
console.log(base64Str);
return base64Str;
}
/**
* 公钥解密
* @param date
* @returns {string}
*/
function publicDecrypt(date) {
//得到私钥
var publicPem = fs.readFileSync(path.join(__dirname, "../../properties/rsa_public_key.pem"));//替换你自己的路径
var publicKey = publicPem.toString();
//经过base64编码的密文转成buf
var buf = new Buffer(date, "base64");
//buf转byte数组
//var inputLen = bytes(buf, "base64");
var inputLen = buf.byteLength;
//密文
var bufs = [];
//开始长度
var offSet = 0;
//结束长度
var endOffSet = MAX_DECRYPT_BLOCK;
//分段加密
while (inputLen - offSet > 0) {
if (inputLen - offSet > MAX_DECRYPT_BLOCK) {
var bufTmp = buf.slice(offSet, endOffSet);
bufs.push(crypto.publicDecrypt({key: publicKey, padding: crypto.RSA_PKCS1_PADDING}, bufTmp));
} else {
var bufTmp = buf.slice(offSet, inputLen);
bufs.push(crypto.publicDecrypt({key: publicKey, padding: crypto.RSA_PKCS1_PADDING}, bufTmp));
}
offSet += MAX_DECRYPT_BLOCK;
endOffSet += MAX_DECRYPT_BLOCK;
}
var result = Buffer.concat(bufs).toString();
console.log(result);
return result;
}
/**
* 私钥加密
* @param date
* @returns {string}
*/
function privateEncrypt(date) {
//得到私钥
var privatePem = fs.readFileSync(path.join(__dirname, "../../properties/rsa_private_key.pem"));
var privateKey = privatePem.toString();
//经过base64编码的密文转成buf
var buf = new Buffer(date, "utf-8");
//buf转byte数组
var inputLen = buf.byteLength;
//密文
var bufs = [];
//开始长度
var offSet = 0;
//结束长度
var endOffSet = MAX_ENCRYPT_BLOCK;
//分段加密
while (inputLen - offSet > 0) {
if (inputLen - offSet > MAX_ENCRYPT_BLOCK) {
var bufTmp = buf.slice(offSet, endOffSet);
bufs.push(crypto.privateEncrypt({key: privateKey, padding: crypto.RSA_PKCS1_PADDING}, bufTmp));
} else {
var bufTmp = buf.slice(offSet, inputLen);
bufs.push(crypto.privateEncrypt({key: privateKey, padding: crypto.RSA_PKCS1_PADDING}, bufTmp));
}
offSet += MAX_ENCRYPT_BLOCK;
endOffSet += MAX_ENCRYPT_BLOCK;
}
var result = Buffer.concat(bufs);
//密文BASE64编码
var base64Str = result.toString("base64");
console.log(base64Str);
return base64Str;
}
/**
* 私钥解密
* @param date
* @returns {string}
*/
function privateDecrypt(date) {
//得到私钥
var privatePem = fs.readFileSync(path.join(__dirname, "../../properties/rsa_private_key.pem"));
var privateKey = privatePem.toString();
//经过base64编码的密文转成buf
var buf = new Buffer(date, "base64");
//buf转byte数组
//var inputLen = bytes(buf, "base64");
var inputLen = buf.byteLength;
//密文
var bufs = [];
//开始长度
var offSet = 0;
//结束长度
var endOffSet = MAX_DECRYPT_BLOCK;
//分段加密
while (inputLen - offSet > 0) {
if (inputLen - offSet >
b7d1
MAX_DECRYPT_BLOCK) {
var bufTmp = buf.slice(offSet, endOffSet);
bufs.push(crypto.privateDecrypt({key: privateKey, padding: crypto.RSA_PKCS1_PADDING}, bufTmp));
} else {
var bufTmp = buf.slice(offSet, inputLen);
bufs.push(crypto.privateDecrypt({key: privateKey, padding: crypto.RSA_PKCS1_PADDING}, bufTmp));
}
offSet += MAX_DECRYPT_BLOCK;
endOffSet += MAX_DECRYPT_BLOCK;
}
var result = Buffer.concat(bufs).toString();
console.log(result);
//解密
return result;
}
module.exports.publicEncrypt = publicEncrypt;
module.exports.publicDecrypt = publicDecrypt;
module.exports.privateEncrypt = privateEncrypt;
module.exports.privateDecrypt = privateDecrypt;
使用:
var str = cryptoUtil.publicEncrypt("123456789");//公钥加密
var deStr = cryptoUtil.privateDecrypt(str);//私钥解密
完。
相关文章推荐
- 使用node.js中的async模块进行数据库的同步操作
- node.js 使用fs模块对系统文件及目录进行读写操作
- nw.js node-webkit系列(15)如何使用内部模块和第三方模块进行开发
- Java-web下使用RSA进行加密解密操作
- Java-web下使用RSA进行加密解密操作
- Node.js使用orm2进行update操作时关联字段无法修改的解决方法
- Node.js基本模块crypto(加解密)
- node.js使用mongodb进行删除操作和修改操作
- node.js基于fs模块对系统文件及目录进行读写操作的方法详解
- Node.js 使用RSA加密/解密
- Node.js 基于 ursa 模块的 RSA 加密解密(已与IOS,Android实现加密通信)
- node.js学习笔记(二)--使用mongoose简单的CRUD操作及测试模块mocha的使用
- 使用JS获取页面中hidden的extender控件的ID并进行操作
- 未能使用提供程序 "RsaProtectedConfigurationProvider" 进行解密 的解决办法
- 配置错误:未能使用提供程序“RsaProtectedConfigurationProvider”进行解密。提供程序返回错误信息为: 打不开 RSA 密钥容器。
- Java中使用OpenSSL生成的RSA公私钥进行数据加解密
- node.js 第三方模块如何安装(使用npm)及介绍
- 未能使用提供程序“RsaProtectedConfigurationProvider”进行解密
- 配置错误:未能使用提供程序“RsaProtectedConfigurationProvider”进行解密。提供程序返回错误信息为: 打不开 RSA 密钥容器。
- 未能使用提供程序 "RsaProtectedConfigurationProvider" 进行解密 的解决办法