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的倍数,这样就不会有问题