[英]Port AES encryption code to WinRT
我需要移植此代碼(C#中的控制台應用程序):將C#中的PHP加密字符串解密為WinRT代碼。 我有:
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);
}}
我在Encrypt函數的最后一行中出錯:其他信息:目標多字節代碼頁中不存在Unicode字符的映射。 我希望得到與上述主題相同的結果。 這個解決方案可以正確無誤嗎?
更新我刪除了錯誤。 代碼是:
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);
}
}}
但是這段代碼的結果與上面的主題不同。 我需要這個,因為我必須與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);}函數cryptoRJ128($ key,$ iv,$ string_to_encrypt){$ rtn = mcrypt_encrypt(MCRYPT_RIJNDAEL_128,$ key,$ string_to_encrypt,MCRYPT_MODE_CBC,$ iv); $ rtn = base64_encode($ rtn); 返回($ RTN);}
而對於
我在c#“ eSy8m8ygN7rtC80DMdGOUQ ==”。 我在PHP中需要這個。
好吧,這是我的解決方案。
在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);
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.