  | 
				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 樓
  | 
		 | 
	 
	
		| 回頂端 | 
		 | 
	 
	
		  | 
	 
	
		 | 
	 
 
  
  	 
	    
  	   | 
 	
您 無法 在這個版面發表文章 您 無法 在這個版面回覆文章 您 無法 在這個版面編輯文章 您 無法 在這個版面刪除文章 您 無法 在這個版面進行投票 您 無法 在這個版面附加檔案 您 無法 在這個版面下載檔案
  | 
   
  
		 |