# crypt.aes 库模块帮助文档

## crypt 成员列表 <a id="crypt" href="#crypt">&#x23;</a>

### crypt.aes <a id="crypt.aes" href="#crypt.aes">&#x23;</a>
AES加密算法支持库,默认加密模式 CBC,填充模式PKCS7,  
注意PKCS5与PKCS7填充规则一样,PKCS5填充1到8字节,PKCS7填充1到255字节,  
而AES数据块分组为16字节也就是128位,指定PKCS5实际使用的也是PKCS7,  
[各编程语言 AES 兼容写法](https://www.aardio.com/zh-cn/doc/library-guide/std/crypt/aes.html)  

演示代码:  

```aardio  
import crypt.aes;  
var aes = crypt.aes();  

//设置密钥  
aes.setPassword("12345678");  

//加密  
var sstr = aes.encrypt("Test String");  

//解密  
var str = aes.decrypt(sstr);  
```

### crypt.aes() <a id="crypt.aes" href="#crypt.aes">&#x23;</a>
返回AES加密容器,  
可选使用一个字符串参数指定密钥向量  
如果要与其他编程语言有相同加解密结果,建议不要设置该参数  

[返回对象:crypyAesObject](#crypyAesObject)

## crypyAesObject 成员列表 <a id="crypyAesObject" href="#crypyAesObject">&#x23;</a>

### crypyAesObject.allocBuffer <a id="crypyAesObject.allocBuffer" href="#crypyAesObject.allocBuffer">&#x23;</a>
分配加解密需要用到的 buffer。

### crypyAesObject.allocBuffer(大小,块大小) <a id="crypyAesObject.allocBuffer" href="#crypyAesObject.allocBuffer">&#x23;</a>
分配加解密需要用到的 buffer。  
如果不手动分配，程序将会自动按需分配 buffer。  
参数 @2 可选，可用对象的blockSize属性指定默认块大小。

### crypyAesObject.blockSize <a id="crypyAesObject.blockSize" href="#crypyAesObject.blockSize">&#x23;</a>
加密填充的块大小，默认为 16

### crypyAesObject.buffer <a id="crypyAesObject.buffer" href="#crypyAesObject.buffer">&#x23;</a>
加解密时暂存输入输出数据的缓冲区。  
只能通过调用 allocBuffer 函数分配此缓冲区。  
或者由加解密函数自动分配此缓冲区。  

如果未分配缓冲区，或缓冲区大小不够。  
加解密时会重新调用 allocBuffer 函数分配到合适大小。   

一般不应直接访问此属性。

### crypyAesObject.decrypt <a id="crypyAesObject.decrypt" href="#crypyAesObject.decrypt">&#x23;</a>
解密数据

### crypyAesObject.decrypt(输入数据,是否已输入全部数据,哈希对象,选项) <a id="crypyAesObject.decrypt" href="#crypyAesObject.decrypt">&#x23;</a>
参数 @1 指定字符串或 buffer。  
除第一个参数以外，其他参数都是可选参数。  
分块解密时，参数 @2 必须为 flase 且参数 @1 的长度必须是块大小的倍数。  
成功返回解密文本,失败返回空,  
可使用..lasterr()函数获取错误信息

### crypyAesObject.decrypt(输入缓冲区,输入数据大小,哈希对象,选项) <a id="crypyAesObject.decrypt" href="#crypyAesObject.decrypt">&#x23;</a>
参数 @1 指定 buffer 或字符串。  
如果参数 @2 指定的数值小于缓冲区据总长度，解密结束。  
可使用 -1 表示解密结束，且输入数据大小等于缓冲区大小。  
其他参数可忽略不用管。  

成功返回存放解密结果的缓冲区，返回值 2 为解密长度。  
需要分块解密的算法，例如 RSA 算法返回的解密结果为字符串。  
失败返回 null, 错误信息,错误代码。  

用法可参考 decryptFile 函数源码。

### crypyAesObject.decryptFile <a id="crypyAesObject.decryptFile" href="#crypyAesObject.decryptFile">&#x23;</a>
解密文件

### crypyAesObject.decryptFile(输入文件,输出文件,缓冲区大小,进度回调函数,哈希对象,选项) <a id="crypyAesObject.decryptFile" href="#crypyAesObject.decryptFile">&#x23;</a>
参数 @1 指定要解密的文件。参数 @2 指定要保存解密结果的文件。  
文件参数都可以指定文件路径、文件对象（兼容 io.file,fsys.file,fsys.stream）。  
可选用参数 @3 指定分块加密的字节长度，默认为 1MB。  
指定字节长度时会自动调整到对齐块大小，参数不需要考虑对齐。  
可选指定进度回调函数，回调参数 @1,@2 分别为输入文件总长度、已读取长度。  
其他调用参数（哈希对象，选项）一般不必指定。  

函数执行成功返回 true，失败返回 null,错误信息。

### crypyAesObject.encrypt <a id="crypyAesObject.encrypt" href="#crypyAesObject.encrypt">&#x23;</a>
加密数据

### crypyAesObject.encrypt(输入数据,是否已输入全部数据,哈希对象,选项) <a id="crypyAesObject.encrypt" href="#crypyAesObject.encrypt">&#x23;</a>
参数 @1 指定字符串或 buffer。  
除第一个参数以外，其他参数都是可选参数。  
分块加密时，参数 @2 必须为 flase 且参数 @1 的长度必须是块大小的倍数。  
成功返回加密文本,失败返回空,  
可使用..lasterr()函数获取错误信息

### crypyAesObject.encrypt(输入缓冲区,输入数据大小,哈希对象,选项) <a id="crypyAesObject.encrypt" href="#crypyAesObject.encrypt">&#x23;</a>
参数 @1 指定 buffer 或字符串。  
如果参数 @2 指定的数值小于缓冲区据总长度，加密结束。  
可使用 -1 表示解密结束，且输入数据大小等于缓冲区大小。  
其他参数可忽略不用管。  

成功返回存放加密结果的缓冲区，返回值 2 为解密长度。  
需要分块解密的算法，例如 RSA 算法返回的解密结果为字符串。  
失败返回 null, 错误信息,错误代码。  

用法可参考 encryptFile 函数源码。

### crypyAesObject.encryptFile <a id="crypyAesObject.encryptFile" href="#crypyAesObject.encryptFile">&#x23;</a>
加密文件

### crypyAesObject.encryptFile(输入文件,输出文件,缓冲区大小,进度回调函数,哈希对象,选项) <a id="crypyAesObject.encryptFile" href="#crypyAesObject.encryptFile">&#x23;</a>
参数 @1 指定要加密的文件。参数 @2 指定要保存加密结果的文件。  
文件参数都可以指定文件路径、文件对象（兼容 io.file,fsys.file,fsys.stream）。  
可选用参数 @3 指定分块加密的字节长度，默认为 1MB。  
指定字节长度时会自动调整到对齐块大小，参数不需要考虑对齐。  
可选指定进度回调函数，回调参数 @1,@2 分别为输入文件总长度、已读取长度。  
其他调用参数（哈希对象，选项）一般不必指定。  

函数执行成功返回 true，失败返回 null,错误信息。

### crypyAesObject.hasKey() <a id="crypyAesObject.hasKey" href="#crypyAesObject.hasKey">&#x23;</a>
检测是否已设置密钥

### crypyAesObject.setInitVector(字符串向量,选项) <a id="crypyAesObject.setInitVector" href="#crypyAesObject.setInitVector">&#x23;</a>
设置初始化向量,成功返回true,  
参数2可选

### crypyAesObject.setKeyParam(类型,数据值,选项) <a id="crypyAesObject.setKeyParam" href="#crypyAesObject.setKeyParam">&#x23;</a>
设置加密参数  
数据值可以是结构体,字符串，或 buffer 对象，  
如果数据值一个数值参数,则转换为表示32位整型数值地址的结构体指针  
成功返回true,失败请使用 ..lasterr()获取错误信息

### crypyAesObject.setKeyParamMode(_CRYPT_MODE) <a id="crypyAesObject.setKeyParamMode" href="#crypyAesObject.setKeyParamMode">&#x23;</a>
设置加密模式（在设置密钥后才能修改加密模式）。  
成功返回 true,失败请使用 `..lasterr()` 获取错误信息

### crypyAesObject.setKeyParamPadding(_PKCS5_PADDIN) <a id="crypyAesObject.setKeyParamPadding" href="#crypyAesObject.setKeyParamPadding">&#x23;</a>
设置加密填充方式,  
PKCS7填充模式请指定 _PKCS5_PADDIN,  
成功返回true,失败请使用 ..lasterr()获取错误信息

### crypyAesObject.setPassword("密钥",选项) <a id="crypyAesObject.setPassword" href="#crypyAesObject.setPassword">&#x23;</a>
支持128位(16字节)、192位(24字节) 和 256位(32字节)密钥  
如果密钥长度不足指定位数自动填充`'\0'`到最适合的密钥长度,  
超过24字节使用使用MD5算法创建转换为24位密钥,  
参数@2不需要指定
