|
在易语言中调用Windows API CryptProtectData 需要以下步骤。该API用于加密敏感数据(如用户凭据),以下是完整实现方法:
一、数据结构定义
.数据类型 DATA_BLOB
.成员 cbData, 整数型
.成员 pbData, 整数型
二、DLL命令声明
.DLL命令 CryptProtectData
.DLL库文件名 "Crypt32.dll"
.返回值类型 逻辑型
.参数 pDataIn , 整数型 // 输入数据指针
.参数 szDataDescr , 文本型 // 数据描述(可空)
.参数 pOptionalEntropy , 整数型 // 附加密钥(可空)
.参数 pvReserved , 整数型 // 保留参数(必须0)
.参数 pPromptStruct , 整数型 // 提示结构(可空)
.参数 dwFlags , 整数型 // 标志(如0x1禁止UI)
.参数 pDataOut , 整数型 // 输出数据指针
.DLL命令 CryptMemFree
.DLL库文件名 "Crypt32.dll"
.返回值类型 整数型
.参数 pv , 整数型
三、加密函数示例
.子程序 加密数据, 字节集
.参数 原始数据, 字节集
.局部变量 stIn, DATA_BLOB
.局部变量 stOut, DATA_BLOB
.局部变量 结果, 逻辑型
' 准备输入数据
stIn.cbData = 取字节集长度 (原始数据)
stIn.pbData = 取变量数据地址 (原始数据)
' 调用API加密
结果 = CryptProtectData (取变量地址 (stIn), "MyApp Data", 0, 0, 0, 1, 取变量地址 (stOut))
.如果真 (结果 = 假)
返回 ({ }) ' 失败返回空
.如果真结束
' 读取加密结果
返回 (指针到字节集 (stOut.pbData, stOut.cbData))
' 释放内存
CryptMemFree (stOut.pbData)
四、使用示例
.子程序 _启动子程序
.局部变量 加密结果, 字节集
加密结果 = 加密数据 (到字节集 ("Hello World"))
.如果 (取字节集长度 (加密结果) > 0)
写到文件 ("encrypted.bin", 加密结果)
信息框 ("加密成功", 0, )
.否则
信息框 ("加密失败", 0, )
.如果结束
五、关键参数说明
dwFlags 常用值:
0x1 (CRYPTPROTECT_UI_FORBIDDEN):禁止弹出密码输入框
0x4 (CRYPTPROTECT_LOCAL_MACHINE):使用机器级密钥
pOptionalEntropy 参数:
可传入额外的密钥数据(需同样结构体)
解密时必须提供相同的熵值
六、注意事项
内存管理:
必须调用CryptMemFree释放加密后的内存
易语言的自动回收机制不适用于API分配的内存
数据安全:
敏感数据在内存中应尽快清除
建议使用RtlZeroMemory清空原始数据内存
跨平台限制:
加密数据只能在相同用户/机器环境下解密
如需跨设备使用需自行处理密钥
完整示例已包含加密流程,解密可参考类似流程使用CryptUnprotectData。实际开发中建议添加错误处理(通过GetLastError获取错误代码)。 |
|