JavaScript RSA 非对称加密

使用 JSEncrypt 完成 JavaScript 非对称加密。

假定整个加解密过程中使用的密钥如下。

公钥:

-----BEGIN PUBLIC KEY-----
MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQC5A/TPEmOQYgT2po11qvjeBUPE
dqUEz1Z7MeHH7KI2p74pYK8RsvYngy1cH/wnMXmsf+Wb3tmlqNGa7atW8wlpSfXX
QV9bFECPEVRnESo8xtN7ZAlJFcdRvBVgfVwC3m9HWpVvKnd9NREXIcg5NHh57q7u
lsGCZJ2VOJm9EIgFEwIDAQAB
-----END PUBLIC KEY-----

私钥:

-----BEGIN RSA PRIVATE KEY-----
MIICXQIBAAKBgQC5A/TPEmOQYgT2po11qvjeBUPEdqUEz1Z7MeHH7KI2p74pYK8R
svYngy1cH/wnMXmsf+Wb3tmlqNGa7atW8wlpSfXXQV9bFECPEVRnESo8xtN7ZAlJ
FcdRvBVgfVwC3m9HWpVvKnd9NREXIcg5NHh57q7ulsGCZJ2VOJm9EIgFEwIDAQAB
AoGBALcfBVVXHBiyC7udSfInET+e8l4oGFjUZwJ0csaQnlV+XadSvLTF7wFYwrKm
LcsVGxrzU+2c+ssOdrfjeW0MDEjrbd1xtmayP8Kh2/Pg+9jZqj188tTlLwzUW6iz
KDEpiG5P1f1cbKY+R/BHQIKt7vcd2QMNVctxSkjl1uSvU/ERAkEA7uCuAJsVgmui
NjDscoXyj+QRFWqDnUNCZqSqjYw7/BC36xYg/Xolw/bqg9aTgua96fv9k9hExOBY
eNV3mj63bwJBAMZG7J5/vc3bkVwOS3A5E8j4hwCIFDylbKQ8chdulC3wwDLaSRdE
evUfhAmMev1cc4QiVaXzGKPcS9ko8Gdz2p0CQAftfvjYLMOSTOTdhMtcNKuf1w1N
5qZOeCKt7lcaQ1dfOqtbpaaj6iLxy+CqO2UJwV3FlinU8JtUEruX4gtFb5MCQGgb
l2RFuHhdgH5wdwXOwme0rtYFnXKWfWvi3RkWk7FnhtNssBIKf/EzAhYtb+qWX4US
rhv7f4WSRzUX/NqlBzUCQQCfDpC5/DZ/7RMKbDj7inW2G/3T56jzCdicIAgN0erZ
jcbB7+8VQLjcw5LFYPwgjjz5v6Amw42VY+dBUNWVEH9C
-----END RSA PRIVATE KEY-----

JSEncrypt 使用私钥加密示例:

// 创建 RSA 对象
var crypt = new JSEncrypt();

// 私钥
var private_key = "-----BEGIN RSA PRIVATE KEY-----...";

crypt.setPrivateKey(private_key);

var encrypted = crypt.encrypt('123456');

得到结果:

bC8nemetJfmenSldUccrHcY+aMVBO1ANYJky42vKhv+8iMmecAmDSalOj/065+AZBRhsWuT0C26A5IJTnI9COpA3L1xV54Mwz8j3Y0DdGRqaAFH+lkibVj/JOsTYfKVWnPMwc0D/EL2IJdi18sct2s3CvGxp7+1sRayKSoPvTa8=

RSA 加密得到的密文每次都不一样, 因为加入了随机数。

JSEncrypt 使用公钥解密示例:

var crypt = new JSEncrypt();
var private_key = "-----BEGIN RSA PRIVATE KEY-----...";

crypt.setPrivateKey(private_key);

var decrypted = crypt.decrypt('123456');

PHP 使用私钥加密示例:

openssl_pkey_new(array('private_key_bits' => 1024));

PHP 使用公钥加密示例:

openssl_pkey_new(array('private_key_bits' => 1024));

JSEncrypt 同时支持自动创建公钥和私钥:

// 支持 512、1024、2048、4096
// key 越长, 生成密钥和加密时间越长
var crypt = new JSEncrypt({default_key_size: 1024});

// 获取公钥
var public_key = crypt.getPublicKey();

// 获取私钥
var private_key = crypt.getPrivateKey();

利用 JSEncrypt 可以完成在前端网页对密码等敏感信息进行加密,传输到服务器端再进行解密。

JSEncrypt 项目地址:https://github.com/travist/jsencrypt

在 JSEncrypt 基础上实现的在线工具 —— RSA 加密解密

JavaScript 箭头函数 —— Arrow Function

Arrow Function 是 ECMAScript6 中的新特性。

先看两个酷炫的箭头函数示例:

var a1 = [
	"Hydrogen",
	"Helium",
	"Lithium",
	"Beryl­lium"
];

var a2 = a1.map(function(i){ return i.length });

var a3 = a1.map( i => i.length );

更炫

var b1 = [4, 3, 2, 1];

var b2 = b1.sort(function(i, j){ return i > j });

var b3 = b1.sort((i, j) => i > j);

在最新版的 Firefox 中可以体验这种特性。

Arrow Function map

Arrow Function sort