Smartie
17.08.2005, 16:49
Hey Leute,
ich hab eine Klasse, die mir einen Schlüsselpaar erstellt, und dieses wird erstmal in Name.priv/pub gespeichert. Danach hole ich es da raus, base64-encodiere es, entferne die newlines und speichere es in einer anderen datei. Wenn ich allerdings jetzt die newlines wieder einfuege, und es base64-decodiere, hab ich nicht die gleiche Bytekette, wie vorher. :(
Weiss einer, was an meinen convert_sig_byte und/oder convert_sig_String Methoden falsch ist?
convert_sig_byte codiert das byte array in einen base64 string und entfernt mittels PatternMatching alle \n.
und convert_sig_String macht das gleiche genau umgekehrt.
package de.freakbu.tool;
import java.io.*;
import java.security.*;
import java.security.spec.*;
import sun.misc.*;
public class sigtool {
public static void generate(String filename) {
try {
KeyPairGenerator keyGen = KeyPairGenerator
.getInstance("DSA", "SUN");
SecureRandom random = SecureRandom.getInstance("SHA1PRNG", "SUN");
keyGen.initialize(1024, random);
byte seed[] = random.generateSeed(20);
random.setSeed(seed);
KeyPair pair = keyGen.generateKeyPair();
PrivateKey priv = pair.getPrivate();
PublicKey pub = pair.getPublic();
byte[] pubKey = pub.getEncoded();
FileOutputStream keyfos = new FileOutputStream(filename + ".pub");
keyfos.write(pubKey);
keyfos.close();
byte[] privKey = priv.getEncoded();
FileOutputStream keyfos2 = new FileOutputStream(filename + ".priv");
keyfos2.write(privKey);
keyfos2.close();
} catch (Exception e) {
System.err.println("Exception: " + e.toString());
System.exit(1);
}
}
public static boolean verify_msg(String txt, String pubkey, byte signature[]) {
boolean wahr = false;
try {
byte[] encKey = convert_sig_byte(pubkey);
X509EncodedKeySpec pubKeySpec = new X509EncodedKeySpec(encKey);
KeyFactory keyFactory = KeyFactory.getInstance("DSA", "SUN");
PublicKey myPubKey = keyFactory.generatePublic(pubKeySpec);
Signature sigDecoded = Signature.getInstance("SHA1withDSA", "SUN");
sigDecoded.initVerify(myPubKey);
String sigToCompare = txt;
sigDecoded.update(sigToCompare.getBytes());
boolean ver = sigDecoded.verify(signature);
wahr = ver;
} catch (SignatureException g) {
System.err.println("Exception: " + g.toString());
System.exit(1);
} catch (InvalidKeyException f) {
System.err.println("Exception: " + f.toString());
System.exit(1);
} catch (NoSuchProviderException e) {
System.err.println("Exception: " + e.toString());
System.exit(1);
} catch (InvalidKeySpecException d) {
System.err.println("Exception: " + d.toString());
System.exit(1);
} catch (NoSuchAlgorithmException c) {
System.err.println("Exception: " + c.toString());
System.exit(1);
}
return wahr;
}
public static byte[] create_msg_sig(String message, String privkey) {
byte signature[] = null;
try {
byte[] encKey = convert_sig_byte(privkey);
PKCS8EncodedKeySpec privKeySpec = new PKCS8EncodedKeySpec(encKey);
KeyFactory keyFactory = KeyFactory.getInstance("DSA");
PrivateKey myPrivKey = keyFactory.generatePrivate(privKeySpec);
Signature sig = Signature.getInstance("SHA1withDSA", "SUN");
sig.initSign(myPrivKey);
String sigString = message;
sig.update(sigString.getBytes());
signature = sig.sign();
} catch (SignatureException g) {
System.err.println("Exception: " + g.toString());
System.exit(1);
} catch (InvalidKeyException f) {
System.err.println("Exception: " + f.toString());
System.exit(1);
} catch (NoSuchProviderException e) {
System.err.println("Exception: " + e.toString());
System.exit(1);
} catch (InvalidKeySpecException d) {
System.err.println("Exception: " + d.toString());
System.exit(1);
} catch (NoSuchAlgorithmException c) {
System.err.println("Exception: " + c.toString());
System.exit(1);
}
return signature;
}
public static byte[] convert_sig_byte(String text) {
byte foo[] = null;
try {
String g = insertnewlines(text);
foo = new BASE64Decoder().decodeBuffer(text);
} catch (IOException a) {
System.err.println("error:" + a.toString());
System.exit(1);
}
return foo;
}
public static String convert_sig_String(byte text[]) {
String foo = null;
foo = new BASE64Encoder().encode(text);
Pattern p = Pattern.compile("\n");
Matcher m = p.matcher(foo);
String mungedString = m.replaceAll("");
return mungedString;
}
public static String insertnewlines(String text) {
String foo = null;
int ll = 76;
int newcounter = 0, zeichen = 0, mal = 0;
zeichen = text.length() - (text.length() % ll);
mal = (zeichen / ll);
zeichen = text.length() + mal;
char neuertext[] = new char[zeichen];
char altertext[] = text.toCharArray();
neuertext[0] = altertext[0];
for(int i = 1; i < text.length(); i++) {
if( (i % (ll-1)) == 0 ) {
neuertext[newcounter] = '\n';
newcounter++;
}
neuertext[newcounter] = altertext[i];
newcounter++;
}
foo = neuertext.toString();
return foo;
}
}
Da sowas durchaus interessant ist, hab ich mal noch create_msg und verify_msg dabei gelassen. fuer mein problem sind allerdings nur die convert* methoden relevant.
Ich hoff mal mir kann einer helfen :(
ich hab eine Klasse, die mir einen Schlüsselpaar erstellt, und dieses wird erstmal in Name.priv/pub gespeichert. Danach hole ich es da raus, base64-encodiere es, entferne die newlines und speichere es in einer anderen datei. Wenn ich allerdings jetzt die newlines wieder einfuege, und es base64-decodiere, hab ich nicht die gleiche Bytekette, wie vorher. :(
Weiss einer, was an meinen convert_sig_byte und/oder convert_sig_String Methoden falsch ist?
convert_sig_byte codiert das byte array in einen base64 string und entfernt mittels PatternMatching alle \n.
und convert_sig_String macht das gleiche genau umgekehrt.
package de.freakbu.tool;
import java.io.*;
import java.security.*;
import java.security.spec.*;
import sun.misc.*;
public class sigtool {
public static void generate(String filename) {
try {
KeyPairGenerator keyGen = KeyPairGenerator
.getInstance("DSA", "SUN");
SecureRandom random = SecureRandom.getInstance("SHA1PRNG", "SUN");
keyGen.initialize(1024, random);
byte seed[] = random.generateSeed(20);
random.setSeed(seed);
KeyPair pair = keyGen.generateKeyPair();
PrivateKey priv = pair.getPrivate();
PublicKey pub = pair.getPublic();
byte[] pubKey = pub.getEncoded();
FileOutputStream keyfos = new FileOutputStream(filename + ".pub");
keyfos.write(pubKey);
keyfos.close();
byte[] privKey = priv.getEncoded();
FileOutputStream keyfos2 = new FileOutputStream(filename + ".priv");
keyfos2.write(privKey);
keyfos2.close();
} catch (Exception e) {
System.err.println("Exception: " + e.toString());
System.exit(1);
}
}
public static boolean verify_msg(String txt, String pubkey, byte signature[]) {
boolean wahr = false;
try {
byte[] encKey = convert_sig_byte(pubkey);
X509EncodedKeySpec pubKeySpec = new X509EncodedKeySpec(encKey);
KeyFactory keyFactory = KeyFactory.getInstance("DSA", "SUN");
PublicKey myPubKey = keyFactory.generatePublic(pubKeySpec);
Signature sigDecoded = Signature.getInstance("SHA1withDSA", "SUN");
sigDecoded.initVerify(myPubKey);
String sigToCompare = txt;
sigDecoded.update(sigToCompare.getBytes());
boolean ver = sigDecoded.verify(signature);
wahr = ver;
} catch (SignatureException g) {
System.err.println("Exception: " + g.toString());
System.exit(1);
} catch (InvalidKeyException f) {
System.err.println("Exception: " + f.toString());
System.exit(1);
} catch (NoSuchProviderException e) {
System.err.println("Exception: " + e.toString());
System.exit(1);
} catch (InvalidKeySpecException d) {
System.err.println("Exception: " + d.toString());
System.exit(1);
} catch (NoSuchAlgorithmException c) {
System.err.println("Exception: " + c.toString());
System.exit(1);
}
return wahr;
}
public static byte[] create_msg_sig(String message, String privkey) {
byte signature[] = null;
try {
byte[] encKey = convert_sig_byte(privkey);
PKCS8EncodedKeySpec privKeySpec = new PKCS8EncodedKeySpec(encKey);
KeyFactory keyFactory = KeyFactory.getInstance("DSA");
PrivateKey myPrivKey = keyFactory.generatePrivate(privKeySpec);
Signature sig = Signature.getInstance("SHA1withDSA", "SUN");
sig.initSign(myPrivKey);
String sigString = message;
sig.update(sigString.getBytes());
signature = sig.sign();
} catch (SignatureException g) {
System.err.println("Exception: " + g.toString());
System.exit(1);
} catch (InvalidKeyException f) {
System.err.println("Exception: " + f.toString());
System.exit(1);
} catch (NoSuchProviderException e) {
System.err.println("Exception: " + e.toString());
System.exit(1);
} catch (InvalidKeySpecException d) {
System.err.println("Exception: " + d.toString());
System.exit(1);
} catch (NoSuchAlgorithmException c) {
System.err.println("Exception: " + c.toString());
System.exit(1);
}
return signature;
}
public static byte[] convert_sig_byte(String text) {
byte foo[] = null;
try {
String g = insertnewlines(text);
foo = new BASE64Decoder().decodeBuffer(text);
} catch (IOException a) {
System.err.println("error:" + a.toString());
System.exit(1);
}
return foo;
}
public static String convert_sig_String(byte text[]) {
String foo = null;
foo = new BASE64Encoder().encode(text);
Pattern p = Pattern.compile("\n");
Matcher m = p.matcher(foo);
String mungedString = m.replaceAll("");
return mungedString;
}
public static String insertnewlines(String text) {
String foo = null;
int ll = 76;
int newcounter = 0, zeichen = 0, mal = 0;
zeichen = text.length() - (text.length() % ll);
mal = (zeichen / ll);
zeichen = text.length() + mal;
char neuertext[] = new char[zeichen];
char altertext[] = text.toCharArray();
neuertext[0] = altertext[0];
for(int i = 1; i < text.length(); i++) {
if( (i % (ll-1)) == 0 ) {
neuertext[newcounter] = '\n';
newcounter++;
}
neuertext[newcounter] = altertext[i];
newcounter++;
}
foo = neuertext.toString();
return foo;
}
}
Da sowas durchaus interessant ist, hab ich mal noch create_msg und verify_msg dabei gelassen. fuer mein problem sind allerdings nur die convert* methoden relevant.
Ich hoff mal mir kann einer helfen :(