2010-08-22 109 views
0

給定的輸入字符串(實際上是一個整數值)和加密密鑰,我需要輸入字符串以這樣的方式加密生成的字符串是:安全加密/解密功能

  1. 網址安全(我允許的URI字符目前:AZ 0-9〜%:_-)
  2. 名安全(意思是,它僅使用有效的目錄/文件名字符)
  3. FTP帳戶的用戶名安全
  4. 電子郵件帳戶的用戶名安全

然後,給定加密的字符串和相同的加密密鑰,將字符串解密爲未加密的形式。

這不是一個安全措施。實現需要使用PHP。謝謝。

EDIT 1(解碼仍包括不期望的字符;加,也沒有辦法來確保所得到的加密的字符串是一定長度內):

function decrypt($string, $encryption_key) 
{ 
    assert(isset($string) === TRUE); 
    assert(isset($encryption_key) === TRUE); 

    $result = ''; 
    $string = base64_decode($string); 

    for ($i = 0; $i < strlen($string); $i++) 
    { 
     $char = substr($string, $i, 1); 
     $keychar = substr($encryption_key, ($i % strlen($encryption_key)) - 1, 1); 
     $char = chr(ord($char) - ord($keychar)); 
     $result .= $char; 
    } 

    return $result; 
} 


function encrypt($string, $encryption_key) 
{ 
    assert(isset($string) === TRUE); 
    assert(isset($encryption_key) === TRUE); 

    $string = (string) $string; 
    $result = ''; 

    for ($i = 0; $i < strlen($string); $i++) 
    { 
     $char = substr($string, $i, 1); 
     $keychar = substr($encryption_key, ($i % strlen($encryption_key)) - 1, 1); 
     $char = chr(ord($char) + ord($keychar)); 
     $result .= $char; 
    } 

    return base64_encode($result); 
} 
+1

你掙扎着的部分是什麼?或者這是一個更復雜的「給代碼」? – Artefacto 2010-08-22 22:53:59

+0

正在尋找已經擁有此功能的人。希望我不是世界上第一個有這樣要求的人。如果你有這樣的功能(或者甚至有一些功能),如果你不介意分享,那麼我很樂意看到它。 – StackOverflowNewbie 2010-08-22 22:58:28

+0

@Stack所以這實際上不是一個編程問題,它是[信息檢索](http://en.wikipedia.org/wiki/Information_retrieval)任務。然後投票結束。 – Artefacto 2010-08-22 23:00:30

回答

1

考慮加密和編碼爲兩個不同的和無關的步驟。在一個方向上,您加密明文字節以獲取密碼字節,然後對字節進行編碼以獲取字符串。另一個方向是解碼字符串以獲得密文字節,然後解密密文字節以獲取明文字節。

通過使用簡單的十六進制或基本16位編碼器將字節轉換爲兩個十六進制字符,可以最簡單地滿足您的要求。如果編碼空間效率是絕對關鍵的,您可以實現自己的base-62編碼器,該編碼器只使用大小寫字母和數字。它會比十六進制編碼更慢並且可能更醜。

EDIT 1:

如果base-64編碼產生可接受字符串就更好了。 Base-64使用4個字符來編碼3個字節。因此,如果限制爲64個字符,則不能編碼超過(64/4)* 3 = 48個字節。

+0

這是個好主意。我已經有一個加密/解密功能。我的問題是我收到了不受歡迎的字符。有沒有辦法確保編碼結果的字符串不超過一定的長度? (例如,電子郵件地址的本地部分顯然僅限於64個字符:http://en.wikipedia.org/wiki/Email_address#Specification) – StackOverflowNewbie 2010-08-22 23:09:39

+0

我編輯了原始帖子。任何建議如何我可以改善編碼? – StackOverflowNewbie 2010-08-22 23:14:10

1

對於加密,根據您的安全需求,mcrypt_encrypt(http://us2.php.net/manual/en/function.mcrypt-encrypt.php)功能可能非常簡單。

一旦你得到它的工作,然後,如果你需要更多的安全性,你可以改變加密功能,因爲你的程序的其餘部分不會在意。

一旦你加密你可以使用base64編碼(http://us2.php.net/manual/en/function.base64-encode.php),這是一個已知的模式,經過充分測試。

由於您正在加密長度至多爲8個字節的int,所以任何長度的密鑰都應該沒問題,爲了獲得已知大小的結果,您的密鑰需要大於等於8個字節。

我建議你不要寫你自己的加密算法,因爲它會變得不安全,並且有很多東西可以滿足你的需求,這取決於你有什麼其他的要求。如前所述,您可以回退並確定您希望編碼字符串的大小,這會告訴您加密結果可以有多少字節。然後,您可以計算出密鑰的大小,以獲得加密消息的大小。

如果要加密任意長度的字符串,則前一段會出錯,因爲加密消息的大小將不可知。

+0

只使用mcrypt是不夠的。你必須知道如何使用它。我在那裏看到的大部分使用mcrypt的代碼總是重複使用相同的IV ... – Artefacto 2010-08-23 00:12:37

+0

@Artefacto - 我包括指向手冊的鏈接,因爲我發現其他人的評論比原始文檔要好,但它需要同時通讀。但是,如何使用mcrypt也會是一個不同的問題,因爲他可以展示他如何使用它,然後其他人就可以展示如何更安全地使用它。 – 2010-08-23 00:44:36