2015-12-23 44 views
1

我需要將此代碼(控制檯應用程序在C#中): Decrypt PHP encrypted string in C# WinRT代碼。我有:端口AES加密代碼WinRT

class Crypto{const string Key = "lkirwf897+22#bbtrm8814z5qq=498j5"; 
const string IV = "741952hheeyy66#[email protected]"; 
public static string Encrypt(string login) 
{ 
    var input = CryptographicBuffer.ConvertStringToBinary(login, BinaryStringEncoding.Utf8); 
    var key1 = CryptographicBuffer.ConvertStringToBinary(Key, BinaryStringEncoding.Utf8); 
    var iv = CryptographicBuffer.ConvertStringToBinary(IV, BinaryStringEncoding.Utf8); 

    var encryptor = SymmetricKeyAlgorithmProvider.OpenAlgorithm(SymmetricAlgorithmNames.AesCbcPkcs7); 

    var key2 = encryptor.CreateSymmetricKey(key1); 

    var encrypted = CryptographicEngine.Encrypt(key2, input, iv); 

    return CryptographicBuffer.ConvertBinaryToString(BinaryStringEncoding.Utf8, encrypted); 
} 

public static string Decrypt(string LoginToDecode) 
{ 
    var input = CryptographicBuffer.ConvertStringToBinary(LoginToDecode, BinaryStringEncoding.Utf8); 
    var key1 = CryptographicBuffer.ConvertStringToBinary(Key, BinaryStringEncoding.Utf8); 
    var iv = CryptographicBuffer.ConvertStringToBinary(IV, BinaryStringEncoding.Utf8); 

    var decryptor = SymmetricKeyAlgorithmProvider.OpenAlgorithm(SymmetricAlgorithmNames.AesCbcPkcs7); 

    var key2 = decryptor.CreateSymmetricKey(key1); 

    var decrypted = CryptographicEngine.Decrypt(key2, input, iv); 

    return CryptographicBuffer.ConvertBinaryToString(BinaryStringEncoding.Utf8, decrypted); 

}} 

我有加密功能的最後一行的錯誤: 附加信息:在目標多字節代碼頁中存在的Unicode字符沒有映射。 我想要獲得與上述主題相同的結果。這個解決方案可以正確無誤嗎?

UPDATE 我刪除了錯誤。代碼是:

class Crypto{const string Key = "lkirwf897+22#bbtrm8814z5qq=498j5"; 
const string IV = "741952hheeyy66#[email protected]"; 

public static string Encrypt(string login) 
{ 
    var input = CryptographicBuffer.ConvertStringToBinary(login, BinaryStringEncoding.Utf8); 
    var key1 = CryptographicBuffer.ConvertStringToBinary(Key, BinaryStringEncoding.Utf8); 
    var iv = CryptographicBuffer.ConvertStringToBinary(IV, BinaryStringEncoding.Utf8); 

    var encryptor = SymmetricKeyAlgorithmProvider.OpenAlgorithm(SymmetricAlgorithmNames.AesCbcPkcs7); 

    var key2 = encryptor.CreateSymmetricKey(key1); 

    var encrypted = CryptographicEngine.Encrypt(key2, input, iv); 

    return CryptographicBuffer.EncodeToBase64String(encrypted); 
} 

public static string Decrypt(string LoginToDecode) 
{ 
    var input = CryptographicBuffer.DecodeFromBase64String(LoginToDecode); 
    var key1 = CryptographicBuffer.ConvertStringToBinary(Key, BinaryStringEncoding.Utf8); 
    var iv = CryptographicBuffer.ConvertStringToBinary(IV, BinaryStringEncoding.Utf8); 

    var decryptor = SymmetricKeyAlgorithmProvider.OpenAlgorithm(SymmetricAlgorithmNames.AesCbcPkcs7); 

    var key2 = decryptor.CreateSymmetricKey(key1); 

    var decrypted = CryptographicEngine.Decrypt(key2, input, iv); 

    return CryptographicBuffer.ConvertBinaryToString(BinaryStringEncoding.Utf8, decrypted); 
    } 
}} 

