2013-05-16 76 views
1

我試圖在兩個不同的平臺上設置AES加密/解密。在加密或解密時,我一直無法讓VB.net給我預期的輸出,所以我做了一點實驗:無法在VB中正確設置AES解密.net

使用相同的System.Security.Cryptography.AesManaged對象進行加密和解密,原始數據返回,但使用不同的對象進行加密和解密,我得到不同的答案。我的代碼如下

Dim AES As New System.Security.Cryptography.AesManaged 
    Dim AES2 As New System.Security.Cryptography.AesManaged 
    Dim key() As Byte = New Byte() {&HDE, &HAD, &HBE, &HEF, &HA5, &HF4, &H56, &H12, &HDE, &HAD, &HBA, &HAB, &H1, &H92, &H83, &H74} 
    Dim nulliv() As Byte = New Byte() {&H0, &H0, &H0, &H0, &H0, &H0, &H0, &H0, &H0, &H0, &H0, &H0, &H0, &H0, &H0, &H0} 

    AES.Key = key 
    AES.KeySize = 128 
    AES.BlockSize = 128 
    AES.Padding = Security.Cryptography.PaddingMode.None 
    AES.Mode = Security.Cryptography.CipherMode.CBC 
    AES.IV = nulliv 

    AES2.Key = key 
    AES2.KeySize = 128 
    AES2.BlockSize = 128 
    AES2.Padding = Security.Cryptography.PaddingMode.None 
    AES2.Mode = Security.Cryptography.CipherMode.CBC 
    AES2.IV = nulliv 

    Dim DESEncrypter As System.Security.Cryptography.ICryptoTransform = AES.CreateEncryptor() 

    Dim input() As Byte = New Byte() {&H12, &H34, &H56, &H78, &H9A, &HBC, &HDE, &HF0, &H24, &H68, &HAC, &HE0, &H78, &H94, &H56, &H12} 

    Dim enc() As Byte = DESEncrypter.TransformFinalBlock(input, 0, input.Length) 

    Dim DESDecrypter As System.Security.Cryptography.ICryptoTransform = AES.CreateDecryptor 
    Dim out() As Byte = DESDecrypter.TransformFinalBlock(enc, 0, enc.Length) 

    Dim DESDecrypter2 As System.Security.Cryptography.ICryptoTransform = AES2.CreateDecryptor 
    Dim out2() As Byte = DESDecrypter2.TransformFinalBlock(enc, 0, enc.Length) 

我期望輸入,輸出和輸出2匹配,但他們沒有。輸入和輸出是相同的,但out2是不同的。我只能假設AES對象中存儲了一些東西,我沒有正確設置或在對象之間正確傳輸。

我最初嘗試ECB模式來簡化事項,但想知道是不是設置IV是有效果的。所以,我嘗試用IV作爲零的CBC,這意味着它應該和ECB一樣。在這兩種情況下,我都遇到out和out2不匹配的問題。

任何人都可以向我解釋我失蹤了嗎?謝謝

回答

1

不要將KeySize屬性分配給128.當您這樣做時,它會導致AesManaged將您先前提供的密鑰爲空。 AesManaged,還可以根據您提供的實際密鑰的密鑰大小,所以改成這樣:

Dim AES As New System.Security.Cryptography.AesManaged 
Dim AES2 As New System.Security.Cryptography.AesManaged 
Dim key() As Byte = New Byte() {&HDE, &HAD, &HBE, &HEF, &HA5, &HF4, &H56, &H12, &HDE, &HAD, &HBA, &HAB, &H1, &H92, &H83, &H74} 
Dim nulliv() As Byte = New Byte() {&H0, &H0, &H0, &H0, &H0, &H0, &H0, &H0, &H0, &H0, &H0, &H0, &H0, &H0, &H0, &H0} 

AES.Key = key 
AES.Padding = Security.Cryptography.PaddingMode.None 
AES.Mode = Security.Cryptography.CipherMode.CBC 
AES.IV = nulliv 

AES2.Key = key 
AES2.Padding = Security.Cryptography.PaddingMode.None 
AES2.Mode = Security.Cryptography.CipherMode.CBC 
AES2.IV = nulliv 
'Rest of the code is the same. 
+1

PSA:請考慮使用空初始化向量,因爲這會導致安全問題。 IVs應該是隨機的,它們不應該被重用。此外,現在您的密鑰位於StackOverflow上,我建議不要使用您發佈的密鑰。最後,將填充模式設置爲「無」也是不鼓勵的。改爲使用PKCS#7。 – vcsjones

+0

就是這樣!非常感謝。這一直讓我很不便。至於使用正確的IV和另一個關鍵是的,我完全和你在一起,這段代碼只是讓我可以開始獲得一致的答案。我現在將採取我學到的知識並正確寫出來。我不知道我會怎樣處理填充,另一部分是我嘗試從儘可能少的數據發送的嵌入式平臺。無論如何,重要的是我現在可以在兩個平臺上獲得相同的答案。再次感謝。 – AlexF