window.crypto库QuickJs引擎封装及调用

易语言 2020-07-02 15:15:38

window.crypto库QuickJs引擎封装及调用

该接口不仅支持该类型的加密 且支持非常多的算法加密如RSA DES 等等 这里就演示AES-GCM-128这个类型
crypto-AES-GCM-128调用例子
function ___crypto__test(keyData, iv, data) {
const format = "raw",
// keyData = new Uint8Array([23, 113, 57, 6, 35, -69, -60, 98, 84, -17, -125, -49, 18, 6, -92, 32]),
algorithm = "AES-GCM",
extractable = true,
usages = ["encrypt", "decrypt"];
// iv = new Uint8Array([47, 46, 123, 78, 36, 14, 109, 50, 121, 64, 11, 38]);
window.crypto.subtle.importKey(
format,
keyData,
algorithm,
extractable, usages
).then(key => {
window.crypto.subtle.encrypt({
name: algorithm,
iv: iv
},
key,
data
).then(result => {
console.log(Array.from(new Uint8Array((result))))
})

})
}

console.log(___crypto__test(
new Uint8Array([23, 113, 57, 6, 35, -69, -60, 98, 84, -17, -125, -49, 18, 6, -92, 32]),
new Uint8Array([47, 46, 123, 78, 36, 14, 109, 50, 121, 64, 11, 38]),
new Uint8Array([50, 49, 48])
))
crypto主要相关接口介绍
crypto.subtle.importKey

const result = crypto.subtle.importKey(
format,
keyData,
algorithm,
extractable,
usages
);
format 是一个字符串,描述要导入的密钥的数据格式。可以是以下之一:
----------raw:原始格式。
----------pkcs8:PKCS#8格式。
----------spki:SubjectPublicKeyInfo格式。
----------jwk:JSON Web密钥格式。
keyData是ArrayBuffer,TypedArray,a DataView或JSONWebKey包含给定格式的键的对象。

algorithm 是一个字典对象,用于定义要导入的密钥的类型并提供额外的算法特定参数。
对于RSASSA-PKCS1-v1_5, RSA-PSS或 RSA-OAEP:传递RsaHashedImportParams对象。
对于ECDSA或ECDH:传递 EcKeyImportParams对象。
对于HMAC:传递一个HmacImportParams对象。
对于AES-CTR,AES-CBC,AES-GCM或AES-KW:传递标识算法的字符串或形式为的对象{ "name": ALGORITHM },其中ALGORITHM 是算法的名称。
对于PBKDF2 :传递字符串PBKDF2。

extractable是Boolean表明它是否将有可能使用到导出密钥SubtleCrypto.exportKey()或SubtleCrypto.wrapKey()。

keyUsages是Array指示可以用钥匙做什么的指示。可能的数组值为:
----------encrypt:该键可用于发送encrypt消息。
----------decrypt:该键可用于发送decrypt消息。
----------sign:该键可用于发送sign消息。
----------verify:该密钥可用于verify签名。
----------deriveKey:可以在中使用密钥deriving a new key。
----------deriveBits:可以在中使用密钥deriving bits。
----------wrapKey:该键可能用于wrap a key。
----------unwrapKey:该键可能用于unwrap a key。
crypto.subtle.encrypt
const result = crypto.subtle.encrypt(algorithm,key,data);
algorithm是一个对象,用于指定要使用的算法以及所需的任何其他参数:
------------要使用RSA-OAEP,请传递一个RsaOaepParams对象。
------------要使用AES-CTR,请传递一个AesCtrParams对象。
------------要使用AES-CBC,请传递一个AesCbcParams对象。
------------要使用AES-GCM,请传递一个AesGcmParams对象。

key是CryptoKey包含用于加密的密钥。

data是一个BufferSource 包含要加密的数据(也称为纯文本)。

crypto.subtle.decrypt与encrypt同理。