2015-03-06 2 views
-3

У меня есть следующий открытый ключ, сгенерированный из Java, как RSA:Java для Win32 Crypto API

305c300d06092a864886f70d0101010500034b003048024100ab12b3ee64b85bdda7e9744df3210d9b0efc7fbd36385cd903a4f8ee51101bc9c4f0b23583ff090e7d61773e024cbbff4008037cba6538d1c70d865c948716e70203010001 

Я пытаюсь импортировать ключ в следующем:

1) Декодирование строки байт массив (Ключ)

public static byte[] DecodeKey(string data) 
{ 
    int count = data.Length; 
    byte[] key = new byte[count/2]; 
    for (int i = 0; i < count ; i += 2) 
     key[i/2] = Convert.ToByte(data.Substring(i, 2), 16); 
    return key; 
} 

2) CryptAcquireContext использованием Microsoft Strong Cryptographic Provider и PROV_RSA_FULL.
3) Затем позвоните по телефону CryptImportKey с помощью вышеуказанного ключа и key.Length.

возвращает:

Bad версии провайдера.

+0

Если это Java, почему вы отметили C#, C++ * и * C?!? – Borgleader

+0

Он создан на Java и хочет импортировать его на C или C#. – user2179256

+0

Внесите свою собственную версию RSA в Java и C#, ее не так сложно –

ответ

1

Ваш ключ RSA в формате SubjectPublicKeyInfo, который является то, что возвращает Java при использовании метода RSAPublicKey.getEncoded(). Java вызывает этот формат X509EncodeKeySpec по историческим причинам.

Это неудобный формат для .NET. Вы можете изучить классы .NET, чтобы узнать, какие форматы наиболее удобны. Я подозреваю, что наиболее удобный формат - это формат XML. Следующий Java сниппет будет выводить открытый ключ RSA в следующем формате:

import java.security.KeyPair; 
import java.security.KeyPairGenerator; 
import java.security.interfaces.RSAPublicKey; 
import javax.xml.bind.DatatypeConverter; 

public class RSAToXML { 

    public static void main(String[] args) throws Exception { 
     KeyPairGenerator kpg = KeyPairGenerator.getInstance("RSA"); 
     kpg.initialize(1024); 
     KeyPair keyPair = kpg.generateKeyPair(); 
     RSAPublicKey rsaPub = (RSAPublicKey) keyPair.getPublic(); 
     System.out.println("<RSAKeyValue>"); 
     System.out.print("\t<Modulus>"); 
     System.out.print(DatatypeConverter.printBase64Binary(rsaPub.getModulus().toByteArray())); 
     System.out.println("</Modulus>"); 
     System.out.print("\t<Exponent>"); 
     System.out.print(DatatypeConverter.printBase64Binary(rsaPub.getPublicExponent().toByteArray())); 
     System.out.println("</Exponent>"); 
     System.out.println("</RSAKeyValue>"); 
    } 
} 

Этот выход может быть использован для импорта открытого ключа RSA в .NET, как в следующих C# фрагмент кода:

public static void XmlImport() 
    { 
     var xmlPubKey = "<RSAKeyValue>\n\t<Modulus>AI0hSZ3hcfJHv1TPSIkT0XeW/HMPPFJMw4/aX5NxfhyVacpb5u6rucDztVNG1pXaBdya9OdO1+mGG250y+QuqP/70uu5QMcMEpCdp8xl0i+cUN9+fHDzse4XR/Kdrl3pKAefSR5QQX8xBScjTO+H+9fXVrrU9TQU6WXmahQnDwDJ</Modulus>\n\t<Exponent>AQAB</Exponent>\n</RSAKeyValue>\n"; 
     var rsa = RSA.Create(); 
     rsa.FromXmlString(xmlPubKey); 
     Console.WriteLine(rsa.ToXmlString(false)); 
    } 

Примечание. Это использует классы .NET, а не Win32 CryptoAPI. Практически нет оснований продолжать использовать CryptoAPI.