经常看到有人要找 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大小 性能故没其他引擎高 但相对同类型引擎 算是最强的引擎
上图
与浏览器完全一致
完事 好久没发帖了 发个帖证明存活