1

I need to port this code (console application in c#): Decrypt PHP encrypted string in C# to WinRT code. I have:

class Crypto{const string Key = "lkirwf897+22#bbtrm8814z5qq=498j5"; 
const string IV = "741952hheeyy66#cs!9hjv887mxx7@8y";
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);

}}

I have an error in the last line of the Encrypt function: Additional information: No mapping for the Unicode character exists in the target multi-byte code page. I would like to get the same result like in topic above. This solution can be correct without error?

UPDATE I removed the error. Code is:

class Crypto{const string Key = "lkirwf897+22#bbtrm8814z5qq=498j5"; 
const string IV = "741952hheeyy66#cs!9hjv887mxx7@8y";

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);
    }
}}

But the result of this code it's not the same like from topic above. I need this because I have to communicate with php server.

UPDATE#2 Ok, I learned that in WinRT can I use only 128AES. So, I changed PHP script:

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); return($rtn);}

And for

  • password = "Asd"
  • Key = "lkirwf897+22#bbt" it's must be 16bit
  • IV = "741952hheeyy66#c"

I have in c# "eSy8m8ygN7rtC80DMdGOUQ==". I need this in PHP.

Community
  • 1
  • 1
Quiet
  • 115
  • 2
  • 14

1 Answers1

0

Well, here's my solution.

In C# code I need to merge two byte array before encode it into 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 />';

And here is C# code:

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);
Vlad
  • 852
  • 10
  • 23