#c# #php #encryption #rijndael
#c# #php #шифрование #rijndael
Вопрос:
Я пытаюсь расшифровать параметры запроса для функции CNL JDownloader.
http://jdownloader.org/knowledge/wiki/glossary/cnl2
В этом примере iv и ключ ‘31323334353637383930393837363534’ и я пытаюсь расшифровать это значение ‘DRurBGEf2ntP7Z0WDkMP8e1ZeK7PswJGeBHCg4zEYXZSE3Qqxsbi5EF1KosgkKQ9SL8qOOUAI’ php-код в примере для шифрования выглядит следующим образом
Я знаю, что мне нужно расшифровать ключ из шестнадцатеричного в строку, это означает, что правильный ключ — 1234567890987654
function base16Encode($arg){
$ret="";
for($i=0;$i<strlen($arg);$i ){
$tmp=ord(substr($arg,$i,1));
$ret.=dechex($tmp);
}
return $ret;
}
$key="1234567890987654";
$transmitKey=base16Encode($key);
$link="http://rapidshare.com/files/285626259/jDownloader.dmgrnhttp://rapidshare.com/files/285622259/jDownloader2.dmg";
$cp = mcrypt_module_open(MCRYPT_RIJNDAEL_128, '', 'cbc', '');
@mcrypt_generic_init($cp, $key,$key);
$enc = mcrypt_generic($cp, $link);
mcrypt_generic_deinit($cp);
mcrypt_module_close($cp);
$crypted=base64_encode($enc);
echo $crypted;
Моя последняя попытка расшифровать — это следующий код на c #, но у меня есть некоторые проблемы с длиной ввода.
public static String DecryptRJ(string input, string iv, string key )
{
key = key.DecodeBase16(); // Extension method
byte[] initVectorBytes = Encoding.UTF8.GetBytes(iv);
byte[] cipherTextBytes = Encoding.UTF8.GetBytes(input);
byte[] keyBytes = Encoding.UTF8.GetBytes(key);
RijndaelManaged symmetricKey = new RijndaelManaged();
symmetricKey.Mode = CipherMode.CBC;
symmetricKey.BlockSize = 256;
symmetricKey.KeySize = 256;
ICryptoTransform decryptor = symmetricKey.CreateDecryptor(keyBytes, initVectorBytes);
MemoryStream memoryStream = new MemoryStream(cipherTextBytes);
CryptoStream cryptoStream = new CryptoStream(memoryStream, decryptor, CryptoStreamMode.Read);
byte[] plainTextBytes = new byte[cipherTextBytes.Length];
int decryptedByteCount = cryptoStream.Read(plainTextBytes, 0, plainTextBytes.Length);
memoryStream.Close();
cryptoStream.Close();
return Encoding.UTF8.GetString(plainTextBytes, 0, decryptedByteCount);
}
Еще одна информация этот PHP-код работает нормально и может правильно декодировать и расшифровывать.
function decrypt($data, $_key){
echo '<br><hr><br>';
out($data);
$plain=base64_decode($data);
out($plain);
echo 'init';
//$e = mcrypt_decrypt ( $_cp , $_key , $plain , 'cbc' );
$e = mcrypt_decrypt(MCRYPT_RIJNDAEL_128, $_key, $plain, 'cbc', $_key);
out($e);
echo 'end';
}
Комментарии:
1. В Php MCRYPT константа
MCRYPT_RIJNDAEL_128
означает Rijndael с размером блока 128 бит, то есть AES. Поэтому в C # вы должны установить для свойства BlockSize значение 128 или просто использовать класс AesManaged . Кроме того, ваш вывод Php имеет кодировку base64. Декодирование UTF8 в C # неверно, вам нужно использовать что-то вроде Convert.FromBase64String() .2. Ваше предложение с base64 правильное, и я это знаю, но строка, которую я получаю (см. Пример), это DRurBGEf2ntP7Z0WDkMP8e1ZeK7PswJGeBHCg4zEYXZSE3Qqxsbi5EF1KosgkKQ9SL8qOOUAI, и это сокращение от строки Base64…
3. Когда я запускаю ваш PHP-код, я получаю
DRurBGEf2ntP7Z0WDkMP8e1ZeK7PswJGeBHCg4zEYXZSE3Qqxsbi5EF1KosgkKQ92unOQB3eMZ3Kq3S0ZZJDzc9RZXCdeAPUB YCVgeaereuFcCi5y4TgvNKmaC9DbjkYAaoHN678 u/R8mmYhAXlw==
4. Да, это правильно, и теперь мне нужно расшифровать ваш результат на C#
5. Начните с замены
byte[] cipherTextBytes = Encoding.UTF8.GetBytes(input);
части кодом, который Base64-декодирует входные данные.
Ответ №1:
Хорошо, теперь я могу расшифровать зашифрованные образцы данных (см. Код php или http://jdownloader.org/knowledge/wiki/glossary/cnl2 ) Код C # — это
public static string DecryptDLCData(string data, string _key, Encoding encoding = null)
{
if (encoding == null)
encoding = Encoding.Defau<
data = data.DecodeBase64(encoding);
RijndaelManaged rijndaelCipher = new RijndaelManaged();
rijndaelCipher.Mode = CipherMode.CBC;
rijndaelCipher.Padding = PaddingMode.Zeros;
rijndaelCipher.KeySize = 256;
rijndaelCipher.BlockSize = 128;
byte[] pwdBytes = Encoding.Default.GetBytes(_key);
byte[] keyBytes = new byte[16];
int len = pwdBytes.Length;
if (len > keyBytes.Length) len = keyBytes.Length;
Array.Copy(pwdBytes, keyBytes, len);
rijndaelCipher.Key = keyBytes;
rijndaelCipher.IV = keyBytes;
var transform = rijndaelCipher.CreateDecryptor();
byte[] plainText = Encoding.Default.GetBytes(data);
byte[] cipherBytes = transform.TransformFinalBlock(plainText, 0, plainText.Length);
return Encoding.UTF8.GetString(cipherBytes);
}