但這種代碼的結果是不是像上面的題目相同。我需要這個,因爲我必須與PHP服務器進行通信。

UPDATE#2 好吧,我瞭解到,在WinRT中我只能使用128AES。於是,我改變了PHP腳本:

function decryptRJ128($key,$iv,$string_to_decrypt){ 

$ string_to_decrypt = BASE64_DECODE($ string_to_decrypt); $ rtn = mcrypt_decrypt(MCRYPT_RIJNDAEL_128,$ key,$ string_to_decrypt,MCRYPT_MODE_CBC,$ iv); $ rtn = rtrim($ rtn,「\ 0 \ 4」); return($ rtn);} function encryptRJ128($ key,$ iv,$ string_to_encrypt){$ rtn = mcrypt_encrypt(MCRYPT_RIJNDAEL_128,$ key,$ string_to_encrypt,MCRYPT_MODE_CBC,$ iv); $ rtn = base64_encode($ rtn);回報($ RTN);}

而對於

  • 密碼= 「性Asd」
  • 重點= 「lkirwf897 + 22#BBT」 這是必須16bit的
  • IV = 「741952hheeyy66#C」

我在c#「eSy8m8ygN7rtC80DMdGOUQ ==」。我需要這個在PHP中。

+0

我注意到其他的解決辦法是使用ASCII編碼,而不是統一的。 – dbugger

+0

@dbugger好的,但我不能在WinRT中使用ASCII編碼。 – Quiet

+0

有趣,很煩人,因爲問題在於編碼差異。 – dbugger

回答

0

嗯,這是我的解決方案。

在C#代碼中,我需要合併兩個字節數組,然後將其編碼爲base64。

/* PHP */ 
$key  = '12345678abcdefgh'; 
$text  = "d9e978bc7ca9179f0d51e91521d41d8d"; 

$iv_size = mcrypt_get_iv_size(MCRYPT_RIJNDAEL_128, MCRYPT_MODE_CBC); 
$iv   = mcrypt_create_iv($iv_size); 
$iv   = '87654321hgfedcba'; //Just to test 

$encrypted = mcrypt_encrypt(MCRYPT_RIJNDAEL_128, $key, $text, MCRYPT_MODE_CBC, $iv); 
$encrypted = base64_encode($iv.$encrypted); 

$decryptedd = base64_decode($encrypted); 
$iv_dec  = substr($decryptedd, 0, $iv_size); 
$decrypted = substr($decryptedd, $iv_size); 
$decrypted = mcrypt_decrypt(MCRYPT_RIJNDAEL_128, $key, $decrypted, MCRYPT_MODE_CBC, $iv_dec); 

echo 'Key: '.$key.'<br />'; 
echo 'Text: '.$text.'<br />'; 
echo 'IV: '.$iv.' (Size: '.$iv_size.')<br />'; 
echo 'Encrypted: '.$encrypted.'<br />'; 
echo 'IV decrypted: '.$iv_dec.'<br />'; 
echo 'Decrypted: '.$decrypted.'<br />'; 

這裏是C#代碼:

var input = CryptographicBuffer.ConvertStringToBinary("d9e978bc7ca9179f0d51e91521d41d8d", BinaryStringEncoding.Utf8); 
var key = CryptographicBuffer.ConvertStringToBinary("12345678abcdefgh", BinaryStringEncoding.Utf8); 
var iv = CryptographicBuffer.ConvertStringToBinary("87654321hgfedcba", BinaryStringEncoding.Utf8); 

var encryptor = SymmetricKeyAlgorithmProvider.OpenAlgorithm(SymmetricAlgorithmNames.AesCbc); 

byte[] a = iv.ToArray(); 
byte[] b = CryptographicEngine.Encrypt(encryptor.CreateSymmetricKey(key), input, iv).ToArray(); 

byte[] c = new byte[a.Length + b.Length]; 
Buffer.BlockCopy(a, 0, c, 0, a.Length); 
Buffer.BlockCopy(b, 0, c, a.Length, b.Length); 

var result = Convert.ToBase64String(c);