我正在尝试使用Base64编码实现RSA加密。顺序是:
String -> RSA encrypt -> Base64 encoder -> network -> Base64 decoder* -> RSA decrypt > String
我正在通过网络发送base64编码的字符串,并在所有Base64是文本之后将其作为字符串读取,对吧?
现在有些原因当我解码Base64时,我得到的字节数比我最初发送的字节数多。
在发送方,我的RSA字符串是512字节。在Base64编码后,其长度为1248(每次都会变化)。 在接收器端,我的Base64编码接收字符串仍然是1248长,但当我解码它然后我突然得到936字节。然后我无法使用RSA解密它,因为ciper.doFinal方法挂起。
我假设这有一些字节到unicode字符串转换,但我无法弄清楚这发生在哪一步以及如何解决它。
发件人方码:
cipher = Cipher.getInstance("RSA/NONE/OAEPWithSHA256AndMGF1Padding");
cipher.init(Cipher.ENCRYPT_MODE, getPublicKey());
byte[] base64byes = loginMessage.getBytes();
byte[] cipherData = cipher.doFinal(base64byes);
System.out.println("RSA: " + cipherData.length); //is 512 long
//4. Send to scheduler
Base64PrintWriter base64encoder = new Base64PrintWriter(out);
base64encoder.writeln(new String(cipherData)); //send string is 1248 long
base64encoder.flush();
接收方代码:
System.out.println("Base 64: " + encodedChallenge.length()); //1248 long
byte[] base64Message = encodedChallenge.getBytes();
byte[] rsaEncodedMessage = Base64.decode(base64Message);
System.out.println("RSA: " + rsaEncodedMessage.length); //936 long
cipher = Cipher.getInstance("RSA/NONE/OAEPWithSHA256AndMGF1Padding");
cipher.init(Cipher.DECRYPT_MODE, privateKey);
cipherData = cipher.doFinal(rsaEncodedMessage); //hangs up
System.out.println("Ciper: " + new String(cipherData));
P.S。 Base64PrintWriter是一个PrintWriter,我把它装饰成在写出之前将每个输出转换为base64。
答案 0 :(得分:3)
您的编码有问题。使用基数64而不是基数256意味着需要增加8位/ 6位或1/3类似地解码导致下降1/4,例如1248 * 6/8 = 936
问题似乎是您在编码之前将8位数据转换为16位字符串。这需要512 * 16/6字节= ~1365。
你需要一个Base64流,它取字节而不是字符串。
也许你需要使用Base64.encode()?