Подписание AS3Crypto RSA

У меня возникли проблемы с сопоставлением значения, возвращаемого RSA, подписывающего хэш Base64 SHA1 в библиотеке actionscript as3crypto, с результатом, возвращаемым в С#.

Я передаю хэш Base64, декодированный как массив байтов, в функцию sign(), предоставленную в as3crypto и base64, кодирующую результат. Однако этот результат никогда не совпадает с возвращаемым результатом функции C#, выполняющей ту же задачу. Имеет ли значение, что функция принимает и возвращает шестнадцатеричный код, даже если она работает на уровне массива байтов?

Пожалуйста, посмотрите мою функцию подписи ниже, чтобы убедиться, что я ничего не пропустил!

private function signHash(hashInBase64:String):String
{
       var src:ByteArray = Base64.decodeToByteArray(hashInBase64);
       var key:RSAKey = getRSAKey();
       var dst:ByteArray = new ByteArray();

       key.sign(src, dst, src.length);

       return Base64.encodeByteArray(dst);
}

Кто-нибудь имел большой опыт работы с библиотекой AS3Crypto?

Любая помощь будет здорово!!!

Спасибо,

Джон


person Jon    schedule 28.09.2009    source источник
comment
Имеет ли значение, что функция принимает и возвращает шестнадцатеричный код, даже если она работает на уровне массива байтов? ... вы имели в виду, что он принимает бас 64, или вы действительно имели в виду, что он принимает шестнадцатеричный код ... может быть, проблема в этом? base 64 и hex значительно отличаются ... любое шестнадцатеричное значение является почти допустимым значением base64 (за исключением того, что base 64 всегда дополняется до длины, кратной 4), поэтому декодер, вероятно, примет его ...   -  person back2dos    schedule 29.09.2009
comment
Кроме того, что вы получаете, когда проверяете подпись? это работает?   -  person back2dos    schedule 29.09.2009
comment
Алгоритм подписи принимает массив байтов, но все примеры представляют собой шестнадцатеричный массив байтов, поэтому я конвертирую base64 в массив байтов, будут ли они преобразованы в одни и те же байты? проверка тоже не работает, беда с этой библиотекой в ​​том, что нет документации.   -  person Jon    schedule 29.09.2009


Ответы (2)


Я предполагаю, что ваша версия C# использует RSA PKCS #1 версии 1.5. . Стандарт вычисляет подписи, выполняя операцию с закрытым ключом RSA над строкой байтов, составленной как

0x00 0x01 || 0xff* || 0x00 || OID || hash

Глядя на код as3crypto, видно, что класс RSAKey не добавляет никакого OID во время операции подписания. Следовательно, если вы этого не сделаете, вы получите неправильные результаты.

Анализ кода также показывает, что as3crypto уязвим для этой атаки, потому что он не проверяет заполнение должным образом. Этой атаке более 3 лет. Следовательно, лучше использовать другую библиотеку, чем as3crypto.

person Accipitridae    schedule 29.09.2009
comment
К сожалению, другой библиотеки нет, но спасибо за информацию! - person Jon; 29.09.2009

Теперь есть криптобиблиотека ActionScript, совместимая с .NET. Вот он: http://code.google.com/p/flame. Похоже, он поддерживает RSA точно так же, как .NET.

person wilkexx    schedule 06.02.2012