2016-06-09 72 views
-1

我需要幫助才能找到c#相當於PHP mcrypt_encrypt方法。我嘗試使用Windows.Security.Cryptography命名空間進行AES CBC加密,但不可能使用8字節的IV。UWP等價於PHP mcrypt_encrypt方法

這是我的代碼:

var encoding = BinaryStringEncoding.Utf8; 

IBuffer buffMsg = CryptographicBuffer.ConvertStringToBinary(strToEncrypt, encoding); 

var objAlg = SymmetricKeyAlgorithmProvider.OpenAlgorithm(AES_CBC); 

// strToEncrypt padding 
var padding = 16 - (buffMsg.Length % 16); 
if (padding > 0) 
{ 
    var buffWithPadding = new byte[buffMsg.Length + padding]; 
    buffMsg.ToArray().CopyTo(buffWithPadding, 0); 
    buffMsg = CryptographicBuffer.CreateFromByteArray(buffWithPadding); 
} 

var key = CryptographicBuffer.CreateFromByteArray(_serverKey); 
var iv = CryptographicBuffer.CreateFromByteArray(ivPadding); 

IBuffer buffEncrypt = CryptographicEngine.Encrypt(objAlg.CreateSymmetricKey(key), buffMsg, iv); 

return CryptographicBuffer.EncodeToBase64String(buffEncrypt); 

在服務器端,mcrypt_decrypt方法使用AES 128位的密鑰(16個字節)和8個字節的初始化向量。但是,對於UWP密碼庫,IV似乎也必須具有16字節的大小。

我試圖用8個零字節填充我的IV。它「有效」,但結果與PHP的mcrypt_encrypt方法不一樣。

你有任何解決方案使用我的16字節密鑰和我的8字節IV在AES CBC模式下進行加密嗎?

感謝。 Samuel

+0

請出示所有的PHP代碼必要的輸入數據以及輸出。 –

+0

我無法在論壇上發佈AES密鑰和IV(...)。但是當然,我使用相同的AES密鑰和相同的IV。模式是CBC。 –

+0

此外,Android(所以java)AES類找到了與php方法相同的結果。但是UWP中的問題是傳遞8個字節的IV。 –

回答

0

所以,我的問題是在我的字符串到字節數組的轉換。我用下面的方法(你將檢索其他職位),但它並不在我的情況下工作:

public static byte[] StringToByteArray(string hex) 
{ 
    return Enumerable.Range(0, hex.Length) 
     .Where(x => x % 2 == 0) 
     .Select(x => Convert.ToByte(hex.Substring(x, 2), 16)) 
     .ToArray(); 
} 

和正確的方法是:

var bytes = Encoding.UTF8.GetBytes(hexString);