|
本帖最后由 feicuiboy 于 2010-8-8 20:25 编辑
转载论坛的,我加了些注释,但是还有些疑惑,我改写后文件大小大了1倍,我用的是FileOpen("1" & $file, 16 + 2) 写入模式,不知道为什么呢??
代码一,改写的:$file="adk.exe"
_file_yihuo($file)
Func _file_yihuo($file)
$jiami = FileOpen($file, 16) ;16进制打开文件
If @error Then Return SetError(-1, 0, -1)
$jiami_chars = FileRead($jiami) ;获取二进制文本
$jiami_chars = StringTrimLeft ($jiami_chars,2) ;删除字符串中从左开始指定数量的字符. StringTrimLeft ( "字符串", 数量 )
$len = StringLen($jiami_chars) ;返回指定字符串的字符总数,StringLen ( "字符串" )
FileClose($jiami) ;关闭文件
$file = FileOpen("1" & $file, 16 + 2) ;打开文件,二进制写入模式
FileWrite($file, Binary("ox"&$jiami_chars)) ; Binary ( 表达式)--返回一个表达式的二进制值.
FileClose($file)
EndFunc
上面的代码加密后文件就大了一倍。
代码二:文件加密代码
==========================================Global $Encrypt_Out
;======================示例代码=========================
;~ $begin = TimerInit()
;~ _file_yihuo('测试文档.txt')
;~ $dif = TimerDiff($begin)
;~ MsgBox(0,"耗费时间",$dif)
;======================示例代码=========================
;~ 函数名:_file_yihuo
;~ 作用:异或加密解密文档
;~ 作者:crossdoor
;~ yihuo("文档")
;~ 文档:需要加密或解密的文档
;~ 返回值:成功返回1,新的文档将在原文档名前面加上Encrypt_保存;文档打开失败返回-1并设置@error=-1
;~ 说明:明文文档会被加密,密文文档会被解密
$file="Encrypt_挂机锁.exe"
_file_yihuo($file)
Func _file_yihuo($file)
$jiami = FileOpen($file, 16) ;二进制打开文件
If @error Then Return SetError(-1, 0, -1)
$jiami_chars = FileRead($jiami) ;获取二进制文本
$jiami_chars = StringTrimLeft ($jiami_chars,2) ;删除字符串中从左开始指定数量的字符. StringTrimLeft ( "字符串", 数量 )
$len = StringLen($jiami_chars) ;返回指定字符串的字符总数,StringLen ( "字符串" )
For $i = 0 To $len/9200;分段加密-------------------------------
$Tmp_Dat = _Encrypt(StringMid($jiami_chars,$i*9200+1,9200))
Next
FileClose($jiami) ;关闭文件
$file = FileOpen("Encrypt_" & $file, 16 + 2) ;打开文件,二进制写入模式
FileWrite($file, Binary('0x' & $Tmp_Dat)) ; Binary ( 表达式)--返回一个表达式的二进制值.
FileClose($file)
Return 1
EndFunc ;==>yihuo
;~ 对照表
;~ $a_mingma[16] = ['0','1','2','3','4','5','6','7','8','9','A','B','C','D','E','F'];ascii明码表
;~ $a_mima1[16] = ['7','6','5','4','3','2','1','0','F','E','D','C','B','A','9','8'];第一位ascii密码表
;~ $a_mima2[16] = ['8','9','A','B','C','D','E','F','0','1','2','3','4','5','6','7'];第二位ascii密码表
;~ 函数名:__Encrypt
;~ 作用:内部调用函数
;~ 说明:按照上述对照表进行ascii码转换加密
Func _Encrypt($jiami_chars)
$num = StringMid($jiami_chars, 1, 2) ;提取字符串中的第一个和第二个字符
$n1 = Dec(StringMid($num,1,1)) ;Dec ( "hex" )----返回$num的第一个字符为十进制
$n2 = Dec(StringMid($num,2,1)) ;Dec ( "hex" )----返回$num的第二个字符为十进制
If $n2 >7 Then ;若$n2>7
$re2 = Hex($n2-8,2) ;转换,取2个长度
Else
$re2 = Hex($n2+8,2) ;转换,取2个长度
EndIf
If StringMid($re2,1,1)='0' Then $re2 = StringMid($re2,2,1) ;若第一个字符为0,那么取第二个字符
If $n1 < 8 Then
$re1 = Hex(7-$n1,2)
Else
$re1 = Hex(23-$n1,2)
EndIf
If StringMid($re1,1,1)='0' Then $re1 = StringMid($re1,2,1);若第一个字符为0,那么取第二个字符
$jiami_chars = StringTrimLeft ($jiami_chars,2) ;从左开始,删除2个字符串
$Encrypt_Out &= $re1 &$re2
If $jiami_chars <> '' Then _Encrypt($jiami_chars)
Return $Encrypt_Out
EndFunc
我个人已加了注释,对Func _Encrypt($jiami_chars)段看了许久,没看懂,盼懂的人给讲解讲解,谢谢了
======================
我的疑问是:
1:采用二进制读取文件后,二进制的头部或尾部加入一些 自定义代码后,为什么文件结构会增大一倍。如代码一,是什么原因呢??
如何进行修改,才能完成在既不修改文件大小(至少不至于增加一倍大)的情况下,添加一些自定义的字符或代码进去(代码二能实现,但无自定义代码),完成文件的加解密
--
我的想法:
加密:添加自定义代码(二进制方式),可考虑在文件头或文件尾或指定代码长度的中间插入。实现加密
解密实现:判断加密字段,去掉自定义字段即可
如何操作呢?上面的代码可以实现,但看了许久没能看明白,急盼能人给修改下,谢谢了 |
|