Наличие дешифрования проблемы в C# что-то зашифрованное на iPhone с помощью RSA

Слабые ссылки собраны нетерпеливо. Если GC найдет, что объект слабо достижим (достижимый только через слабые ссылки), это очистит слабые ссылки на тот объект сразу. По сути, они хороши для хранения ссылки на объект, для которого Ваша программа также сохраняет (сильно ссылаемой) "связанной информацией" somewere, как кэшируемая отражательная информация о классе или обертка для объекта, и т.д. Что-либо, что не имеет никакого смысла сохранять после объекта, с которым это связано, является редактором GC, Когда слабая ссылка очищена, это ставится в очередь в ссылочной очереди, которую Ваш код опрашивает где-нибудь, и это отбрасывает связанные объекты также. Таким образом, Вы храните дополнительную информацию об объекте, но та информация не нужна однажды объект, к которому это относится, уходит. На самом деле в определенных ситуациях можно даже разделить WeakReference на подклассы и хранить связанную дополнительную информацию об объекте в областях подкласса WeakReference. Другое типичное использование WeakReference в сочетании с Картами для хранения канонических экземпляров.

SoftReferences, с другой стороны, хороши для кэширования внешних, recreatable ресурсов, поскольку GC обычно задерживает очистку их. Это гарантируется, хотя тот весь SoftReferences будет очищен, прежде чем OutOfMemoryError брошен, таким образом, они теоретически не могут вызвать OOME [*].

Типичный пример варианта использования сохраняет проанализированную форму содержание из файла. Вы реализовали бы систему, где Вы загрузите файл, проанализируете его и сохраните SoftReference к корневому объекту проанализированного представления. В следующий раз, когда Вам нужен файл, Вы попытаетесь получить его через SoftReference. Если можно получить его, Вы сэкономили себя другая загрузка/синтаксический анализ, и если GC очистил его тем временем, Вы перезагружаете его. Тем путем Вы используете свободную память для оптимизации производительности, но не рискуете OOME.

Теперь для [*]. Хранение SoftReference не может вызвать OOME сам по себе. С другой стороны, при ошибочном использовании SoftReference для задачи, WeakReference предназначен, чтобы использоваться (а именно, Вы сохраняете информацию связанной с Объектом так или иначе сильно ссылаемый и отбрасываете ее, когда Ссылочный объект очищен), можно столкнуться с OOME как с кодом, который опрашивает ReferenceQueue и отбрасывает связанные объекты, могло бы оказаться, не работал бы своевременно.

