//aes 加密算法 import crypt; namespace crypt class aes { ctor( initVector ) { this = ..crypt( _WINXP ? "Microsoft Enhanced RSA and AES Cryptographic Provider (Prototype)" : "Microsoft Enhanced RSA and AES Cryptographic Provider" ,0x18/*_PROV_RSA_AES*/ ); this.initVector = initVector; }; setPassword = function( key,flags=0 ) { if( type(key) != type.string ) error("请指定正确的密钥",2); var algId; var keyLen = #key; if( #key <= 16 ){ if( keyLen < 16 ) key = ..raw.buffer(16,key); algId = 0x660E/*_CALG_AES_128*/; } elseif( #key <= 24 ){ if( keyLen < 24 ) key = ..raw.buffer(24,key); algId = 0x660F/*_CALG_AES_192*/; } elseif( #key <= 32 ){ if( keyLen < 32 ) key = ..raw.buffer(32,key); algId = 0x6610/*_CALG_AES_256*/; } else { return this.setHashPassword(key,0x8003/*_CALG_MD5*/,0x6610/*_CALG_AES_256*/,flags); } var ret,err = this.setPlainPassword(key,algId,flags); if(!ret) return null,err; this.blockSize = 16; this.setKeyParamMode(1/*_CRYPT_MODE_CBC*/); this.setKeyParamPadding(1/*_PKCS5_OR_PKCS7_PADDING*/); return this.setInitVector( this.initVector or key ); } } /**intellisense() crypt.aes = AES加密算法支持库,默认加密模式 CBC,填充模式PKCS7,\n注意PKCS5与PKCS7填充规则一样,PKCS5填充1到8字节,PKCS7填充1到255字节,\n而AES数据块分组为16字节也就是128位,指定PKCS5实际使用的也是PKCS7,\n[各编程语言 AES 兼容写法](doc://library-guide/std/crypt/aes.md)\n\n演示代码:\n\n```aardio\nimport crypt.aes;\nvar aes = crypt.aes();\n\n//设置密钥\naes.setPassword("12345678");\n\n//加密\nvar sstr = aes.encrypt("Test String");\n\n//解密\nvar str = aes.decrypt(sstr);\n``` crypt.aes() = 返回AES加密容器,\n可选使用一个字符串参数指定密钥向量\n如果要与其他编程语言有相同加解密结果,建议不要设置该参数\n!crypy_aes. !crypy_aes.setPassword(.("密钥",选项) = 支持128位(16字节)、192位(24字节) 和 256位(32字节)密钥\n如果密钥长度不足指定位数自动填充'\0'到最适合的密钥长度,\n超过24字节使用使用MD5算法创建转换为24位密钥,\n参数@2不需要指定 !crypy_aes.decrypt( = 解密数据 !crypy_aes.decrypt(.(输入数据,是否已输入全部数据,哈希对象,选项) = 参数 @1 指定字符串或 buffer。\n除第一个参数以外,其他参数都是可选参数。\n分块解密时,参数 @2 必须为 flase 且参数 @1 的长度必须是块大小的倍数。\n成功返回解密文本,失败返回空,\n可使用..lasterr()函数获取错误信息 !crypy_aes.decrypt(.(输入缓冲区,输入数据大小,哈希对象,选项) = 参数 @1 指定 buffer 或字符串。\n如果参数 @2 指定的数值小于缓冲区据总长度,解密结束。\n可使用 -1 表示解密结束,且输入数据大小等于缓冲区大小。\n其他参数可忽略不用管。\n\n成功返回存放解密结果的缓冲区,返回值 2 为解密长度。\n需要分块解密的算法,例如 RSA 算法返回的解密结果为字符串。\n失败返回 null, 错误信息,错误代码。\n\n用法可参考 decryptFile 函数源码。 !crypy_aes.encrypt( = 加密数据 !crypy_aes.encrypt(.(输入数据,是否已输入全部数据,哈希对象,选项) = 参数 @1 指定字符串或 buffer。\n除第一个参数以外,其他参数都是可选参数。\n分块加密时,参数 @2 必须为 flase 且参数 @1 的长度必须是块大小的倍数。\n成功返回加密文本,失败返回空,\n可使用..lasterr()函数获取错误信息 !crypy_aes.encrypt(.(输入缓冲区,输入数据大小,哈希对象,选项) = 参数 @1 指定 buffer 或字符串。\n如果参数 @2 指定的数值小于缓冲区据总长度,加密结束。\n可使用 -1 表示解密结束,且输入数据大小等于缓冲区大小。\n其他参数可忽略不用管。\n\n成功返回存放加密结果的缓冲区,返回值 2 为解密长度。\n需要分块解密的算法,例如 RSA 算法返回的解密结果为字符串。\n失败返回 null, 错误信息,错误代码。\n\n用法可参考 encryptFile 函数源码。 !crypy_aes.encryptFile( = 加密文件 !crypy_aes.encryptFile(.(输入文件,输出文件,缓冲区大小,进度回调函数,哈希对象,选项) = 参数 @1 指定要加密的文件。参数 @2 指定要保存加密结果的文件。\n文件参数都可以指定文件路径、文件对象(兼容 io.file,fsys.file,fsys.stream)。\n可选用参数 @3 指定分块加密的字节长度,默认为 1MB。\n指定字节长度时会自动调整到对齐块大小,参数不需要考虑对齐。\n可选指定进度回调函数,回调参数 @1,@2 分别为输入文件总长度、已读取长度。\n其他调用参数(哈希对象,选项)一般不必指定。\n\n函数执行成功返回 true,失败返回 null,错误信息。 !crypy_aes.decryptFile( = 解密文件 !crypy_aes.decryptFile(.(输入文件,输出文件,缓冲区大小,进度回调函数,哈希对象,选项) = 参数 @1 指定要解密的文件。参数 @2 指定要保存解密结果的文件。\n文件参数都可以指定文件路径、文件对象(兼容 io.file,fsys.file,fsys.stream)。\n可选用参数 @3 指定分块加密的字节长度,默认为 1MB。\n指定字节长度时会自动调整到对齐块大小,参数不需要考虑对齐。\n可选指定进度回调函数,回调参数 @1,@2 分别为输入文件总长度、已读取长度。\n其他调用参数(哈希对象,选项)一般不必指定。\n\n函数执行成功返回 true,失败返回 null,错误信息。 !crypy_aes.buffer = 加解密时暂存输入输出数据的缓冲区。\n只能通过调用 allocBuffer 函数分配此缓冲区。\n或者由加解密函数自动分配此缓冲区。\n\n如果未分配缓冲区,或缓冲区大小不够。\n加解密时会重新调用 allocBuffer 函数分配到合适大小。 \n\n一般不应直接访问此属性。 !crypy_aes.allocBuffer( = 分配加解密需要用到的 buffer。 !crypy_aes.allocBuffer(.(大小,块大小) = 分配加解密需要用到的 buffer。\n如果不手动分配,程序将会自动按需分配 buffer。\n参数 @2 可选,可用对象的blockSize属性指定默认块大小。 !crypy_aes.blockSize = 加密填充的块大小,默认为 16 !crypy_aes.setKeyParam(.(类型,数据值,选项) = 设置加密参数\n数据值可以是结构体,字符串,或 buffer 对象,\n如果数据值一个数值参数,则转换为表示32位整型数值地址的结构体指针\n成功返回true,失败请使用 ..lasterr()获取错误信息 !crypy_aes.setKeyParamMode(_CRYPT_MODE__) = 设置加密模式\n成功返回true,失败请使用 ..lasterr()获取错误信息 !crypy_aes.setKeyParamPadding(_PKCS5_PADDIN__) = 设置加密填充方式,\nPKCS7填充模式请指定 _PKCS5_PADDIN,\n成功返回true,失败请使用 ..lasterr()获取错误信息 !crypy_aes.setInitVector(.(字符串向量,选项) = 设置初始化向量,成功返回true,\n参数2可选 !crypy_aes.hasKey() = 检测是否已设置密钥 end intellisense**/