前端RSA密钥生成和加解密window.crypto

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了前端RSA密钥生成和加解密window.crypto相关的知识,希望对你有一定的参考价值。

参考技术A

crypto API支持常用的rsa、aes加解密,这边介绍rsa的应用。

window.crypto需要chrome 37版本,ie 11,safari 11才支持全部API而基本的加解密在safari 7就可以。

crypto.subtle.generateKey(algorithm, extractable, keyUsages) ,其中:
1. algorithm 参数根据不同算法填入对应的参数对,rsa需要填入 RsaHashedKeyGenParams 对象包含有:

2. extractable 一般是true,表示是否允许以文本的方式导出key

3. keyUsages 是一个数组,里面可选 encrypt decrypt sign

函数结果返回一个promise对象,如果是对称加密会得到一个密钥 CryptoKey 类型,这边rsa会得到一个密钥对 CryptoKeyPair ,它有2个 CryptoKey 成员, privateKey publicKey ,我们导出密钥为文本或者加解密都将通过这2个成员对象。

window.crypto.subtle.exportKey(format, key) ,其中:
1. format 可选 raw pkcs8 spki jwk ,我们这边在导出公钥时选 spki ,私钥选 pkcs8

2. key 就是上面 CryptoKeyPair privateKey 或者 publicKey
函数返回一个promise对象,结果是一个ArrayBuffer,这边转成pem风格。

window.crypto.subtle.importKey(
format,
keyData,
algorithm,
extractable,
keyUsages
)
,其中:
1. format 可选 raw pkcs8 spki jwk ,对应之前生成时的选择,我们这边在导入公钥时选 spki ,私钥选 pkcs8

2. keyData ,即 window.crypto.subtle.exportKey 获得的ArrayBuffer,由于在这里时我们一般只有pem文本的,所以还需要做转换成ArrayBuffer。

3. algorithm 这边我们是rsa,需要填入一个 RsaHashedImportParams 对象,这边对应 crypto.subtle.generateKey 所需的 RsaHashedKeyGenParams 对象,含有:

4. extractable crypto.subtle.generateKey

5. keyUsages crypto.subtle.generateKey
函数返回一个promise对象,结果是一个 CryptoKey

加密 crypto.subtle.encrypt(algorithm, key, data) ,其中:
1. algorithm ,加解密只支持RSA-OAEP不支持RSAES-PKCS1-v1_5

2. key 即公钥的 CryptoKey 对象

3. data 是一个 BufferSource 对象,不能直接是要加密的字符串。
结果是一个ArrayBuffer,可以使用window.btoa(String.fromCharCode(...new Uint8Array(e)))输出为base64字符串

解密 crypto.subtle.decrypt(algorithm, key, data) ,基本同加密,这边data对应为加密返回的ArrayBuffer,如果是base64字符串比如从后端加密过来的,就需要转为Uint8Array。

返回值同加密

php中rsa生成公私钥和加解密

php中rsa生成公私钥和加解密

注意:php使用RSA时需要开启openssl扩展

生成公私钥

//创建公私钥
$res = openssl_pkey_new();

//获取私钥
openssl_pkey_export($res, $private_key);

//获取公钥
$public_key = openssl_pkey_get_details($res)[\'key\'];

//组合rsa
$rsa = [
    \'public_key\' => $public_key,
    \'private_key\' => $private_key,
];

echo "<pre/>";
var_dump($rsa);
exit;

结果:

rsa加解密

这里把上面获取的公私钥分别保存到变量 $public_key,$private_key

公钥加密,私钥解密

/**
 * 公钥加密
 */
$data = \'rsa加密解密\';

//解析公钥
$res = openssl_pkey_get_public($public_key);

//使用公钥加密数据
openssl_public_encrypt($data, $crypted, $res);

echo "<pre/>";
var_dump($crypted);
exit;

加密后结果:

/**
 * 私钥解密
 */

//解析私钥
$res = openssl_pkey_get_private($private_key);

//使用私钥解密数据
openssl_private_decrypt($crypted, $decrypted, $res);


echo "<pre/>";
var_dump($decrypted);
exit;

解密后结果:

私钥加密,公钥解密

/**
 * 私钥加密
 */
$data = \'rsa加密解密\';

//解析私钥
$res = openssl_pkey_get_private($private_key);

//使用私钥加密
openssl_private_encrypt($data, $crypted, $res);

/**
 * 公钥解密
 */

//解析公钥
$res = openssl_pkey_get_public($public_key);

openssl_public_decrypt($data, $decrypted, $res);


echo "<pre/>";
var_dump($decrypted);
exit;

结果和公钥加密,私钥解密差不多,这里就不截图了

使用场景

私钥加密,公钥解密: 用于签名

公钥加密,私钥解密: 用于加解密

关于使用场景这篇文章说的比较好:https://blog.csdn.net/bandaoyu/article/details/83997398

以上是关于前端RSA密钥生成和加解密window.crypto的主要内容,如果未能解决你的问题,请参考以下文章

前后端RSA互相加解密加签验签密钥对生成(Java)

NetCore 下使用RSA加密,解密;并且前端使用jsencrypt.js实现Rsa相关方法。

jsencrypt实现前端RSA非对称加密解密(vue项目)

VUE内使用RSA加解密

Java生成的RSA密钥对,用C#加密解密,怎么弄

你好,我刚接触Python,要做一个RSA密码加密,是这样的