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, *cRawWrite(),不要用普通 FileAppend 写密文。
  • 密码错误时,解压结果可能是乱码或无意义数据。正式脚本应额外保存校验值,例如哈希、固定头、版本号。
  • 大文件场景要评估内存占用,因为这些函数通常会把数据读进内存处理。
  • 示例里的固定密码只适合测试,正式工具要把密码来源和保存方式单独设计。
声明:站内资源为整理优化好的代码上传分享与学习研究,如果是开源代码基本都会标明出处,方便大家扩展学习路径。请不要恶意搬运,破坏站长辛苦整理维护的劳动成果。本站为爱好者分享站点,所有内容不作为商业行为。如若本站上传内容侵犯了原著者的合法权益,请联系我们进行删除下架。