Hex-Key zu RSA Pulic Key

Status
Nicht offen für weitere Antworten.
D

dringend

Gast
Hi,
Ich habe da eine Problem. Ich habe einen Public Modulus als Hex-String und den Expont auch als Hex-String. Jetzt ist mein Problem diese Strings als PublicKey zu hinterlegen (Bouncy Castle). Ich will also diesen Public Key importieren und keinen generieren um einen Signature zu überprüfen. Das Padding ist PKCS1.

Für eine schnelle Hilfe wäre ich dankbar. Es eilt wirklich.
Der Modulus sieht etwa so aus:
99057e95e6527af70ab3d80f9aaaa0b556e0a7059642ed08c567af59d4e9ddf97389fb2e8b16ed3a7d4e38c96bf708f36747d0a836c8b26490bb1aa12be202f004b631f5e5923a8b86a0bd6539ff7c221cede1a22b1a4343e78f555c77fb6e6b2a28430c6a7b790931f950e219302e4d69fd254a69e6be0125ecedeffc4b9d15f90cfdb9b7f7e914365683339a3bfef1bd213d51f13bce48a9b216fe7badc7c9acc9828fbcb6a731b983f9eb7206db07694988c51341c95a6f1e5f2b3c080616fb65eee3b5943ee7ad20598767c33b71009673bd5c13c1b7cd411485c65b8a8e4a8bfb7803362c6e0dc4601c5e7591b9947e4ec3992e918be0b8750c55ed20bf

Der Exponent sieht so aus:
10001

Hoffe jemand von euch weiß wie man áus diesen beiden Strings einen Public Key machen. Vielen Dank im Voraus.
 

SnooP

Top Contributor
ein paar Punkte in dem Teil wären schön gewesen... dann wär's nich so lang geworden ;)

guck dir mal die Klasse RSAPublicKeySpec an... diese specs brauchst du für die KeyFactory. Diese benötigen Exponent und Modul als BigIntegers.. diese kann man mit Strings füttern... und natürlich kann man auch gleichzeitig eine Wurzel angeben, also 16 bei hexa also z.B. für den Exponent: new BigInteger("10001", 16);

Edit: ich hab jetzt übrigens implizit angenommen, du benutzt nen RSA wegen Exponent und Modul... solltest du einen anderen mir nicht bekannten Algorithmus nutzen wollen, dann musst du entsprechend gucken ;) - bei BouncyCastle heißt die Klasse auch anders, das hatte ich überlesen, dort heißts wohl RSAPublicBCPGKey mit den entsprechenden BigIntegers...
 
G

Guest

Gast
Den Code dafür habe ich geschrieben:
Code:
 /**
 * @return The Public Key Object.
 * @param  modulus The modulus public key.
 * @param  exponent The exponent public key.
 * @throws NoSuchAlgorithmException
 * @throws NoSuchProviderException
 * @throws InvalidKeySpecException
 */
public static PublicKey getPubKey(String modulus, String exponent) throws NoSuchAlgorithmException, NoSuchProviderException, InvalidKeySpecException
{
	KeyFactory keyFactory;
	keyFactory = KeyFactory.getInstance("RSA", "BC");
	
	RSAPublicKeySpec pubKeySpec = new RSAPublicKeySpec(
              new BigInteger(modulus,16),
              new BigInteger(exponent,16));
	
    RSAPublicKey pubKeyr = (RSAPublicKey)keyFactory.generatePublic(pubKeySpec);    
    return pubKeyr;
}

Aber sobald ich diesen Key benutze bekomme ich beim decrypten diese Exception
Code:
Exception in thread "main" javax.crypto.BadPaddingException: unknown block type
	at org.bouncycastle.jce.provider.JCERSACipher.engineDoFinal(Unknown Source)
	at javax.crypto.Cipher.doFinal(DashoA12275)

Was mache ich da falsch
 

SnooP

Top Contributor
hast du das padding auch richtig eingestellt?

Cipher rsaCipher = Cipher.getInstance("RSA/NONE/PKCS1Padding", "BC");

und siehe oben - ich hatte das mit dem bc überlesen... dort gibt es andere Key-Klassen die sich evtl. unterscheiden...
 
G

Guest

Gast
Das Padding sollte stimmen:
Code:
 Cipher	cipher = Cipher.getInstance("RSA/NONE/PKCS1PADDING", "BC");

 cipher.init(Cipher.DECRYPT_MODE,  pubKey);
        cipher.update(sigBytes);
        byte[]  decSig = cipher.doFinal();

Aber wo liegt da der Fehler??
Oder kennt jemand ne Möglichkeit die Signature ohne Kryptoprovider mit dem PublicKey zurück auf den Hash zu rechnen. Hatte da mal was probiert.

Code:
static void test()
{
    System.out.println("Berechnung gestartet");
   //Lösungsidee nach de.wikipedia.org/wiki/rsa-Kryptosystem 
   //Kn = Cn^d mod N   für n=1,2,3(,...) 
   //K1 = 001715^1373 mod 263713 
  //K1 = 230911 

     int exp=65537;
		
    BigInteger zahl = new BigInteger(signaturAlsString,16);
    BigInteger modulo = new BigInteger(publicModulusAlsString,16); 
		    BigInteger temp; 
		    BigInteger lsg; 
		    
		    
		    temp = zahl.pow(exp);         //Exponentialrechnung 
		    System.out.println("Zahl wurde potenziert: " + temp.toString());
		    System.out.println("Modulo von" + temp + "Berechnung gestartet...");
		    lsg = temp.remainder(modulo); //Rest Ermittel 
		    System.out.println(lsg);
		    System.out.println("Berechnung beendet");
		
	}
Aber irgendwie fünktioniert das nicht????????????????
 
Status
Nicht offen für weitere Antworten.

Neue Themen


Oben