2016-12-14 4 views
-1

Я пытаюсь обновить размер пары ключей RSA с 1024 до 2048. Я собираюсь привести здесь пример кода.Извлечь параметры RSA (модуль и экспоненту) из закодированной строки (открытый ключ RSA)

Для 1024: Первый шаг в моем коде является создание подписи с помощью кода Java

try { 
     // Generate Public & Private Keys 
     KeyPairGenerator kpg = KeyPairGenerator.getInstance("RSA"); 
     kpg.initialize(1024); 
     KeyPair keyPair = kpg.genKeyPair(); 

     RSAPublicKey key = (RSAPublicKey) keyPair.getPublic(); 
     System.out.println("Modulus"); 
     System.out.println(key.getModulus()); 


     String publicKey = encode(key.getModulus().toByteArray()) + encode(key.getPublicExponent().toByteArray()); 


     // Build the Signature 
     Signature sig = Signature.getInstance("SHA256withRSA"); 
     sig.initSign(keyPair.getPrivate()); 
     seedData = seedData + "ABC"; 

     sig.update(seedData.getBytes("UTF-8")); 
     String signature = encode(sig.sign()); 

     signatureString.append(signature); 
     // Embed the public key in the signature 
     int publicKeyLocation = signatureString.charAt(signatureString.length() - 2) % 40; 
     // Add some random bytes at the end 
     int randomBytesToAdd = signatureString.charAt(signatureString.length() - 10) % 9; 
     System.out.println("Random bytes to add"); 
     System.out.println(randomBytesToAdd); 
     System.out.println("Adding Random bytes that are:"); 
     String s = randomString(randomBytesToAdd); 
     signatureString.insert(publicKeyLocation, s); 
    } catch (Exception e) { 

    } 

    return signatureString.toString(); 
} 

Теперь этот закодированный строку в передается приложению .NET Где в приложении .NET я использовал, чтобы получить открытый ключ и подпись

protected RSAParameters GetPublicKey(string encodedString) 
    { 
     int bytesToSkip = encodedString.Substring((encodedString.Length - 10), 1).ToCharArray()[0] % 9; 
     int publicKeyStarts = bytesToSkip + encodedString.Substring((encodedString.Length - 2), 1).ToCharArray()[0] % 40; 
     string keyString = encodedString.Substring(publicKeyStarts, 176); 
     string modulusString = keyString.Substring(0, 172); 
     string exponentString = keyString.Substring(172); 
     RSAParameters publicKey = new RSAParameters(); 
     publicKey.Modulus = new byte[128]; 
     Array.Copy(System.Convert.FromBase64String(modulusString), 1, publicKey.Modulus, 0, 128); 
     publicKey.Exponent = System.Convert.FromBase64String(exponentString); 
     return publicKey; 
    } 

    protected byte[] GetSignature(string encodedString) 
    { 
     int bytesToSkip = encodedString.Substring((encodedString.Length - 10), 1).ToCharArray()[0] % 9; 
     int publicKeyStarts = bytesToSkip + encodedString.Substring((encodedString.Length - 2), 1).ToCharArray()[0] % 40; 
     String digSig = encodedString.Substring(0, publicKeyStarts - bytesToSkip) + encodedString.Substring(publicKeyStarts + 176); 
     return System.Convert.FromBase64String(digSig); 
    } 

Если изменить размер ключа пары из 1024 2048, какие изменения мне нужно сделать в моем коде .NET

Ответ Я ищу это: от сгенерированного открытого ключа RSA, как я могу получить длину Modulus и экспонент

+0

Что вы пробовали? Какие результаты у вас есть, что неверно? Какая строка кода кажется проблемой? Вы понимаете, как и почему работает ваш существующий код? (это работает?) Является ли это настоящим примером или это домашнее задание? – PhillipH

ответ

0

I нашел ответ, чтобы получить размер или длину модуля и экспонентов из открытого ключа

кода RSA для генерации открытого ключа

KeyPairGenerator kpg = KeyPairGenerator.getInstance("RSA"); 
     kpg.initialize(2048); 
     KeyPair keyPair = kpg.genKeyPair(); 

     RSAPublicKey key = (RSAPublicKey) keyPair.getPublic(); 
     String publicKey = encode(key.getModulus().toByteArray()) + encode(key.getPublicExponent().toByteArray()); 
     int modLength = key.getModulus().toByteArray().length; 
     int exponentLength = key.getPublicExponent().toByteArray().length;