简单实现 rsa

rsa 1024 编码 最长是127 ,只能少。 不足会自动填0,数据要合理分割 。解码是128

坑:
字符串在未编码时,不管是字节转字符串 还是 字符串 转字节 ,怎么转都没毛病。
如果 编码了,字节就不能转 字符串了,一直就字节传递。 只有解码后 才能转。

import javax.crypto.Cipher;
import java.io.ByteArrayOutputStream;
import java.security.*;

public class Test {
    static int sl=117;
    static int sll=128;

    static  String str="dsafhjksdfhasdjflkasdfj;lasdfjasdjf;laksdjf;laksjdflk;asjdl;fajs;ldfj;kkasldjfl;asdjf;lkasdjfl;kasdjflk;asjdklgjfklsadjflka;sjdf;lkasdfjl;asjdgk;laskdlfkjasdlkfjlasjdflk;sajldkf;asjk;ldfjaskl;dfj";
    public static void main(String[] args) throws Exception {

        KeyPairGenerator keyPairGenerator = KeyPairGenerator.getInstance("RSA");
        keyPairGenerator.initialize(1024);
        KeyPair keyPair = keyPairGenerator.generateKeyPair();
        Key publicKey = keyPair.getPublic();
        Key privateKey = keyPair.getPrivate();
        byte[] encode = encode(publicKey, str.getBytes());

        System.out.println(new String(decode(privateKey, encode)));

    }
   static   byte[] encode(Key publicKey,byte[] bytes) throws Exception {
       Cipher cipher = Cipher.getInstance("RSA");
       cipher.init(Cipher.ENCRYPT_MODE, publicKey);
       ByteArrayOutputStream byteArrayOutputStream=new ByteArrayOutputStream();
       byte[] block={};

       int j=bytes.length/(sl);
       if((sl)*j<bytes.length)
           j++;
       for (int i = 0; i <j ; i ++) {
           byte[] doFinal=null;
           if(i!=j-1)
               doFinal = cipher.doFinal(bytes,i*(sl),sl);
           else
               doFinal = cipher.doFinal(bytes,i*(sl),bytes.length-i*(sl));
           byteArrayOutputStream.write(doFinal);
       }

       return  byteArrayOutputStream.toByteArray();
    }

   static   byte[] decode(Key privateKey,byte[] bytes) throws Exception {
        Cipher cipher = Cipher.getInstance("RSA");
        cipher.init(Cipher.DECRYPT_MODE, privateKey);

        ByteArrayOutputStream byteArrayOutputStream=new ByteArrayOutputStream();
        byte[] block={};

       int j=bytes.length/(sll);
       if((sll)*j<bytes.length)
           j++;
       for (int i = 0; i <j ; i ++) {
           byte[] doFinal=null;
           if(i!=j-1)
               doFinal = cipher.doFinal(bytes,i*(sll),sll);
           else
               doFinal = cipher.doFinal(bytes,i*(sll),bytes.length-i*(sll));
           byteArrayOutputStream.write(doFinal);
       }

       return  byteArrayOutputStream.toByteArray();
    }
}

值得注意的是 ,解密的数据一定是128的倍数 ,如果解密 报错 ,是 长度 不是128。
为什么说注意这个问题。
如果有两个socket ,一个 加密写,一个解密读。 由于网络原因 ,读取的字节并不一定是128的倍数 ,这时候 ,你需要 保存 不完整的字节 。因为数据最终一定是 128的倍数,这样就不会有问题

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值