 |
VFP 愛用者社區 本討論區為 Visual Foxpro 愛用者經驗交流的地方, 請多多利用"搜尋"的功能, 先查看看有無前例可循, 如果還有不懂的再發問. 部份主題有附加檔案, 須先註冊成為社區居民才可以下載.
|
上一篇主題 :: 下一篇主題 |
發表人 |
內容 |
garfield Site Admin

註冊時間: 2003-01-30 文章: 2160
第 1 樓
|
發表於: 星期六 十月 25, 2003 1:06 pm 文章主題: [原創]字串加密的方法. |
|
|
使用範例:
mfilestr = garablestr( filetostr('my.dbf') ,'MyPassowrd')
strtofile( mfilestr, 'my.dbf')
******** 修正過後的版本. 2005.03.12
func garablestr
lpara mstr , mpassword
* 執行一次會加密, 再將加密過的字串傳來執行一次會解密
local i, mret, mpos
dime apassword[ len(mpassword)*2 ]
for i=1 to len(mpassword)
apassword[ i*2-1 ] = int(asc( subs( mpassword,i,1))/16)
apassword[ i*2 ] = asc( subs( mpassword,i,1)) - apassword[ i*2-1 ]*16
next
mret = ''
for i=1 to len( mstr )
mpos = mod( i , alen( apassword ) )+1
mret = mret + bytexor( subs( mstr, i,1) , apassword[ mpos ] )
next
return mret
**************************
func bytexor &&--可用於加密
lpara mbyte, mbit
* 例: ? bytexor('A', 15 ) &&-- show chr(190)
* ? bytexor( chr(190) , 15 ) &&-- show 'A'
* mbyte = 一個英文字
* mbit = 一個16進位的數字 0 到 15
local mbit1,mbit2
mbit1 = int( asc( mbyte )/16)
mbit2 = asc( mbyte ) - mbit1*16
*? mbit1,mbit2 , chr( mbit1*16+mbit2 )
return chr( bitxor( mbit1, mbit ) * 16 + bitxor( mbit2,mbit ) ) _________________ 利用>>搜尋<<的功能會比問的還要快得到答案.
garfield 在 星期六 三月 12, 2005 8:55 pm 作了第 1 次修改 |
|
回頂端 |
|
 |
elleryq

註冊時間: 2007-06-21 文章: 768
第 2 樓
|
發表於: 星期六 十月 25, 2003 2:08 pm 文章主題: |
|
|
這是利用雜湊 + xor 的方式加密嗎?? |
|
回頂端 |
|
 |
garfield Site Admin

註冊時間: 2003-01-30 文章: 2160
第 3 樓
|
發表於: 星期日 十月 26, 2003 5:29 am 文章主題: |
|
|
應該沒雜湊(沒讀晝,不知雜湊是啥) , 只是依序將每個字串與密碼一個一個的XOR, 如要再加密深一點, 就將密碼執行本程式一次後(將密碼加密), 再作加密的動作.
func garablestrpwd
lpara mstr , mpassword
return garablestr( mstr , garablestr( mpassword,'看不懂了吧!') )
*******************************
*如果還要再加密深一點, 可以使用非線性加密碼(朋友跟我提過的加密方法), 這個就稍為複雜點了, 可能要經過一番解密過程才會知道結果, 有與趣, 我們再討論. _________________ 利用>>搜尋<<的功能會比問的還要快得到答案. |
|
回頂端 |
|
 |
elleryq

註冊時間: 2007-06-21 文章: 768
第 4 樓
|
發表於: 星期一 十月 27, 2003 8:58 am 文章主題: |
|
|
講錯了~
不是 hash 雜湊啦~
一時"手"快
:p |
|
回頂端 |
|
 |
志明
註冊時間: 2003-10-27 文章: 30
第 5 樓
|
發表於: 星期一 十月 27, 2003 11:15 am 文章主題: |
|
|
我測試時,找不到 bytexor ,這個是要自已寫嗎?還是vfp 內建? |
|
回頂端 |
|
 |
garfield Site Admin

註冊時間: 2003-01-30 文章: 2160
第 6 樓
|
發表於: 星期一 十月 27, 2003 2:14 pm 文章主題: |
|
|
哦! , 忘了還有這個函數, VFP可用BITXOR() 沒有 bytexor( ).
**************************
func bytexor &&--可用於加密
lpara mbyte, mbit
* 例: ? bytexor('A', 15 ) &&-- show chr(190)
* ? bytexor( chr(190) , 15 ) &&-- show 'A'
* mbyte = 一個英文字
* mbit = 一個16進位的數字 0 到 15
local mbit1,mbit2
mbit1 = int( asc( mbyte )/16)
mbit2 = asc( mbyte ) - mbit1*16
*? mbit1,mbit2 , chr( mbit1*16+mbit2 )
return chr( bitxor( mbit1, mbit ) * 16 + bitxor( mbit2,mbit ) ) _________________ 利用>>搜尋<<的功能會比問的還要快得到答案. |
|
回頂端 |
|
 |
garfield Site Admin

