2013-04-03 2 views
1

Я пытаюсь построить простой процесс шифрования RSA-шифрования между C# и PHP. Я выполнил шифрование в PHP и decrpyt в C# с phpseclib (http://phpseclib.sourceforge.net/). Тем не менее я получаю "ошибку Дешифрования в C: \ XAMPP \ HTDOCS \ Crypt \ RSA.php на линии 2103", который эта часть:C# encrypt PHP decrypt using RSA

if ($lHash != $lHash2) { 
     user_error('Decryption error', E_USER_NOTICE); 
     return false; 
    } 

шифрование в C# я использовал эту кучу коды:

RSACryptoServiceProvider rsaCryptoServiceProvider = new RSACryptoServiceProvider(dwKeySize); 
     rsaCryptoServiceProvider.FromXmlString(publickey); 
     int keySize = dwKeySize/8; 
     byte[] bytes = Encoding.UTF32.GetBytes(inputString); 
     // The hash function in use by the .NET RSACryptoServiceProvider here is SHA1 
     // int maxLength = (keySize) - 2 - (2 * SHA1.Create().ComputeHash(rawBytes).Length); 
     int maxLength = keySize - 42; 
     int dataLength = bytes.Length; 
     int iterations = dataLength/maxLength; 
     StringBuilder stringBuilder = new StringBuilder(); 
     for (int i = 0; i <= iterations; i++) 
     { 
      byte[] tempBytes = new byte[(dataLength - maxLength * i > maxLength) ? maxLength : dataLength - maxLength * i]; 
      Buffer.BlockCopy(bytes, maxLength * i, tempBytes, 0, tempBytes.Length); 
      byte[] encryptedBytes = rsaCryptoServiceProvider.Encrypt(tempBytes, true); 
      // Be aware the RSACryptoServiceProvider reverses the order of encrypted bytes after encryption and before decryption. 
      // If you do not require compatibility with Microsoft Cryptographic API (CAPI) and/or other vendors. 
      // Comment out the next line and the corresponding one in the DecryptString function. 
      Array.Reverse(encryptedBytes); 
      // Why convert to base 64? 
      // Because it is the largest power-of-two base printable using only ASCII characters 
      stringBuilder.Append(Convert.ToBase64String(encryptedBytes)); 
     } 
     string ciphertext = stringBuilder.ToString(); 

и мой основной код PHP в decrpyt:

$rsa->loadKeyfromXML($privatekey); 
$ciphertext = file_get_contents('cipher.txt'); 
$ciphertext = base64_decode(strrev($ciphertext)); 

//$rsa->setEncryptionMode(CRYPT_RSA_ENCRYPTION_PKCS1); 

$plaintext = $rsa->decrypt($ciphertext); 

Я попытался PKC1 также дал другую ошибку в Печерском/RSA.php

ответ

1

yay Я только что нашел решение самостоятельно. Я изменил линию шифрования:

byte[] bytes = Encoding.UTF32.GetBytes(inputString); ==> byte[] bytes = Encoding.Default.GetBytes(inputString); 

, а также как @Ryan сказал:

$ciphertext = base64_decode(strrev($ciphertext)); ==> $ciphertext = strrev(base64_decode($ciphertext)); 

Спасибо за вашу attemps.

0

Поскольку вы делаете Array.Reverse в C#, я бы не угадал, что strrev в PHP не нужно.

Кроме того, в Crypt_RSA от phpseclib нет loadKeyfromXML. Откуда вы это взяли? Делать $rsa->loadKey() должно быть достаточно.

Наконец, я предполагаю, что потребуется PKCS1. Какая ошибка вы получаете, когда используете ее?

+0

Да $ rsa-> loadKey() также работает, это не имеет никакого значения. для PKCS, поскольку я прокомментировал это, дает такую ​​же ошибку, к сожалению – relativelyPrime

+0

Вы пробовали это без 'strrev'? – neubert

+0

yeap Я также пробовал с/out strrev и base64_decode. все еще давая ошибку на той же строке в RSA.php Также, когда я использую PKCS1, я получаю ошибку в строке: if (ord ($ em [0])! = 0 || ord ($ em [1])> 2) { user_error ('Ошибка дешифрования', E_USER_NOTICE); return false; } – relativelyPrime

0

Мне кажется, что в PHP вы используете шифрованный текст с кодировкой Base64, реверсив это, а затем пытаетесь его декодировать Base64? Я бы подумал, что вы хотите сначала его декодировать, а затем изменить результат. Это не одно и то же.

Независимо от того, требуется ли какое-либо из этих переворачиваний в первую очередь, я не могу сказать.

+0

Да, я просто взял код из источника, поэтому с помощью реверса. Для шифрования base64 из php и дешифрования в C# хорошо сработало для этого, я использовал ту же операцию – relativelyPrime

+0

Сначала пробовал декодировать, затем strrev с (out) PKCS1 все еще выдавал ошибку в одной строке без PKCS1, а с PKCS1 он выдавал ошибку при: 'if (ord ($ em [0])! = 0 || ord ($ em [1])> 2) '. – relativelyPrime

0

Должен сказать, что я не полностью понял вашу проблему, но, похоже, это сочетание шифрования RSA в C# и PHP. У меня также были некоторые проблемы с этим, и для всех, кого это все еще интересовало, я написал рабочий проект, который делает это, программа C# и PHP-скрипт создают ключи RSA и обменивают их, а затем обмениваются зашифрованными (см. here).