M
MeinerEiner_80
Hi zusammen,
ich grübel jetzt schon seit Tagen an einem Problem mit der RSA Verschlüsselung.
Im Netz gibt es zwar genug beispiele dazu.. allerdings reichen diese nicht für meine zwecke..
Ich hab hier eine Schlüsselgroesse von 2048 Bytes gewählt.. das heißt die blockgroesse kann maximal 256 Bytes betragen....
Mein problem an der sache ist nun, die texte die ich verschlüsseln muss, sind groesser als 256 bytes..
eigentlich kein problem, wenn man die nachricht in 256 byte päckchen aufteilt..
nur irgendwie klappt das nicht bei mir..
hier in meinem beispiel wird die nachricht in 2 päckchen aufgeteilt.. 256 und 245 bytes..
wenn ich die nachricht verschlüssele und dann wieder entschlüssele wird nur das erste päckchen korrekt entschlüsselt.. im kleineren steht müll drin...
zu debugzwecken hatte ich in der verschlüsselungsmethode den verschlüsselten text gleich wieder entschlüsselt.. und das hat wunderbar gekappt.. das müsste ja bedeuten, der fehler liegt in der entschlüsselungsmethode..
das was ich entdeckt habe ist, das wenn 245 bytes verschlüsselt werden, das verschlüsselte päckchen 256 bytes gross ist.. und wenn es wieder entschlüsselt wird, es ebenso 256 bytes gross ist.. das ist ein fehler.. aber wie er zustande kommt.. ist mir ein rätsel..
vorallem daher, weil wenn ich eine EINZELNE nachricht < 256 bytes verschlüsseln lassen, d.h. insgesamt nur ein päckchen habe.. klappt das merkwürdigerweise wunderbar...
Das ganze wirkt für mich eher, als würde ich auf ein falsches array element zugreifen..
wahrscheinlich seh ich einfach den wald vor lauter bäumen net mehr, da ich ja schon so lang da dranhock..
vielleicht kann mir jemand von euch weiterhelfen?
ich grübel jetzt schon seit Tagen an einem Problem mit der RSA Verschlüsselung.
Im Netz gibt es zwar genug beispiele dazu.. allerdings reichen diese nicht für meine zwecke..
Ich hab hier eine Schlüsselgroesse von 2048 Bytes gewählt.. das heißt die blockgroesse kann maximal 256 Bytes betragen....
Mein problem an der sache ist nun, die texte die ich verschlüsseln muss, sind groesser als 256 bytes..
eigentlich kein problem, wenn man die nachricht in 256 byte päckchen aufteilt..
nur irgendwie klappt das nicht bei mir..
hier in meinem beispiel wird die nachricht in 2 päckchen aufgeteilt.. 256 und 245 bytes..
wenn ich die nachricht verschlüssele und dann wieder entschlüssele wird nur das erste päckchen korrekt entschlüsselt.. im kleineren steht müll drin...
zu debugzwecken hatte ich in der verschlüsselungsmethode den verschlüsselten text gleich wieder entschlüsselt.. und das hat wunderbar gekappt.. das müsste ja bedeuten, der fehler liegt in der entschlüsselungsmethode..
das was ich entdeckt habe ist, das wenn 245 bytes verschlüsselt werden, das verschlüsselte päckchen 256 bytes gross ist.. und wenn es wieder entschlüsselt wird, es ebenso 256 bytes gross ist.. das ist ein fehler.. aber wie er zustande kommt.. ist mir ein rätsel..
vorallem daher, weil wenn ich eine EINZELNE nachricht < 256 bytes verschlüsseln lassen, d.h. insgesamt nur ein päckchen habe.. klappt das merkwürdigerweise wunderbar...
Das ganze wirkt für mich eher, als würde ich auf ein falsches array element zugreifen..
wahrscheinlich seh ich einfach den wald vor lauter bäumen net mehr, da ich ja schon so lang da dranhock..
vielleicht kann mir jemand von euch weiterhelfen?
Code:
class Security {
private KeyPair keyPair;
private RSAPublicKey publicKey;
private RSAPrivateKey privateKey;
private final int RSAKeySize = 2048;
private final int RSABlockSize = 256;
public Security(){
String text = "hallo.. würde das gerne mal verschlüsseln .. bin gespannt ob das klappt.. soo nun reichts.. text ist gross genug";
text =text+text+text;
byte[] buffer = text.getBytes();
byte[] encrypt;
byte[] decrypt;
generateRSA();
System.out.println(new String(buffer));
System.out.println("----------------------------------");
encrypt = encodeWithRSA(buffer,publicKey,RSABlockSize);
decrypt = decodeWithRSA(encrypt,privateKey,RSABlockSize);
System.out.println("----------------------------------");
System.out.println(new String(decrypt));
}
byte[] encodeWithRSA(byte[] text,RSAPublicKey key, int blockSize){
int len;
if(text.length%blockSize==0){
len = (text.length/blockSize);
}
else{
len = (text.length/blockSize) +1;
}
byte [][]byteArrays = new byte[len][];
int remain = text.length-blockSize;
int counter =0;
int counter2 =0;
while(remain >=0){
byte[] buffer = new byte[blockSize];
for(int i=0; i< blockSize; i++){
buffer[i] = text[counter];
counter++;
}
byteArrays[counter2]= buffer;
counter2++;
remain = text.length-blockSize-counter;
}
if(remain!=0){
remain = blockSize+remain;
byte[] buffer = new byte[remain];
for(int i=0; i< remain; i++){
buffer[i] = text[counter];
counter++;
}
byteArrays[counter2]= buffer;
}
BigInteger cipherText;
BigInteger message;
for(int i =0; i< len;i++){
message = new BigInteger(byteArrays[i]);
cipherText= message.modPow(key.getPublicExponent(),key.getModulus());
byteArrays[i] = cipherText.toByteArray();
}
byte[] buffer = new byte[len*blockSize];
counter =0;
for(int i=0; i<byteArrays.length;i++){
for(int j=0; j < byteArrays[i].length;j++){
buffer[counter] = byteArrays[i][j];
counter++;
}
}
return buffer;
}
byte[] decodeWithRSA(byte[] text,RSAPrivateKey key,int blockSize){
int len = (text.length/blockSize);
byte [][]byteArrays = new byte[len][];
int counter =0;
byte[] buffer;
for(int j=0; j < len;j++){
buffer = new byte[blockSize];
for(int i=0; i< blockSize; i++){
buffer[i] = text[j*len+i];
}
byteArrays[j]= buffer;
}
BigInteger cipherText;
BigInteger message;
counter =0;
for(int i =0; i< byteArrays.length;i++){
message = new BigInteger(byteArrays[i]);
cipherText= message.modPow(key.getPrivateExponent(),key.getModulus());
byteArrays[i] = cipherText.toByteArray();
counter+=byteArrays[i].length;
}
buffer = new byte[counter];
int counter2 =0;
for(int i=0; i<byteArrays.length;i++){
for(int j=0; j < byteArrays[i].length;j++){
buffer[counter2] = byteArrays[i][j];
counter2++;
}
}
return buffer;
}