Так, решение зависит от использования - при кэшировании информации, которая является дорогой, чтобы создать, но тем не менее reconstructible от других данных, использовать мягкие ссылки - если Вы сохраняете ссылку на канонический экземпляр некоторых данных, или Вы хотите иметь ссылку на объект, не "владея" им (таким образом препятствование тому, чтобы он был GC'd), использовал слабую ссылку.

8
задан 10 revs, 2 users 97% 17 May 2011 в 20:29
поделиться

5 ответов

Ну ... первый шаг (как вы говорите, вы уже сделали) - зашифровать одни и те же сообщения с теми же векторами инициализации, используя как iPhone, так и реализацию C #. Вы должны получить такой же результат. Вы сказали, что не сделали этого, поэтому существует проблема.

Это означает либо:

  • Реализация RSA для iPhone неверна.
  • Реализация RSA в .NET неверна.
  • Ключевые файлы: отличается (или интерпретируется по-разному).

Я бы предположил, что первые два маловероятны, однако они возможны удаленно.

Вы утверждаете: «Установленный файл .cer в другом хранилище сертификатов и зашифрованная сервером строка прекрасно обрабатывается» ... это ничего не доказывает: все это доказывает, что с заданным случайным набором чисел вы можете успешно зашифровать / дешифровать на одной платформе. Вы не гарантируете, что обе платформы видят один и тот же набор случайных чисел.

Поэтому я предлагаю вам снизить его до минимально возможного уровня. Проверьте прямые (байтовый массив) входы и выходы шифрования на обеих платформах. Если с точно такими же (двоичными) входами вы не получаете одинаковый результат, значит, у вас проблема с платформой. Я думаю, что это маловероятно, поэтому я предполагаю, что вы обнаружите, что IV интерпретируются по-разному.

3
ответ дан 6 December 2019 в 04:41
поделиться

Поскольку вы контролируете обе стороны, моя рекомендация (если вы не можете заставить алгоритмы шифрования библиотеки работать вместе на двух платформах) заключалась бы в том, чтобы написать шифрование самостоятельно с обеих сторон, используя один и тот же алгоритм. .

Таким образом, у вас будет контроль и вы сможете отлаживать внутренние механизмы шифрования, чтобы увидеть, что происходит не так.

Это последнее средство (конечно), но, вероятно, потребовало бы меньше времени, чем три дня которые вы уже потратили и имеете высокие шансы на успех

HTH

-3
ответ дан 6 December 2019 в 04:41
поделиться

Думаю, вы сами ответили на вопрос. Проблема, безусловно, заключается в порядке байтов.

Это возможный способ написания методов двустороннего преобразования:

short convert_short(short in)
{
 short out;
 char *p_in = (char *) ∈
 char *p_out = (char *) &out;
 p_out[0] = p_in[1];
 p_out[1] = p_in[0];  
 return out;
}

long convert_long(long in)
{
 long out;
 char *p_in = (char *) ∈
 char *p_out = (char *) &out;
 p_out[0] = p_in[3];
 p_out[1] = p_in[2];
 p_out[2] = p_in[1];
 p_out[3] = p_in[0];  
 return out;
} 

Это может быть для вас хорошим ресурсом (кроме википедии): http: // betterexplained .com / article /standing-big-and-little-endian-byte-order /

-2
ответ дан 6 December 2019 в 04:41
поделиться

это мой первый ответ по stackoverflow, поэтому, пожалуйста, простите меня, если я сделаю это неправильно!

Я не могу дать вам полный ответ, однако у меня были очень похожие проблемы, когда я пытался для интеграции с PHP - похоже, что формат файлов сертификатов Apple немного отличается от того, который ожидает другое программное обеспечение (включая openssl).

Вот как я расшифровываю зашифрованную подпись в PHP - я фактически извлекаю модуль и PK из переданный открытый ключ вручную и использовать его для RSA, а не пытаться импортировать ключ:

// Public key format in hex (2 hex chars = 1 byte):
//30480241009b63495644db055437602b983f9a9e63d9af2540653ee91828483c7e302348760994e88097d223b048e42f561046c602405683524f00b4cd3eec7e67259c47e90203010001
//<IGNORE><--------------------------------------------- MODULUS --------------------------------------------------------------------------><??>< PK > 
// We're interested in the modulus and the public key.
// PK = Public key, probably 65537

// First, generate the sha1 of the hash string:
$sha1 = sha1($hashString,true);

// Unencode the user's public Key:
$pkstr = base64_decode($publicKey);
// Skip the <IGNORE> section:
$a = 4;
// Find the very last occurrence of \x02\x03 which seperates the modulus from the PK:
$d = strrpos($pkstr,"\x02\x03");
// If something went wrong, give up:
if ($a == false || $d == false) return false;
// Extract the modulus and public key:
$modulus = substr($pkstr,$a,($d-$a));
$pk = substr($pkstr,$d+2);

// 1) Take the $signature from the user
// 2) Decode it from base64 to binary
// 3) Convert the binary $pk and $modulus into (very large!) integers (stored in strings in PHP)
// 4) Run rsa_verify, from http://www.edsko.net/misc/rsa.php
$unencoded_signature = rsa_verify(base64_decode($signature), binary_to_number($pk), binary_to_number($modulus), "512");

//Finally, does the $sha1 we calculated match the $unencoded_signature (less any padding bytes on the end)?
return ($sha1 == substr($unencoded_signature,-20)); // SHA1 is only 20 bytes, whilst signature is longer than this.  

Цель-c, которая генерирует этот открытый ключ:

NSData * data = [[SecKeyWrapper sharedWrapper] getPublicKeyBits];
[req addValue:[data base64Encoding] forHTTPHeaderField: @"X-Public-Key"];
data = [[SecKeyWrapper sharedWrapper] getSignatureBytes:[signatureData dataUsingEncoding:NSUTF8StringEncoding]];
[req addValue:[data base64Encoding] forHTTPHeaderField: @"X-Signature"];

Использование SecKeyWrapper из примера проекта Apple CryptoExercise (вы можете просмотреть файл здесь: https://developer.apple.com/iphone/library/samplecode/CryptoExercise/listing15.html )

Надеюсь, это поможет?

1
ответ дан 6 December 2019 в 04:41
поделиться

Поможет ли это вам?

Асимметричное шифрование ключа с .NET и C #

  • Извините за короткую публикацию, временные ограничения и все такое. В любом случае, видел ваш запрос о помощи в Твиттере ... это показывает, как я сделал это с помощью PHP и расшифровал на .NET, аналогично. Я заметил, что ваш класс дешифрования немного отличается от моего, поэтому эта статья может помочь.
0
ответ дан 6 December 2019 в 04:41
поделиться
Другие вопросы по тегам:

Похожие вопросы: