window.crypto.subtle仅支持https站点,和 127.0.0.1这样的可信任站点

    const pemEncodedKey = `-----BEGIN PUBLIC KEY-----
MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAxiuhgssxHclogWzB7OGy
vkIB+HGUO4hODykrz3c0/SBLJZc78mq7VaL3EnicGpoXFJkao3I+1C7MD5Jpa27b
Sc22veI0frbd/nbiSutvwAnf3rpVJEQtFTMz3v4OpSRcjOhIxKsL6iZ0JTt5++gk
sqeyrMtk5myAgho9JTnK7fPCrT7AZb/VaGc9NlWL2+9nTypLr2pew53o24nhWS5w
IgJM4X0M08YB3meXR/Q/CamgtI7+DEdubTfNwc9YCTuH6q3P7oqP/1X5Al+UHnoY
OITJJfFRBQ4zrzJU8lMQm3hy3ZSdsiP1vVqfoqQ2pu5IoL3OSgQEGVSp/OndwVz7
AQIDAQAB
-----END PUBLIC KEY-----`;
    function str2ab(str) {
        const buf = new ArrayBuffer(str.length);
        const bufView = new Uint8Array(buf);
        for (let i = 0, strLen = str.length; i < strLen; i++) {
            bufView[i] = str.charCodeAt(i);
        return buf;
    function importPrivateKey(pem) {
        const pemHeader = "-----BEGIN PRIVATE KEY-----";
        const pemFooter = "-----END PRIVATE KEY-----";
        const pemContents = pem.substring(pemHeader.length, pem.length - pemFooter.length);
        const binaryDerString = window.atob(pemContents);
        const binaryDer = str2ab(binaryDerString);
        return window.crypto.subtle.importKey(
            "spki",
            binaryDer,
                name: "RSA-OAEP",
                hash: "SHA-1", // 需要注意散列方式要和后端解密对其,python默认是SHA-1
            true,
            ["encrypt"]
    function encryptMessage(publicKey) {
        let enc = new TextEncoder();
        const data =  enc.encode('admin@123456');
        return window.crypto.subtle.encrypt({
                name: "RSA-OAEP",
                hash: 'SHA-1'
            publicKey,
            data);
    async function encrpt(){
        const key = await importPrivateKey(pemEncodedKey);
        const password = await encryptMessage(key);
        const _password = window.btoa(String.fromCharCode(...new Uint8Array(password)));
        console.log(_password)
    encrpt()
				
经常看到有人要找AES-GCM-128  这个算法加解密 网上相关的文档也较少其中在telegram登录首页就在使用该算法 应该让不少哥们头疼 其实这个加密常见于浏览器内置接口window.crypto.subtle 该接口不仅支持该类型的加密 且支持非常多的算法加密RSA  等等  这里就演示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 =gt; {         window.crypto.subtle.encrypt({                 name: algorithm,                 iv: iv         ).then(result =gt; {             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()。
密码学我了解的很少,但是在逆向中这却是非常重要的基础。这个Crypto函数库是windows自带的,我实现了散列算法MD5[128位], 对称加密算法AES[256位]以及RSA算法。散列函数实现改几个参数就能成SHA算法了。 1. MD5 // 单向散列函数 BOOL OneWayHash(PBYTE pData, DWORD dwSize, ALG_ID cType) HCRYPTPROV hCryptProv = NULL; HCRYPTHASH hCryptHash = NULL;
参考:https://developer.mozilla.org/zh-CN/docs/Web/API/SubtleCrypto 什么是SubtleCrypto SubtleCrypto接口提供了许多底层加密功能, 可以使用它来进行加密和密钥管理 创建SubtleCrypto对象 # 注意是小写的crypto var cpt = crypto.subtle; Chrome Console 测试如下
    在JS中经常使用Math.Random|()函数来产生随机数,但这个函数产生的随机数并不具有真正的随机性,而且加密型不够强。因此在特定的需要加密性强的安全随机数时,可以使用JS提供的windows.crypto来生成随机数。     Window.crypto只读属性返回与全局对象关联的 Crypto对象。 这个对象允许网页访问某些加密相关服务。     为了确保足够的性能,不使用真正的随机数生成器,但是它们正在使用具有足够熵值伪随机数生成器。它所使用的 PRNG 的实现与其他不同,但适用于加密的用
1、md5加密:前端可以加密,不可以解密 2、crypto加密: 前端可加密、解密常用于“记住密码”, 存cookie import CryptoJS from "crypto-js"; //设置cookie setCookie(portId, psw, exdays) { // Encrypt,加密账号密码 const userName = CryptoJS.AES.encrypt( portId+'', "secretkey123"