AutoJs6

- Overview - 综述
- About - 关于文档
- Progress - 文档部署进度
- Changelog - 文档更新日志

- Manual - AutoJs6 使用手册
- Q & A - 疑难解答

- Global - 全局对象
- Automator - 自动化
- AutoJs6 - 本体应用
- App - 通用应用
- Color - 颜色
- Image - 图像
- OCR - 光学字符识别
- Barcode - 条码
- QR Code - 二维码
- Keys - 按键
- Device - 设备
- Storage - 储存
- File - 文件
- Engine - 引擎
- Task - 任务
- Module - 模块
- Plugins - 插件
- Toast - 消息浮动框
- Notice - 消息通知
- Console - 控制台
- Shell
- Shizuku
- Media - 多媒体
- Sensor - 传感器
- Recorder - 记录器
- Timer - 定时器
- Thread - 线程
- Continuation - 协程
- Event - 事件监听
- Dialog - 对话框
- Floaty - 悬浮窗
- Canvas - 画布
- UI - 用户界面
- Web - 万维网
- HTTP
- Base64
- Crypto - 密文
- OpenCC - 中文转换
- Internationalization - 国际化
- Standardization - 标准化
- E4X

- UiSelector - 选择器
- UiObject - 控件节点
- UiObjectCollection - 控件集合
- UiObjectActions - 控件节点行为
- WebSocket
- EventEmitter - 事件发射器
- ImageWrapper - 包装图像类
- App - 应用枚举类
- Color - 颜色类
- Version - 版本工具类
- Polyfill - 代码填泥
- Arrayx - Array 扩展
- Numberx - Number 扩展
- Mathx - Math 扩展

- Exceptions - 异常
- Intent - 意图
- Runtime - 运行时
- Context - 上下文
- Activity - 活动

- Scripting Java - 脚本化 Java
- Android API Level - 安卓 API 级别
- Color Table - 颜色列表

- Glossaries - 术语
- HttpHeader - HTTP 标头
- HttpRequestMethods - HTTP 请求方法
- MimeType - MIME 类型
- NotificationChannel - 通知渠道

- Data Types - 数据类型
- Omnipotent Types - 全能类型
- Storage - 存储类
- AndroidBundle
- AndroidRect
- CryptoCipherOptions
- CryptoKey
- CryptoKeyPair
- ConsoleBuildOptions
- HttpRequestBuilderOptions
- HttpRequestHeaders
- HttpResponseBody
- HttpResponseHeaders
- HttpResponse
- InjectableWebClient
- InjectableWebView
- NoticeOptions
- NoticeChannelOptions
- NoticePresetConfiguration
- NoticeBuilder
- Okhttp3HttpUrl
- OcrOptions
- Okhttp3Request
- OpenCVPoint
- OpenCVRect
- OpenCVSize
- OpenCCConversion

- GitHub - 应用项目地址
- GitHub - 文档项目地址

# CryptoKey#

CryptoKey 是 `org.autojs.autojs.core.crypto.Crypto.Key` 的子类, 其实例可代表一个密钥 (确切地说, 是自定义密钥, 而非 Java 密钥), 主要用于 密文 模块.

常见相关方法或属性:

- CryptoKeyPair#publicKey
- CryptoKeyPair#privateKey
- crypto.Key::new

> 注: 本章节仅列出 CryptoKey 独有的而不包含继承的属性及方法.

CryptoKey

## [p] data#

`READONLY`

- { ByteArray } - Java 字节数组

以字节数组表示的密钥数据.

    console.log(new crypto.Key('Y').data); // [89]

## [p] keyPair#

`READONLY`

- [ `null` ] { `'public'` | `'private'` } - 公私性质

密钥的公私性质, 用于非对称加密.

    console.log(new crypto.Key('Y').keyPair); // null
    console.log(new crypto.Key('Y', { keyPair: 'public' }).keyPair); // public

需特别留意, 与 Auto.js Pro 不同, `keyPair` 默认值为 `null`, 而非 `undefined`. 这是因为 AutoJs6 的 crypto 模块底层实现不是 JavaScript 语言.

## [m] toKeySpec#

### toKeySpec(transformation)#

- transformation { CryptoCipherTransformation } - 密码转换名称
- returns { java.security.Key } Java 密钥

由密码对生成一个指定算法的 Java 密钥 (Java Key).

