精易论坛

标题: window.crypto库+QuickJs引擎封装及调用 [打印本页]

作者: Ossian    时间: 2020-7-1 22:02
标题: window.crypto库+QuickJs引擎封装及调用

经常看到有人要找 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大小 性能故没其他引擎高  但相对同类型引擎 算是最强的引擎


上图






与浏览器完全一致


完事 好久没发帖了 发个帖证明存活



(QuickJS 及 crypto)






作者: wmv520    时间: 2020-7-1 23:47
6666666666666
作者: chendipang    时间: 2020-7-2 00:01
看看啥好东西!!!!
作者: (ΘζΘ)    时间: 2020-7-2 01:16
至尊宝牛逼
作者: 1320840206    时间: 2020-7-2 06:17
66666666666666666666
作者: xslyhk    时间: 2020-7-2 06:35
谢谢分享哦
作者: 毒毒毒毒    时间: 2020-7-2 08:05
感谢感谢感谢感谢
作者: onefish    时间: 2020-7-2 08:27
#在这里快速回复#感谢
作者: ssxpvicp    时间: 2020-7-2 08:33
至尊宝牛逼
作者: sunmoonstar    时间: 2020-7-2 08:38
这个可以有、
作者: zyx521147    时间: 2020-7-2 08:52
至尊宝牛逼
作者: futiem    时间: 2020-7-2 09:44
与浏览器完全一致
作者: longsui48    时间: 2020-7-2 10:02
谢谢分享哦
作者: Fate    时间: 2020-7-2 10:04
感谢分享
作者: wjswzj0    时间: 2020-7-2 12:07
至尊宝牛逼
作者: huxian    时间: 2020-7-2 12:52
没有看懂干什么用的
作者: 凌云啊    时间: 2020-7-2 13:12
自尊宝牛逼自尊宝牛逼自尊宝牛逼自尊宝牛逼自尊宝牛逼自尊宝牛逼自尊宝牛逼自尊宝牛逼自尊宝牛逼自尊宝牛逼
作者: aa315324324    时间: 2020-7-2 13:17
6666666666666666666666

作者: 暴走的莎莉酱    时间: 2020-7-2 15:00
回帖查看
作者: chencong5025    时间: 2020-7-2 16:11
quickjs不错
作者: oin    时间: 2020-7-2 16:43
window.crypto库+QuickJs引擎封装及调用

作者: hipxh    时间: 2020-7-2 19:25
window.crypto库+QuickJs引擎封装及调用
作者: 枫眼    时间: 2020-7-3 04:00
6666666666666666666666666666666
作者: 橙_子    时间: 2020-7-3 09:05
666666666666666
作者: woshipqj    时间: 2020-7-3 10:53
没有看懂干什么用
作者: 2298174616    时间: 2020-7-3 15:13
111111111111111111111111111111111

作者: lzgking    时间: 2020-7-3 17:07
感谢分享~~~~~~~~~~~
作者: xzhero    时间: 2020-7-3 23:18
感谢分享~~~~~~~~~~~
作者: Kylin    时间: 2020-7-5 01:57
这个是不是可以防止抓包了
作者: 红桃じ简简箪箪    时间: 2020-7-5 22:17
新技能已get√
作者: 韦贝贝    时间: 2020-7-8 08:11
window.crypto库+QuickJs引擎封装及调用
作者: BlackMamba    时间: 2020-7-8 15:36

window.crypto库+QuickJs引擎封装及调用
作者: kevines    时间: 2020-7-10 20:22
不错,加群学习看看
作者: 楚留香    时间: 2020-7-24 22:24
支持开源~!感谢分享
作者: 杨明煜    时间: 2020-12-29 10:53
感谢分享..............
作者: singlecolor    时间: 2021-1-2 23:43
路过围观一下,顺便帮顶
作者: bdancerlc    时间: 2021-1-6 23:54
  1. qjs.Evel((new Date()).getTime()).toStringA()
