Цитата(jk1 @ 4.11.2010, 09:24) | Цитата | есть еще варианты?)
|
На основании приведенного нет. Вы не могли бы запостить несколько классов целиком, чтобы я мог воспроизвести проблему? Особенно интересуют классы ECP и Message. |
да, без проблем.
ECP
Код | package testrsa;
import java.io.UnsupportedEncodingException; import java.security.InvalidKeyException; import java.security.Key; import java.security.KeyPair; import java.security.KeyPairGenerator; import java.security.MessageDigest; import java.security.NoSuchAlgorithmException; import java.util.Arrays; import java.util.logging.Level; import java.util.logging.Logger; import javax.crypto.BadPaddingException; import javax.crypto.Cipher; import javax.crypto.IllegalBlockSizeException; import javax.crypto.NoSuchPaddingException;
public class ECP { private static Key publicKey = null; private static Key privateKey = null; private static final int sizeKeys = 1024;
public ECP() {
}
static { KeyPairGenerator kpg; try { kpg = KeyPairGenerator.getInstance("RSA"); kpg.initialize(sizeKeys); KeyPair kp = kpg.genKeyPair(); publicKey = kp.getPublic(); privateKey = kp.getPrivate(); } catch (NoSuchAlgorithmException ex) { System.out.println(ex.getMessage()); } }
public static Message signMessage(Message message) { try { if(publicKey == null || privateKey == null) return null;
MessageDigest md = MessageDigest.getInstance("MD5");
md.update(message.getDataBytes()); byte[] hash = md.digest();
System.out.println("encode"); System.out.println(publicKey.toString()); System.out.println(privateKey.toString()); byte[] sign = encrypt(hash);
String signStr = Base64.encodeToString(sign, false); message.setLengthSign(signStr.length()); message.addSignToMessage(signStr);
byte[] decrypt; decrypt = decrypt(Base64.decode(message.getSign()));
System.out.println(Arrays.toString(decrypt));
//message.addSignTest(sign);
return message; } catch (NoSuchAlgorithmException ex) { System.out.println(ex.getMessage()); return null; } }
public static boolean verify(Message message) { try { if(publicKey == null || privateKey == null) return false; if(!message.isIsSign()) return false; MessageDigest md = MessageDigest.getInstance("MD5");
String data = message.getMessage();
System.out.println("decode"); System.out.println(publicKey.toString()); System.out.println(privateKey.toString()); byte[] decrypt; decrypt = decrypt(Base64.decode(message.getSign()));
md.update(data.getBytes());
byte[] hash = md.digest();
System.out.println("Verify:"); System.out.println(Arrays.toString(decrypt)); System.out.println(Arrays.toString(hash));
return Arrays.equals(decrypt, hash); } catch (NoSuchAlgorithmException ex) { System.out.println(ex.getMessage()); return false; } }
private static byte[] encrypt(byte[] data) { Cipher cipher; byte[] cipherData = null; try { cipher = Cipher.getInstance("RSA"); cipher.init(Cipher.ENCRYPT_MODE, privateKey); cipherData = cipher.doFinal(data); } catch (NoSuchAlgorithmException ex) { System.err.println(ex.getMessage()); } catch (NoSuchPaddingException ex) { System.err.println(ex.getMessage()); } catch (InvalidKeyException ex) { System.err.println(ex.getMessage()); } catch (IllegalBlockSizeException ex) { System.err.println(ex.getMessage()); } catch (BadPaddingException ex) { System.err.println(ex.getMessage()); } finally { return cipherData; }
}
private static byte[] decrypt(byte[] data) { Cipher cipher; byte[] cipherData = null; try { cipher = Cipher.getInstance("RSA"); cipher.init(Cipher.DECRYPT_MODE, publicKey); cipherData = cipher.doFinal(data); } catch (NoSuchAlgorithmException ex) { System.err.println(ex.getMessage()); } catch (NoSuchPaddingException ex) { System.err.println(ex.getMessage()); } catch (InvalidKeyException ex) { System.err.println(ex.getMessage()); } catch (IllegalBlockSizeException ex) { System.err.println(ex.getMessage()); } catch (BadPaddingException ex) { System.err.println(ex.getMessage()); } finally { return cipherData; }
} }
|
Message
Код | package testrsa;
public class Message { private String message; private boolean isSign = false; private int lengthSign = 0; private byte[] signTest;
public Message(String message) { this.message = message; }
public boolean isIsSign() { return isSign; }
public void setIsSign(boolean isSign) { this.isSign = isSign; }
public int getLengthSign() { return lengthSign; }
public void setLengthSign(int lengthSign) { this.lengthSign = lengthSign; }
public String getMessage() { return message; }
public void setMessage(String message) { this.message = message; }
public byte[] getDataBytes() { return this.message.getBytes(); }
public void addSignToMessage(String sign) { this.message += sign; this.setIsSign(true); }
public String getSign() { if(this.isSign) { return this.message.substring(this.message.length() - this.lengthSign); } else { return null; } }
public String getData() { if(this.isSign) { return this.message.substring(0 , this.message.length() - this.lengthSign); } else { return null; } }
public void addSignTest(byte[] sign) { this.signTest = sign; this.setIsSign(true); }
public byte[] getSignTest() { return this.signTest; }
}
|
|