M
MeinerEiner
Gast
Hallöle,
versuche mich gerade an einer RSA Verschlüsselung in Java..
Problem dabei ist, wenn ich eine Nachricht verschlüssele und sie dann entschlüssele, ist sie auf einmal doppelt vorhanden.. Sieht so aus, als ob ich die originalnachricht wohl irgendwie mit sich selbst konkateniert habe, und dann verschlüsselt.. aber ich find einfach keinen fehler.....
Zur verdeutlichung mal der quelltext :
Habe erstmal ein Schlüsselpaar erstellt..
Als nächstes wird die Nachricht verschlüsselt.... Da bei RSA die blocklänge 245 byte betragen muss, wird die Nachricht auf verschiedene Bytearrays aufgeteilt in einen Vektor verpackt, und dann einzelen verschlüsselt :
So.. und das scheint auch gut zu klappen..
Als verschlüsselte Nachricht erhalte ich :
Ausgabe :
-ésIíÕ%ïº"E6ïmëNÓDûù`î[&¡K·³üïIUÒwÆúrÑ?þt7ÄÇÂ}m?J%sz?£útÁ°^\ZùRyÇÂ?¶-CVGº¡>fez5!?R"·¹Kñ?q?K!µ¾µ¢&??Gæú2¯#?Ð?×û¢?hTÈqÑ·Ê8ò[?B?þßé?<£/õ?MÛ }Ú6×v?É?¾ä0jÎ?X2o6ØänU?÷ýá,ê%!º`Àp{?õ9tÀùÎ>eI%åñåü»9éf'ÞØ¥Ò£÷«½?
nun wird das ganze wirde decheffriert.. die decodiermehtode ist ähnlich der encodiermethode;
Ausgabe:
und erhalte
" die nachricht zum verschlüsseln______________________________ die nachricht zum verschlüsseln __________________________________________ "
Die leerzeichen sind klar.. schliesslich war mein Bytebuffer grösser als die tatsächliche nachricht.. aber wieso erhalte ich sie auf einmal doppelt??
vielleicht kann mir ja jemand helfen?
*grüssle*
Jörg
versuche mich gerade an einer RSA Verschlüsselung in Java..
Problem dabei ist, wenn ich eine Nachricht verschlüssele und sie dann entschlüssele, ist sie auf einmal doppelt vorhanden.. Sieht so aus, als ob ich die originalnachricht wohl irgendwie mit sich selbst konkateniert habe, und dann verschlüsselt.. aber ich find einfach keinen fehler.....
Zur verdeutlichung mal der quelltext :
Habe erstmal ein Schlüsselpaar erstellt..
Code:
import java.nio.*;
import java.nio.charset.*;
import java.security.*;
import java.util.Vector;
import javax.crypto.*;
public class Security {
private KeyPair keyPair;
private Cipher cipher;
Charset charset;
private final int RSABlockSize = 245;
public Security(){
String nachricht = " die nachricht zum verschlüsseln";
ByteBuffer buffer = ByteBuffer.allocate(50);
ByteBuffer decrypt;
charset = Charset.forName( "ISO-8859-1" );
buffer.put(charset.encode(nachricht));
generateRSA();
decrypt = encodeWithRSA(buffer,keyPair.getPublic(),RSABlockSize);
buffer = decodeWithRSA(decrypt,keyPair.getPrivate(),RSABlockSize);
System.out.println(charset.decode(decrypt));
System.out.println(charset.decode(buffer));
}
boolean generateRSA(){
try {
KeyPairGenerator kpg = KeyPairGenerator.getInstance( "RSA" );
kpg.initialize(2048);
keyPair = kpg.genKeyPair();
//System.out.println(keyPair.getPrivate());
//System.out.println(keyPair.getPublic());
return true;
} catch (NoSuchAlgorithmException e) {return false;}
}
public static void main(String[] args) {
Security sec = new Security();
}
}
Als nächstes wird die Nachricht verschlüsselt.... Da bei RSA die blocklänge 245 byte betragen muss, wird die Nachricht auf verschiedene Bytearrays aufgeteilt in einen Vektor verpackt, und dann einzelen verschlüsselt :
Code:
//Hauptmethode zum Verschlüsseln
ByteBuffer encodeWithRSA(ByteBuffer bufferText, PublicKey pk,int blockSize){
int allocate=0;
byte[] byteArray = bufferText.array();
byteArray = bufferText.array();
Vector ByteArrays = returnByteArrays(byteArray,blockSize);
Vector tmpArrays = new Vector();
try {
int temp = ByteArrays.size();
for(int i=0; i < ByteArrays.size(); i++){
cipher = Cipher.getInstance("RSA");
cipher.init(Cipher.ENCRYPT_MODE, pk);
byte[] tmp = cipher.doFinal((byte[])(ByteArrays.get(i)));
allocate += tmp.length;
tmpArrays.add(tmp);
}
ByteBuffer outputText = ByteBuffer.allocate(allocate);
for(int i =0; i< tmpArrays.size();i++){
outputText.put((byte[])(tmpArrays.get(i)));
}
outputText.flip();
return outputText;
} catch (NoSuchAlgorithmException e) {
e.printStackTrace();
} catch (NoSuchPaddingException e) {
e.printStackTrace();
} catch (InvalidKeyException e) {
e.printStackTrace();
} catch (IllegalBlockSizeException e) {
e.printStackTrace();
} catch (BadPaddingException e) {
e.printStackTrace();
}
return null;
}
Code:
//Methode verpackt einzelnes ByteArray in mehrere, 245 Byte grosse, ByteArrays
Vector returnByteArrays(byte[] byteArray,int size){
Vector inputByteArrays = new Vector();
int tp = ((int)(byteArray.length/size));
for(int i = 0; i<=((int)(byteArray.length/size));i++){
if(!(byteArray.length-(size*i)>245)){
byte[] newArray = new byte[byteArray.length-(size*i)];
for(int j=0; j < byteArray.length-(size*i);j++){
newArray[j]=byteArray[size*i+j];
}
}
else{
byte[] newArray = new byte[size];
for(int j=0; j < size;j++){
newArray[j]=byteArray[size*i+j];
}
}
inputByteArrays.add(byteArray);
}
return inputByteArrays;
}
So.. und das scheint auch gut zu klappen..
Als verschlüsselte Nachricht erhalte ich :
Code:
ByteBuffer buffer = ByteBuffer.allocate(50);
charset = Charset.forName( "ISO-8859-1" );
ByteBuffer decrypt;
buffer.put(charset.encode(nachricht));
decrypt = encodeWithRSA(buffer,keyPair.getPublic(),RSABlockSize);
System.out.println(charset.decode(decrypt));
-ésIíÕ%ïº"E6ïmëNÓDûù`î[&¡K·³üïIUÒwÆúrÑ?þt7ÄÇÂ}m?J%sz?£útÁ°^\ZùRyÇÂ?¶-CVGº¡>fez5!?R"·¹Kñ?q?K!µ¾µ¢&??Gæú2¯#?Ð?×û¢?hTÈqÑ·Ê8ò[?B?þßé?<£/õ?MÛ }Ú6×v?É?¾ä0jÎ?X2o6ØänU?÷ýá,ê%!º`Àp{?õ9tÀùÎ>eI%åñåü»9éf'ÞØ¥Ò£÷«½?
nun wird das ganze wirde decheffriert.. die decodiermehtode ist ähnlich der encodiermethode;
Code:
ByteBuffer decodeWithRSA(ByteBuffer bufferText, PrivateKey pk,int blockSize){
int allocate=0;
byte[] byteArray = bufferText.array();
byteArray = bufferText.array();
Vector ByteArrays = returnByteArrays(byteArray,blockSize);
Vector tmpArrays = new Vector();
try {
int temp = ByteArrays.size();
for(int i=0; i < ByteArrays.size(); i++){
cipher = Cipher.getInstance("RSA");
cipher.init(Cipher.DECRYPT_MODE, pk);
byte[] tmp = cipher.doFinal((byte[])(ByteArrays.get(i)));
allocate += tmp.length;
tmpArrays.add(tmp);
}
ByteBuffer outputText = ByteBuffer.allocate(allocate);
for(int i =0; i< tmpArrays.size();i++){
outputText.put((byte[])(tmpArrays.get(i)));
}
outputText.flip();
return outputText;
} catch (NoSuchAlgorithmException e) {
e.printStackTrace();
} catch (NoSuchPaddingException e) {
e.printStackTrace();
} catch (InvalidKeyException e) {
e.printStackTrace();
} catch (IllegalBlockSizeException e) {
e.printStackTrace();
} catch (BadPaddingException e) {
e.printStackTrace();
}
return null;
}
Code:
buffer = decodeWithRSA(decrypt,keyPair.getPrivate(),RSABlockSize);
System.out.println(charset.decode(buffer));
" die nachricht zum verschlüsseln______________________________ die nachricht zum verschlüsseln __________________________________________ "
Die leerzeichen sind klar.. schliesslich war mein Bytebuffer grösser als die tatsächliche nachricht.. aber wieso erhalte ich sie auf einmal doppelt??
vielleicht kann mir ja jemand helfen?
*grüssle*
Jörg