`toKeySpec` 中的 "spec" 全称为 "specification", 意为 "规范". 因此, 此方法可理解为将自定义密钥转换为规范的密钥.

    /* 生成一个 DES 算法的规范密钥. */

    let specKey = new crypto.Key('Y').toKeySpec('DES');
    console.log(specKey);

    /* 生成一个 RSA 算法的规范密钥对. */

    let specPublicKey = new crypto.Key([
        48, 60, 48, 13, 6, 9, 42, -122, 72, -122, -9, 13, 1, 1, 1, 5, 0, 3, 43, 0, 48, 40, 2, 33, 0, -68, -97, -19, 103, 19, 14, 68, 33, -65, 52, 76, 115, 33, 33, 12, 84, -82, -116, 101, 60, 106, 119, -90, -41, 107, -16, 1, 52, 94, 29, -121, 55, 2, 3, 1, 0, 1,
    ], { keyPair: 'public' });

    console.log(specPublicKey.toKeySpec('RSA'));

    let specPrivateKey = new crypto.Key([
        48, -127, -62, 2, 1, 0, 48, 13, 6, 9, 42, -122, 72, -122, -9, 13, 1, 1, 1, 5, 0, 4, -127, -83, 48, -127, -86, 2, 1, 0, 2, 33, 0, -32, 71, -69, 124, -32, -63, -67, -61, 9, -54, 91, -81, 127, -102, 62, 102, 124, 19, 65, 49, -14, 40, 52, 23, -101, -64, -14, -34, -44, -88, -70, -15, 2, 3, 1, 0, 1, 2, 32, 0, -86, -9, -99, 52, -95, -121, 15, 20, 43, 111, 61, 40, 100, -10, -42, 25, 40, -111, -44, -102, 107, -8, -83, -56, -77, 89, -109, -83, -97, 77, 53, 2, 17, 0, -2, -37, 9, 64, -54, 67, -75, 73, 87, -118, -35, -8, 103, -9, -101, -3, 2, 17, 0, -31, 73, -116, -122, 27, -20, 59, -10, 60, -13, -85, 0, 1, -117, 27, 5, 2, 17, 0, -10, -47, 78, -66, -50, -92, -112, 55, -67, 110, -95, -42, 103, 106, 40, 73, 2, 16, 48, -127, -28, -106, -17, -90, 50, -42, -9, 18, -60, 43, -15, 41, 33, 125, 2, 16, 8, 74, 76, 65, 77, -95, 96, 94, 81, 44, 46, 51, 69, 62, -6, -24,
    ], { keyPair: 'private' });

    console.log(specPrivateKey.toKeySpec('RSA'));

`toKeySpec` 方法在实际应用中几乎不会用到, 它往往用于 `cipher` 对象的初始化.
为更加深入地了解 `toKeySpec` 的使用方式, 下述示例使用了非常底层的方式展示了一个使用 DES 算法的加密和解密的过程:

    /* 原始数据. */
    let data = 'ABC..XYZ';

    /* 转换名称 (此处可视为算法名称). */
    let transformation = 'DES';

    /* 获取规范密钥. */

    let specKey = new crypto.Key(data).toKeySpec(transformation);

    /* 加密过程. */

    let cipherA = javax.crypto.Cipher.getInstance(transformation);
    cipherA.init(javax.crypto.Cipher.ENCRYPT_MODE, specKey);

    let bosA = new java.io.ByteArrayOutputStream();
    let cosA = new javax.crypto.CipherOutputStream(bosA, cipherA);
    cosA.write(new java.lang.String(data).getBytes(), 0, data.length);
    cosA.close();
    let resultA = bosA.toByteArray();
    bosA.close();

    /* 加密后的数据 (字节数组). */
    console.log(resultA); // [74, -49, 32, -94, 104, 57, 45, 3, -72, -113, 89, -13, -78, -24, -64, 75]

    /* 解密过程, 将加密后的数据 resultA 作为解密的输入数据. */

    let cipherB = javax.crypto.Cipher.getInstance(transformation);
    cipherB.init(javax.crypto.Cipher.DECRYPT_MODE, specKey);

    let bosB = new java.io.ByteArrayOutputStream();
    let cosB = new javax.crypto.CipherOutputStream(bosB, cipherB);
    cosB.write(resultA, 0, resultA.length);
    cosB.close();
    let resultB = String(bosB);
    bosB.close();

    /* 解密后的数据 (字符串). */
    console.log(resultB); // ABC..XYZ
    console.log(resultB === data); // true