註冊時間: 2003-01-30 文章: 2160
第 7 樓
|
發表於: 星期一 三月 07, 2005 10:59 pm 文章主題: |
|
|
看起來像是這一行有問題
mpos = mod( mpos , alen( apassword ) )+1
應該是
mpos = mod( i , alen( apassword ) )+1
因為我的用意是用每一個加密的keyword , 每一個byte分成兩個數字, 循環對映到須加密的字串( mstr )
* 正確的程式如下
************
func garablestr
lpara mstr , mpassword
* 執行一次會加密, 再將加密的檔案來執行一次會解密
local i, mret, mpos
dime apassword[ len(mpassword)*2 ]
for i=1 to len(mpassword)
apassword[ i*2-1 ] = int(asc( subs( mpassword,i,1))/16)
apassword[ i*2 ] = asc( subs( mpassword,i,1)) - apassword[ i*2-1 ]*16
next
mret = ''
for i=1 to len( mstr )
mpos = mod( i , alen( apassword ) )+1
mret = mret + bytexor( subs( mstr, i,1) , apassword[ mpos ] )
next
return mret
**************
如果是針對整個檔案要加密可以利用 filetostr() 及 strtofile()
例:
func garablefile
lpara mfile, mpassword
local mstr
mstr = garablestr( filetostr( mfile) , mpassword )
return strtofile( mstr , mfile ) _________________ 利用>>搜尋<<的功能會比問的還要快得到答案. |
|
回頂端 |
|
 |
KKKLYNN
註冊時間: 2004-09-17 文章: 357
第 8 樓
|
發表於: 星期六 三月 12, 2005 11:03 am 文章主題: dbf加密解密時錯誤!請協助! |
|
|
按鈕事件
UGET=GETFILE("dbf","請注意 選擇要轉入 BOM 的資料","轉 入")
IF EMPT(UGET)=.F.
a=5
加密(uget,a)
endif
加密.prg
**************
&&如果是針對整個檔案要加密可以利用 filetostr() 及 strtofile()
&&例:
&&func garablefile
&&lpara mfile, mpassword
&&local mstr
&&mstr = garablestr( filetostr( mfile) , mpassword )
&&return strtofile( mstr , mfile )
&&func garablestr
lpara mstr , mpassword
* 執行一次會加密, 再將加密的檔案來執行一次會解密
local i, mret, mpos
dime apassword[ len(mpassword)*2 ]
for i=1 to len(mpassword)
apassword[ i*2-1 ] = int(asc( subs( mpassword,i,1))/16)
apassword[ i*2 ] = asc( subs( mpassword,i,1)) - apassword[ i*2-1 ]*16
next
mret = ''
for i=1 to len( mstr )
mpos = mod( i , alen( apassword ))+1
mret = mret + bitxor( subs( mstr, i,1) , apassword[ mpos ] )
next
return mret
執行時發生錯誤
1.無bytexor 而改 bitxor
2.型態或數目不對 mret = mret + bitxor( subs( mstr, i,1) , apassword[ mpos ] )
我是將希望 員工基本資料(dbf) 能解密,匯入,運算,回存,加密的運作
以上進請先進指正!謝謝! |
|
回頂端 |
|
 |
garfield Site Admin

註冊時間: 2003-01-30 文章: 2160
第 9 樓
|
發表於: 星期六 三月 12, 2005 11:10 am 文章主題: |
|
|
引言回覆: |
執行時發生錯誤
1.無bytexor 而改 bitxor
2.型態或數目不對 mret = mret + bitxor( subs( mstr, i,1) , apassword[ mpos ] )
|
1.bytexor的程式我放在這個主題的第6樓
2.因為你改用了bitxor而造成的. _________________ 利用>>搜尋<<的功能會比問的還要快得到答案. |
|
回頂端 |
|
 |
KKKLYNN
註冊時間: 2004-09-17 文章: 357
第 10 樓
|
發表於: 星期六 三月 12, 2005 2:07 pm 文章主題: |
|
|
修正 bytexor 後執行
並無錯誤訊息出現(password為 'a'正常,但為5數字時出現數目或型態不正確)
但我的資料表格內的資料卻也沒加密(亂碼)
請指正!謝謝! |
|
回頂端 |
|
 |
garfield Site Admin

註冊時間: 2003-01-30 文章: 2160
第 11 樓
|
發表於: 星期六 三月 12, 2005 8:59 pm 文章主題: |
|
|
您有2個問題嗎 ?
1.意思是用'a'當密碼時, 資料表格內的資料沒加密
2.用數字5當密碼, 會出現錯誤? <--- 你看到別人用過數字型態的變數來做字串加密的嗎? _________________ 利用>>搜尋<<的功能會比問的還要快得到答案. |
|
回頂端 |
|
 |
KKKLYNN
註冊時間: 2004-09-17 文章: 357
第 12 樓
|
發表於: 星期六 三月 12, 2005 10:26 pm 文章主題: |
|
|
我用您上面的prg是已經成功的檔案(dbf)加密解密!
但下午我想了又想,萬一使用者手癢用xls將檔案打開來看亂碼長成怎樣?
而碰到存檔不成功,檔案鎖住(需要重開機),此時再去解碼鎖碼就會出現,檔案使用中的保護警告
我有點煩惱?因為要執行薪資計算的人是財務協理,做事很龜毛,她一定會去看檔案的
有何好對策?請建議!謝謝! |
|
回頂端 |
|
 |
garfield Site Admin

註冊時間: 2003-01-30 文章: 2160
第 13 樓
|
發表於: 星期日 三月 13, 2005 5:35 pm 文章主題: |
|
|
將加密過的檔案隱藏起來, 要看只能用你的程式解碼後才能自己去開啟.
將加密過的檔案存在你的table.memo欄位, 要看的時便解密到檔案去. _________________ 利用>>搜尋<<的功能會比問的還要快得到答案. |
|
回頂端 |
|
 |
goto-dream
註冊時間: 2004-05-11 文章: 909
第 14 樓
|
|
回頂端 |
|
 |
goto-dream
註冊時間: 2004-05-11 文章: 909
第 15 樓
|
|
回頂端 |
|
 |
|
|
您 無法 在這個版面發表文章 您 無法 在這個版面回覆文章 您 無法 在這個版面編輯文章 您 無法 在這個版面刪除文章 您 無法 在這個版面進行投票 您 無法 在這個版面附加檔案 您 無法 在這個版面下載檔案
|
|