2013-02-12 25 views
1

不會回來一樣,我用這個例子佈雷特給:加密值每次

Encrypt and decrypt a string

而且這樣做:

public static bool VerifyLicenseKey(string applicationGuid) 
{ 
    Console.WriteLine("G: " + applicationGuid); 
    var appSettings = AppSettings.GetInstance(); 
    if (appSettings == null) 
    { 
    return false; 
    } 
    var hwinfo = HardwareInfo.GetHardwareSerial(); 
    Console.WriteLine("h: " + hwinfo); 
    Console.WriteLine("a: " + applicationGuid); 
    var currentSerial = Crypto.EncryptStringAES(hwinfo, applicationGuid); 
    Console.WriteLine("c: " + currentSerial); 
    Console.WriteLine("o: " + appSettings.LicenseSerialNumber); 
    if (currentSerial == appSettings.LicenseSerialNumber) 
    { 
    return true; 
    } 
    return false; 
} 

}

GetHardwareSerialapplicationGuid每次都回來,但當我打電話EncryptStringAES它不是。

我使用錯誤的類嗎?不是每次都是一樣的嗎?

如果不是,有人有一個更好的例子,其中加密值是相同的?

+2

這個信息是真的祕密,還是隻需要正確?我想你想要一個[消息認證碼](http://en.wikipedia.org/wiki/Message_authentication_code)或[數字簽名](http://en.wikipedia.org/wiki/Digital_signature),而不是加密。 – 2013-02-12 15:06:48

+0

或者您可以使用更簡單的MD5哈希或CRC32校驗和。 – 2013-02-12 15:11:23

+0

我需要它加密,每次加密時都不容易複製和加密。 – ErocM 2013-02-12 15:12:07

回答

3

你指的是該算法使用RijndaelManaged class,它似乎可以用其IV property的默認值是(非常正確)當你創建一個新的實例會自動設置爲一個新的隨機值(見文檔)。

因此,您每次都會得到不同的結果。 (例如,您可以在Wikipedia上找到有關IV的用途的更多信息。)

+0

好的,你有一個不會動態加密的例子嗎? – ErocM 2013-02-12 15:14:16

+0

如果您願意,您當然可以設置IV屬性,但這會削弱加密。如果您每次都想要相同的結果,請使用加密哈希,而不是加密算法(儘管目標根本不同)。 – Bruno 2013-02-12 15:15:29

+0

當你說設置它時你指的是這個部分:var encryptor = aesAlg.CreateEncryptor(aesAlg.Key,aesAlg.IV) – ErocM 2013-02-12 15:18:19

4

您的「加密」實際上只是模糊處理,並不太難繞過。 所有人都需要知道的是你的應用程序GUID(可能是公開存儲的)以及獲得相同硬件ID的方法(你可能沒有寫過,而且很容易找到)。

當然,您希望保護工作的難度取決於您的軟件的價值或高容量,因此簡單的混淆可能就足夠了。忘記AES,你需要的是一個散列算法,比如SHA或者MD5,你可以將你的應用程序guid,硬件編號,用戶名等散列在一起並存儲散列。對於大多數典型的用戶來說,這足以起到威懾作用。

如果您堅持要有難以破解的保護,您需要的是數字簽名和激活程序。請參閱RSACryptoServiceProvider

基本上你創建一個知道你的私鑰的服務,並將匹配的公鑰放到你的軟件中。然後從軟件中調用帶有HardwareInfo的服務以及任何您想要驗證的其他信息,服務將對其進行簽名並返回簽名哈希。

一旦你在客戶端有了這些,你可以使用公鑰檢查簽名,即使信息可以以明文存儲,簽名也不能輕易重新創建。

另外check this question瞭解更多信息。

+0

+1是的,我只是想讓它的平均喬不能複製我們的軟件從一臺計算機到另一臺沒有一些工作。雖然信息很好。這比我真正需要的要多得多。 – ErocM 2013-02-12 16:24:24

+0

天哪,你的草圖解決方案聽起來很糟糕。您提議的服務如何不會自動受到選擇明文攻擊? RSA的安全性取決於以下事實:*使用私鑰加密的文本是由密鑰持有者*創建的。 – 2013-02-12 21:35:13

+0

@EricLippert要麼我不理解你的評論,要麼你不明白解決方案。哪一部分可以選擇明文攻擊?這幾乎是所有軟件激活工作的方式 – 2013-02-12 21:37:48

0

是啊絕大多數AES加密是非確定性的(並有充分的理由)它不適用於你,但既然你只是想比較一個加密結果而你並不真正想解密,我可以建議使用HMAC代替。