2016-03-27 8 views
0

Ich möchte ein RSA-Schlüsselpaar erstellen und es für die Codierung/Decodierung von Daten verwenden. Mein Code ist ziemlich kurz, aber ich kann keinen Fehler finden.Direkte Codierung/Decodierung führt nicht zu Originaldaten

Kann mir jemand helfen, mein Problem zu finden?

Danke für jeden Hinweis!

// Generate key pair. 
KeyPairGenerator kpg = KeyPairGenerator.getInstance("RSA"); 
kpg.initialize(1024, new SecureRandom()); 
KeyPair keyPair = kpg.genKeyPair(); 
PublicKey publicKey = keyPair.getPublic(); 
PrivateKey privateKey = keyPair.getPrivate(); 

// Data to encode/decode. 
byte[] original = "The quick brown fox jumps over the lazy dog.".getBytes("UTF8"); 

// Encode data with public key. 
Cipher cipherEncoder = Cipher.getInstance("RSA/ECB/NoPadding"); 
cipherEncoder.init(Cipher.ENCRYPT_MODE, publicKey); 
byte[] encodedData = cipherEncoder.doFinal(original); 

// Decode data with private key. 
Cipher cipherDecoder = Cipher.getInstance("RSA/ECB/NoPadding"); 
cipherDecoder.init(Cipher.DECRYPT_MODE, privateKey); 
byte[] decodedData = cipherEncoder.doFinal(encodedData); 

// Output. 
System.out.println(new String("Original data: " + new String(original, "UTF8"))); 
System.out.println(new String("Encoded/decoded: " + new String(decodedData, "UTF8"))); 

Die Ausgabe am Ende scheint eigenartig zu sein.

+1

Zeigen Sie die Ausgänge ... – fge

+1

Lehrbuch RSA (ohne Padding) ist wirklich unsicher. PKCS # 1 v1.5 padding (11 Byte Overhead) sollte ebenfalls nicht verwendet werden. Heutzutage wird OAEP empfohlen (42 Byte Overhead für SHA1). –

+0

@ ArtjomB. Danke für diesen Hinweis! Hast du ein OAEP Code Beispiel für mich? – Christian

Antwort

2

Zuerst verwenden Sie die cipherEncoder, um Ihre Daten zu dekodieren. Sie wollten wahrscheinlich cipherDecoder verwenden. Zweitens haben Sie Probleme mit RSA ohne Auffüllen (Ihre Daten werden am Anfang eine Last von 0 Bytes haben). Ich würde empfehlen, dass Sie mindestens PKCS1 Padding verwenden. Hier ist der Code nach diesen Änderungen.

// Generate key pair. 
KeyPairGenerator kpg = KeyPairGenerator.getInstance("RSA"); 
kpg.initialize(1024, new SecureRandom()); 
KeyPair keyPair = kpg.genKeyPair(); 
PublicKey publicKey = keyPair.getPublic(); 
PrivateKey privateKey = keyPair.getPrivate(); 

// Data to encode/decode. 
byte[] original = "The quick brown fox jumps over the lazy dog.".getBytes("UTF8"); 

// Encode data with public key. 
Cipher cipherEncoder = Cipher.getInstance("RSA/ECB/PKCS1Padding"); 
cipherEncoder.init(Cipher.ENCRYPT_MODE, publicKey); 
byte[] encodedData = cipherEncoder.doFinal(original); 

// Decode data with private key. 
Cipher cipherDecoder = Cipher.getInstance("RSA/ECB/PKCS1Padding"); 
cipherDecoder.init(Cipher.DECRYPT_MODE, privateKey); 
byte[] decodedData = cipherDecoder.doFinal(encodedData); 

// Output. 
System.out.println(new String("Original data: " + new String(original, "UTF8"))); 
System.out.println(new String("Encoded/decoded: " + new String(decodedData, "UTF8"))); 
+0

Vielen Dank für Ihre Antwort und die Suche nach meinem Fehler. Gute Arbeit! – Christian