复制代码


取时间戳,只返回后3位,用js组件可以正确返回13位,new Date() 也可以返回正确的字符串。
不知道是什么原因,看了一些例子,好像也没写错的地方,请大佬赐教。
----------------------------------------------------------------------------------------------------------
经过测试 new Date() 返回的不是现行时间,而是 "Thu Jan 01 1970 00:00:00 GMT+0000",感觉问题就出在这个地方。
----------------------------------------------------------------------------------------------------------
用2019-11月的 qjs.exe 测试 同样返回 "Thu Jan 01 1970 00:00:00 GMT+0000"
用2020-07-05 放出的 qjs.exe 测试能正确返回 当前时间,猜测 这个问题是否是早期版本的BUG。
不懂C ,希望大佬编译一个最新版的 dll,造福大家。

作者: Ossian    时间: 2021-1-26 21:59
bdancerlc 发表于 2021-1-6 23:54
取时间戳,只返回后3位,用js组件可以正确返回13位,new Date() 也可以返回正确的字符串。
不知道是什么 ...

才看见 不好意思
经过排查 quickjs.c 这个文件 date_now 函数下面由于没有加return 导致时间获取为0;附件已上传

QuickJS.zip

250.28 KB, 下载次数: 100, 下载积分: 精币 -2 枚


作者: 易语言不错    时间: 2021-3-24 17:14
好久没发帖了 发个帖证明存活
作者: byjimo    时间: 2021-3-31 00:01
这个有点太强了 真的是厉害
作者: Hiker    时间: 2021-4-13 12:15
大佬666啊 支持  
作者: 原阳喜洋洋电脑    时间: 2021-4-15 11:34
虽然看不懂,先下载以后学习吧
作者: westar11    时间: 2021-5-10 15:36
不错哦。研究一下
作者: 小王叔叔    时间: 2021-6-24 11:55
感谢楼主,向您学习
作者: 洞察小姐姐    时间: 2022-1-12 16:05
6666666666666666
作者: ghost12    时间: 2022-1-27 07:00
很好很强悍,坚持下去哦~
作者: czw-spider    时间: 2022-2-28 13:39
希望可以交流一下,把crypto.js 下载下来,出现了这个错误Error: Module 'asmCrypto' is not found. Download it from https://github.com/vibornoff/asmcrypto.js
作者: HuangQAQ    时间: 2022-3-2 22:22
谢谢谢谢谢
作者: legewudi    时间: 2022-9-24 16:31
部分电脑直接崩溃了 找不到dll某函数 呜呜呜
作者: Ossian    时间: 2022-9-25 02:12
legewudi 发表于 2022-9-24 16:31
部分电脑直接崩溃了 找不到dll某函数 呜呜呜

估计缺少了微软运行库,我这个dll不是MT编译的,所以只能到目标电脑下面安装运行库才能跑起来的
作者: aadada    时间: 2022-10-6 02:11
现在新出的很多网站都需要环境
作者: xy19981013    时间: 2023-3-8 22:28
6666666666666666666666666666666666666666
作者: xy19981013    时间: 2023-3-8 22:29
66666666666666666666666666666666666666666666666666
作者: xy19981013    时间: 2023-3-8 22:29
999999999999999999999999999999999999999999999999999999999999999
作者: a657938016    时间: 2023-11-7 12:17
大佬666啊 支持
作者: legewudi    时间: 2024-1-21 21:01
Ossian 发表于 2022-9-25 02:12
估计缺少了微软运行库,我这个dll不是MT编译的,所以只能到目标电脑下面安装运行库才能跑起来的 ...

Visual C++ 2015 Redistributable  要安装 这个包 缺少 VCRUNTIME140.DLL
作者: 互撸娃666    时间: 2024-9-10 23:55
不支持BigInt 有办法实现不




欢迎光临 精易论坛 (https://125.confly.eu.org/) Powered by Discuz! X3.4