前几天调试一个RSA加密,遇到一些问题,在网上找了好久好久,与Node.js相关的资源少得非常可怜,最后还是靠自己一步一步解决了,今天把代码和一些心得拿出来分享一下:
cnode链接地址:https://cnodejs.org/topic/54d2de4cfbf1e531447acc95
一. 相关知识
这里推介几篇博客,在做加密解密之前先了解一下,我以前没做过,所以上网找了一些,提供大家参考。
算法原理1
算法原理2
关于密钥长度
关于填充
ursa模块
关于RSA的原理什么的,上面的文章有详细的介绍,这里不再赘述,下面开始加密/加密的操作。
二. 生成密钥对
/**
* 2015-02-03
* zhaomaoxin
* generate keys
*/
var fs = require('fs');
var ursa = require('ursa');
var modulusBit = 512;
var key = ursa.generatePrivateKey(modulusBit, 65537);
var privatePem = ursa.createPrivateKey(key.toPrivatePem()); //生成私钥
var privateKey = privatePem.toPrivatePem('utf8');
fs.writeFile('private.pem', privateKey, 'utf8', function(error){
if(error){
throw error;
}
console.log('\n私钥privateKey已经保存\n');
console.log('\n私钥privateKey:\n' + privateKey);
});
var publicPem = ursa.createPublicKey(key.toPublicPem()); //生成公钥
var publicKey = publicPem.toPublicPem('utf8');
fs.writeFile('public.pub', publicKey, 'utf8', function(error){
if(error){
throw error;
}
console.log('\n私钥publicKey已经保存\n');
console.log('\n私钥publicKey:\n' + publicKey);
});
说明: 将密钥写入文件或者直接使用打印出来,需要使用toPublicPem或者toPrivatePem转换成UTF8编码形式。
三. 密钥导入
加密/解密的双方各自生成密钥对,需保证能导入对方的密钥,并使用公钥进行加密 。
key.js
/**
* 2015-02-03
* zhaomaoxin
* import keys
*/
var ursa = require('ursa');
var client_public = '-----BEGIN PUBLIC KEY-----\n'+
'MFwwDQYJKoZIhvcNAQEBBQADSwAwSAJBAJ6d7vkyWjQpHDgpcwBxiAoecUZPeKA7\n'+
'5cCgZlnYnXNR08yPAzJuBUrTUODloj3OFxN2WE/VpPSQsu2KGpBIO9MCAwEAAQ==\n'+
'-----END PUBLIC KEY-----';
var client_private = '-----BEGIN RSA PRIVATE KEY-----\n'+
'MIIBVQIBADANBgkqhkiG9w0BAQEFAASCAT8wggE7AgEAAkEAnp3u+TJaNCkcOClz\n' +
'AHGICh5xRk94oDvlwKBmWdidc1HTzI8DMm4FStNQ4OWiPc4XE3ZYT9Wk9JCy7Yoa\n' +
'kEg70wIDAQABAkAZ0wDLVaVWBLNxeV4d3l4Vt6sdlWbAP8BCQlsnmZrY4WIIy1HE\n' &