AHK_H 内置了一些普通 v1 没有的二进制处理能力,比如 CryptAES()、ZipRawMemory()、UnZipRawMemory()。这篇文章把站长实测的加密、压缩、解压示例整理成更适合复制改造的版本。
文件加密解密
CryptAES() 直接对内存缓冲区操作,所以读文件要用 FileRead, *c,写回文件要用 RawWrite()。不要把加密后的内容当普通字符串处理,因为密文里可能有 0 字节和不可见字符。
#Requires AutoHotkey v1.1 #NoEnv SetBatchLines, -1 SetWorkingDir, %A_ScriptDir% pass := "TestPassword123" srcFile := A_ScriptDir "\test.bin" encFile := A_ScriptDir "\test.enc" decFile := A_ScriptDir "\test.dec" ; 加密 FileRead, buf, *c %srcFile% FileGetSize, size, %srcFile% NumPut(0, &buf, size, "Char") outSize := CryptAES(buf, size, pass, true) f := FileOpen(encFile, "w -rwd") f.RawWrite(&buf, outSize) f.Close() ; 解密 FileRead, encBuf, *c %encFile% FileGetSize, encSize, %encFile% NumPut(0, &encBuf, encSize, "Char") decSize := CryptAES(encBuf, encSize, pass, false) f := FileOpen(decFile, "w -rwd") f.RawWrite(&encBuf, decSize) f.Close() MsgBox, 完成加密和解密测试
字符串压缩保存
如果目标是单个文本、单段配置、或者小型二进制块,ZipRawMemory() 很方便。文本场景要特别注意编码,读取 UTF-8 文本时建议明确写 FileEncoding, UTF-8-RAW。
FileEncoding, UTF-8-RAW FileRead, text, % A_ScriptDir "\test.txt" textBytes := StrLen(text) * (A_IsUnicode ? 2 : 1) zipSize := ZipRawMemory(text, textBytes, zipBuf, "password") f := FileOpen(A_ScriptDir "\file.bin", "w -rwd") f.RawWrite(&zipBuf, zipSize) f.Close()
解压还原
FileRead, zipInput, *c % A_ScriptDir "\file.bin"
FileGetSize, zipInputSize, % A_ScriptDir "\file.bin"
outSize := UnZipRawMemory(&zipInput, zipInputSize, outText, "password")
if (!outSize) {
MsgBox, 解压失败
ExitApp
}
FileAppend, %outText%, % A_ScriptDir "\restore.txt", UTF-8
几个实测结论
- 压缩和加密是两个概念:压缩为了变小,加密为了隐藏内容。不要只压缩就当成加密。
- 二进制文件一律用
FileRead, *c与RawWrite(),不要用普通FileAppend写密文。 - 密码错误时,解压结果可能是乱码或无意义数据。正式脚本应额外保存校验值,例如哈希、固定头、版本号。
- 大文件场景要评估内存占用,因为这些函数通常会把数据读进内存处理。
- 示例里的固定密码只适合测试,正式工具要把密码来源和保存方式单独设计。
声明:站内资源为整理优化好的代码上传分享与学习研究,如果是开源代码基本都会标明出处,方便大家扩展学习路径。请不要恶意搬运,破坏站长辛苦整理维护的劳动成果。本站为爱好者分享站点,所有内容不作为商业行为。如若本站上传内容侵犯了原著者的合法权益,请联系我们进行删除下架。

评论(0)