易语言资源网 - 做最全的易语言资源下载社区
精易论坛授权登录

window.crypto库+QuickJs引擎封装及调用   [复制链接]

    2020-07-08 08:40:42
    模块控件源码
    易语言资源网
    4365 次浏览
    来源链接

经常看到有人要找 AES-GCM-128 这个算法加解密 网上相关的文档也较少
其中在telegram登录首页就在使用该算法 应该让不少哥们头疼

其实这个加密常见于浏览器内置接口 window.crypto.subtle

该接口不仅支持该类型的加密 且支持非常多的算法加密如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同理

-

解决方法

既然是浏览器提供用的JavaScript接口 那么前端大佬肯定要兼容一些落后的浏览器进行polyfill
经过大佬 @流星暴雨 的帮助 我找到相应的加密库 该库由 webpack 打包 且需 es6 以上的 JavaScript 引擎运行
这里可以用ChakraCore V8 等等引擎支持
那我这里借助 QuickJs引擎进行 es6 以上语法的支持
ps:QuickJs引擎 环境由@aizhiyuan 志远大佬补全
我进行扩充和封装   QuickJs:便携嵌入式引擎 dll大小200K大小 性能故没其他引擎高  但相对同类型引擎 算是最强的引擎

上图


与浏览器完全一致



点我下载 (已有 237 次下载)

引用模块


源码文件名 模块文件名
demo.e
QuickJS Engine.ec


引用支持库


源码文件名 支持库文件名 支持库标识
demo.e 系统核心支持库 5.7 d09f2340818511d396f6aaf844c7e325
特殊功能支持库 3.1 A512548E76954B6E92C21055517615B0
QuickJSEC.e 系统核心支持库 5.7 d09f2340818511d396f6aaf844c7e325
特殊功能支持库 3.1 A512548E76954B6E92C21055517615B0


[错误报告]   上一篇:服务器远程桌面管理助手开源 简洁版...     下一篇:软件守护源码