2013-06-22 3 views
1

Я пытаюсь сделать 2 сообщения, чтобы поговорить друг с другом с помощью RSA. Первый - в C++, а второй - в java. Сначала нужно отправить открытый ключ в java-приложение. Я используюJava и C++ (VS) RSA-шифрование

CryptExportKey(m_hCryptKey, NULL, PUBLICKEYBLOB, 0, pbKeyBlob, &dwBlobLen); 

функция для этого. В приложении Java я пытаюсь импортировать его с помощью этой функции:

public PublicKey getPublicKeyFromBytes(byte[] keyBytes) throws NoSuchAlgorithmException, InvalidKeySpecException { 
    KeyFactory keyFactory; 
    keyFactory = KeyFactory.getInstance("RSA"); 
    X509EncodedKeySpec pubKeySpec = new X509EncodedKeySpec(keyBytes); 
    return keyFactory.generatePublic(pubKeySpec); 
} 

Он бросает InvalidKeySpecException. Не могли бы вы рассказать мне, как мне импортировать/экспортировать ключи?

+0

Очевидно, что сторона C++ не отправляет только сырые ключевые байты, но почему вы не используете SSL? – EJP

+2

CryptExportKey возвращает данные в нестандартном, проприетарном формате Microsoft. –

+0

@GregS Возможно, за это время [Microsoft проделала движение по указанию структуры] (http://msdn.microsoft.com/en-us/library/windows/desktop/aa375601%28v=vs.85% 29.aspx), поэтому он должен быть относительно простым для синтаксического анализа (использование ByteBuffer было бы хорошей идеей, так как все, похоже, использует кодировку little-endian). –

ответ

1

Вам нужно будет написать декодер для структуры открытого ключа Microsoft RSA. К счастью, that structure is well defined. Обратите внимание, что он использует кодировку little-endian, поэтому вы можете сначала обернуть структуру в ByteBuffersetting the order в little-endian.

Затем вы должны преобразовать общественные компоненты экспоненты и модуля в BigInteger с использованием BigInteger.valueOf(1, bigEndianByteArray). Trick должен получить байты в bigEndianByteArray в правильном порядке после прочтения их с ByteBuffer.

+0

Что-то не так с моим ответом, черным? Вам удалось импортировать структуру на Java. Пожалуйста, обратите внимание на свои вопросы! –