Добрый вечер, я немного запуталась, мне нужно с помощью ключа шифровать строки. Не подскажите, что-то , наверное, с типами напутала. Не могу получить исходную строку. Класс, CipherWrapper, который берет на себя всю работу
| Код | import java.security.*; import java.security.spec.InvalidKeySpecException; import java.security.spec.X509EncodedKeySpec; import javax.crypto.Cipher; import controlunit.control.Base64Coder;
public class CipherWrapper { private PrivateKey privateKey = null; private PublicKey publicKey = null; private Cipher cipher = null; /** Creates a new instance of CipherWrapepr */ public CipherWrapper() { try { java.security.Security.addProvider(new com.sun.crypto.provider.SunJCE()); KeyPairGenerator keyGen = KeyPairGenerator.getInstance("RSA"); keyGen.initialize(1024); KeyPair keypair = keyGen.genKeyPair(); privateKey = keypair.getPrivate(); publicKey = keypair.getPublic(); System.out.println(publicKey.toString()); cipher = Cipher.getInstance("RSA/ECB/NoPadding");
} catch (java.security.NoSuchAlgorithmException e){ e.printStackTrace(); }catch (javax.crypto.NoSuchPaddingException e){ e.printStackTrace(); } } public PublicKey getPublicKey(){ return this.publicKey; } //100 bytes block encryption public String encryptData(String plain, PublicKey pk){ //data encryption goes here String encr=""; byte[] result=null; try{ cipher.init(Cipher.ENCRYPT_MODE, pk); byte[] data = plain.getBytes(); int block_count = data.length/100; int rest = data.length%100; for(int i=0;i<block_count;i++){ byte[] buffer = new byte[100]; for(int j=0;j<100;j++) buffer[j] = data[j+100*i]; result = cipher.doFinal(buffer); char[] ch = Base64Coder.encode(result); encr += String.valueOf(ch); } byte[] buffer = new byte[rest]; for(int i=0;i<rest;i++) buffer[i] = data[i+100*block_count]; result = cipher.doFinal(buffer); char[] ch = Base64Coder.encode(result); encr += String.valueOf(ch); } catch (javax.crypto.IllegalBlockSizeException e){ e.printStackTrace(); } catch (javax.crypto.BadPaddingException e){ e.printStackTrace(); } catch (java.security.InvalidKeyException e){ e.printStackTrace(); } return encr; } //decryption goes with block size 128 public String decryptData( byte[] data){ String result = ""; try{ int block_count = data.length/128; int rest = data.length%128; cipher.init(Cipher.DECRYPT_MODE,privateKey); for(int i=0;i<block_count;i++){ byte[] buffer = new byte[128]; for(int j=0;j<128;j++) buffer[j] = data[j+128*i]; byte[] original = cipher.doFinal(buffer); result += new String(original,"ASCII"); } byte[] buffer = new byte[rest]; for(int j=0;j<rest;j++) buffer[j] = data[128*block_count+j]; byte[] original = cipher.doFinal(buffer); result = new String(original,"ASCII"); } catch (javax.crypto.IllegalBlockSizeException e){ e.printStackTrace(); } catch (javax.crypto.BadPaddingException e){ e.printStackTrace(); } catch (java.security.InvalidKeyException e){ e.printStackTrace(); } catch (java.io.UnsupportedEncodingException e){ e.printStackTrace(); } return result; } public String PublicKey2String (PublicKey pk){ String key=""; byte[] kbytes = this.getPublicKey().getEncoded(); char[] ch = Base64Coder.encode(kbytes); key = String.valueOf(ch); return key; } public PublicKey String2PublicKey(String key){ byte[] kbytes = Base64Coder.decode(key); java.security.PublicKey pubKey = null; try{ KeyFactory kf = KeyFactory.getInstance("RSA"); pubKey = kf.generatePublic(new X509EncodedKeySpec(kbytes)); }catch(NoSuchAlgorithmException ex){ ex.printStackTrace(); }catch(InvalidKeySpecException ex){ ex.printStackTrace(); } return pubKey; } }
|
а тут я применяю данный класс
| Код | public class test { /** Creates a new instance of test */ public test() { } public static void main(String[] args) { String s ="Shla sasha po shosse i sosala syshky" ; String e = cp.encryptData(s,cp.getPublicKey()); int c = e.getBytes().length;
String d = cp.decryptData(e.getBytes()); System.out.println(d); } }
|
результат несколько отличается от исходного, не подскажите?
|