2014-06-30 2 views
-1

Я пытаюсь расшифровать параметры запроса для функции CND JDownloader.C# RIJNDAEL decrypt

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.dmg\r\nhttp://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; 

Моя последняя попытка расшифровать это Fol спустив код 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'; 

}

+0

в Php Mcrypt константы 'MCRYPT_RIJNDAEL_128' означает Rijndael с 128-битный размер блока, т.е. AES. Поэтому в C# вы должны установить для свойства BlockSize значение 128 или просто использовать класс AesManaged. Кроме того, вы получаете Php-код base64. UTF8-декодирование на C# неверно, вам нужно использовать что-то вроде [Convert.FromBase64String()] (http://msdn.microsoft.com/en-us/library/system.convert.frombase64string (v = vs.110). ASPX). –

+0

Ваше предложение с base64 правильно и я знаю это, но строка я получаю (см образца) DRurBGEf2ntP7Z0WDkMP8e1ZeK7PswJGeBHCg4zEYXZSE3Qqxsbi5EF1KosgkKQ9SL8qOOUAI и это является коротким для строки Base64 ... –

+0

Когда я запускаю свой PHP код я получаю 'DRurBGEf2ntP7Z0WDkMP8e1ZeK7PswJGeBHCg4zEYXZSE3Qqxsbi5EF1KosgkKQ92unOQB3eMZ3Kq3S0ZZJDzc9RZXCdeAPUB + YCVgeaereuFcCi5y4TgvNKmaC9DbjkYAaoHN678 + и/R8mmYhAXlw == ' –

ответ

0

Хорошо, теперь я могу расшифровать зашифрованные данные образца (см код 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.Default; 
     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); 
    } 
Смежные вопросы